TFT uDisp320240. Часть 3

Ну какой же дисплей без вывода текста? Соответственно логическим продолжением моих исследований явилась разработка библиотеки для вывода текста. Принцип вывода необходимых символов следующий. Из точек дисплея формируем матрицу 8 х 8. Отмечу, что точка может состоять из одного — 1х1 пиксель, четырёх — 2х2 пикселя, девяти — 3х3 пикселя и т.д. NxN пикселей. Для того, чтобы не изобретать велосипед, я воспользовался таблицей символов ANSI. Каждый символ формируем в матрице следующим образом. Подсвечиваемым точкам символа соответствует лог.1, точкам фона — лог.0. Из рисунка ниже, я думаю, всё становиться понятно.
Рисунок по точкам                            Двоичная кодировка                         16-тиричная
Таким образом код символа займёт в памяти микроконтроллера 8 байт. Посидев пару часов с карандашом в руках, я закодировал половину таблицы ANSI, т.е. левую её часть с символами и латинским шрифтом. Впоследствии докодирую и правую часть с русским шрифтом. А вообще подобным образом можно нарисовать какие вам угодно символы или знаки. Поскольку в качестве управляющего микроконтроллера я использую ATtiny2313, объём его памяти заставил меня расположить таблицу кодировки символов во флеше, т.к. ОЗУ очень мало. Для данной статьи я разработал три основных функции: — непосредственно вывода одного символа; — вывода всех символов на экран, для их контроля и вообще наглядного обозрения; — вывода строки на экран, причём используя стандартную ANSI — кодировку (т.е. не придётся для каждого символа считать его адрес в массиве таблицы кодировки).  Листинг смотрим в исходнике, внимательно читаем комментарии и пытаемся разобраться.
Вывод одного символа понятен из верхнего рисунка. В видеоОЗУ по заданным координатам записываются точки  заданного цвета символа, если перебираемый бит байта строки равен лог.1, и точки заданного цвета фона, если этот бит равен лог. 0.
Теперь вывод всех символов на экран. Изменяя  входные параметры функции можно наблюдать символы различных размеров, цветов и на различном фоне. В функции предусмотрен автоперенос в зависимости от размера символов. Кстати я ещё предусмотрел автоограничение размера символа — не более 5-ти, хотя вы все эти параметры можете изменить в зависимости от поставленных задач.

Так выглядят символы размера 1 чёрного цвета на белом фоне:

Здесь размер 2 красного цвета на жёлтом фоне:


А вот 3-й размер символов синего цвета на фиолетовом фоне:

И наконец символы 4-го размера белые на чёрном фоне (рука бойца колоть устала — дрожит 🙂 )

Напоследок вывод строк на экран.

Поскольку объём флеш-памяти ATtiny2313 достаточно мал, для демонстрации всех вышеприведённых действий, некоторые функции приходится закомментировать в зависимости от задачи. Просмотрев исходник Вы это увидите.  При переносе кода на другой кристалл нужно заменить только функцию работы SPI и в разделе define перераспределить ноги.

P.S. Как видите, уважаемые, многие, кажущиеся сложными вещи, на самом деле вполне осязаемы.

Запись опубликована в рубрике Микроконтроллерный конструктор с метками , . Добавьте в закладки постоянную ссылку.

47 комментариев: TFT uDisp320240. Часть 3

  1. Konoplj2010 говорит:

    А вот в каком устройстве Вы видите этот дисплей?

  2. s_black говорит:

    Странный вопрос… Я читал ветку у DI HALTA, видел Ваши прения… Логичнее было бы сказать в каком устройстве я его не вижу. Почти все микроконтроллерные устройства — это диалоговые устройства, т.е. подразумевают ввод и вывод данных. Здесь же в одном узле и ввод и вывод (тачскрин и дисплей). Кроме осциллографа, анализатора спектра, логического анализатора, можно сделать мультимедийное устройство с функциями: — хранения и просмотра фотографий; -записной книжки; -планшета для рисования; -поддержки игр; -цифрового плеера; -GPS-навигатора; — мобильного телефона — это то, что потянет AVR. Если же применить ARM — список ещё расшириться.

  3. Konoplj2010 говорит:

    Извините за столь «Странный вопрос…», но я думаю «Ни слишком ли дорогое удовольствие для осилографа, логического анализатора и. т. д.». Я не против свего этого, просто я считаю что лично, я ещё не настоль хорошо освоился в мире цифровой техники чтобы приобритать дисплей типа TFT uDisp320240. И я пожалуй просто постою в стороне.

  4. s_black говорит:

    Конечно не дорогое. Подобные дисплеи сейчас можно приобрести за весьма разумную цену — дешевле, чем винстаровский WG12864. А разбираться с их работой нужно — время-то не стоит на месте!

  5. Konoplj2010 говорит:

    Ух тыш?! А где это Вы такой дешовый нашли? Скинте ссылку плиз. Я же купил WG12864 в Донецке за 145гр.

  6. s_black говорит:

    Навскидку здесь, даже плюс ко всему с держателем SD.В Украине здесь посмотри.

  7. avoodin говорит:

    Большое спасибо за статьи, очень помогли в разбирательстве

  8. s_black говорит:

    Рад, что смог Вам помочь )))

  9. avoodin говорит:

    ага, раз Вы на связи, подскажите, из-за чего при выводе всех символов получается эффект бегущего столбца (2-й по-счету)

  10. avoodin говорит:

    Вроде разобрался..

  11. s_black говорит:

    Извините, не сразу увидел вопрос…
    Хорошо, что уже разобрались )))

  12. s_black говорит:

    Обращение по регистрам R4Eh, R4Fh это я так понимаю запись точки.
    4E — установка адреса видеоОЗУ дисплея по Х, 4F — по У (стр 35 ДШ, табл.8-1)
    по регистрам R44h — начало и конец окна по вертикали; R45h — начало окна по горизонтали, R46h — конец окна по горизонтали (там же)

    То есть, если я захочу передать что-то типа «иконки», размером, например, 32х32 пикселя, то буду передавать ведь 32 цикла по 32 строки? а не 1024 точки. — можете иконку сделать по аналогии с символом — принцип абсолютно тот же

  13. Дмитрий говорит:

    Я имею в виду, вывод некого массива идет все равно «по точкам»? Или есть режим копирования области EEPROM в видеопамять экрана?

  14. s_black говорит:

    Так смысл-то один и тот же. Записывая в R22 (т.е. в видеоОЗУ дисплея) двухбайтное число, Вы «рисуете» точку на экране по адресу, который был перед этим установлен (см. комментарий выше). Цвет точки будет определяться значением записанного двухбайтного числа. При работе сразу со всем массивом видеоОЗУ, нужно контроллером во внешней памяти менять весь массив и потом перемещать его весь в видеоОЗУ дисплея — получиться растровый метод отображения, требующий очень высокого быстродействия контроллера. А можно изменять только область, где изображение меняется — получится функциональный метод отображения, который требует гораздо меньшего быстродействия. Его я Вам и предлагаю.

  15. Дмитрий говорит:

    То есть область изменений, все таки, с точки зрения внешнего контроллера — одна точка, двухбайтное число?
    Кстати, как выглядит кодировка цвета? 0RRRRRGG GGGBBBBB?

  16. s_black говорит:

    1. Да.
    2. В зависимости от интерфейса и настроек. табл. 15.3 стр. 80 ДШ

  17. Дмитрий говорит:

    Что значит в даташите All gate outputs become CGL?
    (раскуриваю Ваш исходник, инициализация дисплея, регистр 07, GON=1, DTE=0)

  18. s_black говорит:

    Ну, во-первых VGL, а точнее написать Vgl, как в таблице ниже строки, которую Вы читаете. Вот если бы туда посмотрели, то такого вопроса бы не задали ((( Дословно на русский Напряжение ворот низкое Voltage gate low. Дальнейшие сокращения, думаю, поймёте…
    Последовательность инициализации абсолютно чётко определена на странице 83 ДШ, менять её не нужно. Почему именно такие команды в ней задействованы — вопросы к разработчикам )))

  19. Дмитрий говорит:

    То есть эта настройка включает на выходах высокий или низкий уровень? В смысле либо все точки загорятся, либо все погаснут?

  20. Дмитрий говорит:

    А еще меня смутил вопрос внешнией обвязки… По даташиту куча конденсаторов впаивается… А еще меня очень смутила тиблица 6-3 на странице 28. Режим у нас SPI, в настройках указано 65к цвет… Какую впаивать настройку PS? 1110?

  21. s_black говорит:

    Это настройки выходов матрицы TFT, т.е. внутренних процессов. Не влазьте в дебри — для понимания принципа формирования отображения это не суть важно. Просто примите инициализирующую последовательность на веру.

  22. Дмитрий говорит:

    а по обвязке?

  23. s_black говорит:

    На дисплей нужно только подать питание и правильно присоединить информационные линии. Схема в 1-й части.

  24. s_black говорит:

    Конденсаторы уже впаяны в дисплее. Ведь Вы читаете ДШ на КОНТРОЛЛЕР дисплея, а работаете с готовым дисплеем, т.е. уже с соответствующей обвязкой.
    Настройка SPI 4-wire установлена на дисплее по умолчанию — не перепаивайте перемычки PS3-0.

  25. Дмитрий говорит:

    Экран пришел, я развожу плату под контроллер (Выбрал ATMega32 + внешняя EEPROM). Вопрос такой: в этом дисплее 5 светодиодов и 2 кнопки — это чисто для нужд пользователя? Как хочу, так и использую?

  26. s_black говорит:

    Совершенно верно! А можете и не использовать.

  27. Дмитрий говорит:

    Может конечно сам недодумал, но тем не менее спрошу:
    Закодировал таблицу символов размером 744 байта.
    Контроллер — мега32.
    Как ее логичнее забить в контроллер? Я вот думаю, если заложить в EEPROM (его тут килобайт, как-никак), а когда мне нужно будет выводить на экран — через временную переменную читать и выводить. А скорости EEPROM хватит?
    или просто в оперативку занести, как массив const char?

  28. s_black говорит:

    Тут и думать нечего — конечно же в флеш.

  29. Дмитрий говорит:

    гм. То есть EEPROM используется обычно исключительно как хранилище данных, которые возникают или изменяются в процессе работы? А все константы писать в флеш (это тот, который SRAM)?

  30. Дмитрий говорит:

    Подскажите пожалуйста, линия выбора устройства CS — устройство включено при подаче лог 1?

  31. s_black говорит:

    Не могу вспомнить ни одно устройство, в котором вывод Chip Select управляется 1… Нулём, конечно!

  32. Дмитрий говорит:

    Проблема!
    Начал паять, обнаружил (фактически методом тыка) что внутри экрана замкнуты 3v3 и GND, в разъеме SPI звонятся напрямую ноги 4, 13 и 14… Это потому что что-то недоприцеплено или?..
    Выпрямитель 3v3 успел спасти методом резкого выдергивания.

  33. s_black говорит:

    Трудно ответить на вопрос не имея на руках вашего экземпляра дисплея… Если вы не ошибаетесь, то бракованный дисплей.

  34. Дмитрий говорит:

    Тяжело ошибаться при замере сопротивления между VCC и GND…

  35. s_black говорит:

    А полярность щупов меняли?

  36. Дмитрий говорит:

    Ой блииииннн…. Все вопрос снят, экран жив, рукожопие во все поля. При припайке разъема светиков на экран не заметиль маааленькую соплю..
    Подскажите пожалуйста по режиму: режим 4 WIRE SPI (1111) это когда джамперы НЕ ЗАПАЯНЫ? как с завода?

  37. s_black говорит:

    Да, не перепаивайте их — с завода идёт 4Wire SPI.

  38. Дмитрий говорит:

    Подскажите пожалуйста. Светодиоды на экране — если ими управлять при помощи 5-вольтового согнала с ноги, они выдержат?
    То есть, если я подам 0 то они загорятся (они же другой стороной к 3v3 прицеплены), а если подам 5-вольтовую единицу? или обязательно через делитель?

  39. s_black говорит:

    На разъём от светодиодов выведены катоды, а аноды через ограничительные резисторы 510 Ом подключены на +3,3 В. Какой «единицей» вы хотите ими управлять?

  40. Дмитрий говорит:

    ну я имею в виду на ноге микросхемы же либо 0 либо 5 вольт. Если 0 то загорится светик, а если 5 вольт? ну то есть понятно что не загорится, а ему ничего не будет?

  41. s_black говорит:

    На светодиоде будет обратное напряжение 5В-3,3В=1,7В. Такое обратное напряжение светодиоды выдержат.

  42. Дмитрий говорит:

    Здравствуйте.
    Начал работу с экраном. При включении горит белым весь, подаю набор команд инициализации, затем набор команд DisplayHome, затем вывод цвета — и ничего. Подскажите пожалуйста, как понять, инициализация прошла или нет?

  43. Дмитрий говорит:

    Зашил ваш исходник для 2313, собрал макетку… Ничего, белый экран. Поврежден экран?

  44. s_black говорит:

    Почти стопроцентно уверен, что проблема в монтаже — проверяйте ещё раз.

  45. Дмитрий говорит:

    А вообще, что он должен показывать при подаче питания? А при прохождении инициализации?

  46. s_black говорит:

    После подачи питания экран должен засветиться белым. После инициализации и подачи изображения — высветится поданное изображение.

  47. Игорь говорит:

    Чтобы не сидеть с «карандашиком» кодируя символы, я набросал небольшой алгоритм в Exell — там все просто. Нужные точки в матрице 8х8 отмечаем единичками (или вообще любыми символами), а не нужные не отмечаем. Полученный код просто копи-паститься в редактор разработки.
    Может кому пригодится.

    Ссылка на файл:
    https://yadi.sk/d/7AWxj2UdjTew8

Добавить комментарий

Ваш e-mail не будет опубликован.