Например TDA7294

РадиоКот >Статьи >

Вывод данных на цветной дисплей 128*128 на базе ST7735

Автор: rozorh
Опубликовано 14.03.2017.
Создано при помощи КотоРед.

Доброго времени суток, уважаемые коты, кошечки и котята!

Данная статья написана в формате ранее опубликованной статьи про OLED дисплей 128х64 на SSD1306 с управлением по I2C, только посвящена другому, как ни странно, более дешёвому, но, при всём при том, полноценно цветному noname дисплею. На незабвенном Ali он ищется по кейворду TFT 1.44" 1.44inch SPI Serial Module LCD Colorful Display Panel 128*128 и выглядит как-то так:

 

 

 

 

 

 

 

 

Как видно по надписям на фото, его экран имеет разрешение 128*128 точек, а на сайте продавца указано, что он построен на базе контроллера ST7735 от SITRONIX.

Оговорюсь, что, как и в предыдущем случае, целью данной статьи является, прежде всего, описание основных приёмов работы с этим дисплеем посредством AVR микроконтроллера: инициализация и вывод информации, посему не выкладываю никаких библиотек не из вредности характера, а потому, что просто не создавал их за полной для себя ненадобностью, за что заранее прошу у всех прощения.

Тем не менее, в приложении к статье вы можете скачать пример с подробно прокомментированным исходником по выводу вот такой цветной картинки, взятой из РадиоКототеки (надеюсь, автор фото не обидится):

 

 

 

 

 

 

 

 

 

 

 

 

Итак, приступим.

Управление дисплеем ведётся посредством SPI в режиме «0», т.е. считывание информации, передаваемой в дисплей, происходит при переходе уровня тактового сигнала от низкого к высокому:

 

 

 

 

 

 

 

 

 

При этом информация, передающаяся в дисплей, может интерпретироваться им, как команда, либо как параметр команды, либо как данные для вывода на экран. Замечу, что в качестве команды здесь принимается байт, младший бит которого передан при низком уровне на ножке А0 (линия D/CX), а в качестве параметра или данных – байт, младший бит которого передан при высоком уровне на этой ножке.

В моём случае этот алгоритм реализован программно, при этом сама Мега работает от внутреннего тактового генератора на 8 МГц.

Схема подключения примитивная:

 

 

 

 

 

 

 

 

 

 

 

Печатка не разрабатывалась, т.к. все подключения выполнял на макетке. В ходе экспериментов с дисплеем пробовал тактировать Мегу и от внешнего кварца на 16 МГц – проблем не наблюдалось. Вообще повышение частоты тактового генератора контроллера имеет смысл, т.к. это напрямую влияет на скорость вывода информации на экран. При 8 МГц его полная заливка занимает около 2-х секунд.

После выполнения всех подключений и подачи питания дисплей нуждается в инициализации. Минимальный “джентльменский” набор для этого состоит из трёх команд: SWRESET (0x01), SLPOUT (0x11) и DISPON (0x29).

Первая команда выполняет программный reset, вторая выводит чип из режима sleep, третья включает вывод информации на экран. После первой и второй команд обязательна пауза в 120ms. Если всё сделано верно, то после DISPON на экране должно появиться «звёздное небо», что косвенно свидетельствует о верно выбранном направлении для приложения усилий ))

Помимо описанного “джентльменского” набора в раздел инициализации я включаю ещё пару дополнительных команд индивидуальной настройки: COLMOD (0х3A) и MADCTL (0x36).

Передав первую команду и соответствующий ей байт с параметрами, мы можем изменить, так называемую, глубину цветопередачи, что позволит повлиять как на качество выводимого изображения, так и на объём кода, необходимого для его создания.

Дело в том, что после включения питания и начальной инициализации командами из “джентльменского” набора наш дисплей переходит в режим максимально качественной отрисовки, позволяя выводить более 262 000 цветовых оттенков! С одной стороны, это круто, с другой – требует огромных затрат памяти, т.к. на кодировку цвета одного пикселя (!) нам потребуется три байта! Помножьте 128 на 128 и ещё на 3, и получится, что для отрисовки одного единственного экрана (не путать с заливкой/очисткой, там всё проще) нам необходимо 49К SRAM!

Применив команду COLMOD с параметром 0х05, мы уменьшаем глубину цветопередачи до 64 000 цветов, при этом на кодировку одного пикселя мы затратим уже не три байта, а два. В этом случае для отрисовки полного экрана нам потребуется уже 128*128*2=32К памяти – экономия, как говорится, налицо.

Прежде, чем описать назначение команды MADCTL слегка затрону сам процесс формирования цвета: считается, что для создания любого цветового оттенка достаточно смешения максимум трёх основных цветов – Красного, Зелёного и Синего (Red, Green, Blue – RGB).

 

 

 

 

 

 

 

 

 

После включения вышеописанного режима пропорция этого самого смешения кодируется посредством двух байтов следующим образом:

 

 

 

Старшие 5 бит 1-го байта отводятся на красный цвет, затем 3 младших бита этого же и ещё 3 старших бита второго байта на зелёный, и оставшиеся 5 младших битов второго байта – на синий.

Однако при работе с разными дисплеями и разными программами, использующимися для оцифровки изображения, мы можем получить код с инвертированным для данного вида дисплея представлением данных, как показано на рисунке ниже:

 

 

 

В этом случае при выводе на экран мы получим замену красного цвета на синий и наоборот. Для борьбы с такой инверсией нам будет достаточно либо изменить очерёдность передачи байтов и битов, т.е. сначала передавать второй байт кода цвета, а затем первый в последовательности от LSB к MSB, либо воспользоваться командой MADCTL. Применив эту команду с параметром 0x08 мы, передавая данные первоначальным способом, изменим очерёдность их вывода на программном уровне и получим правильную цветопередачу без особых хлопот с кодом.

Т.к. при работе с кодом, который компилит ConvertBMP (можно скачать в приложении) мой экран ведёт себя неподобающим образом, я выполняю эту команду с описанным параметром сразу при инициализации дисплея. В вашем случае, в зависимости от используемого конвертора и попавшего к вам дисплея, существует вероятность, что эта процедура окажется излишней.

Из оставшихся трёх (использованных мной, на самом деле их существенно больше) команд CASET (0x2A) и RASET (0x2B) задают верхнюю левую (X0, Y0) и нижнюю правую (X1, Y1) координаты области по оси Х (CASET) и по оси Y (RASET), в которую мы желаем попиксельно выводить информацию.

 

 

 

 

 

 

 

 

 

По умолчанию вывод осуществляется построчно сверху вниз слева направо с автоматическим приращением счётчика и «переносом каретки» на новую строку при достижении правой границы области вывода. За верх дисплея я условно принимаю его сторону, расположенную ближе к гребёнке подключения.

Команда RAMWR (0x2C) указывает контроллеру дисплея, что все данные, идущие после неё, нужно воспринимать, как байты кодировки цвета (не забываем про 2 байта на цвет одного пикселя), которые после преобразования выводятся поочерёдно в соответствующем месте области вывода.

Особенность задания координат X и Y заключаются в том, что наш контроллер ST7735 может управлять не только с 1,4’ дисплеями, но и дисплеями с большей диагональю. Соответственно, для унификации каждая координата кодируется двумя байтами данных, из которых, в нашем случае, первый байт всегда будет равным нулю, т.к. для задания координаты самого большого значения, достижимого в нашем экране (127), достаточно размера единственного (второго) байта.

В итоге, после компиляции и заливки прошивки, на экране дисплея мы получим вот такую картинку:

 

 

 

 

 

 

 

 

 

 

 

 

 

Фотография, сделанная телефоном, не способна передать реальное качество изображения, но, поверьте, вживую оно выглядит более, чем достойно ))

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

Для реализации такого незадокументированного способа мы воспользуемся редактором, который позволяет кодировать байт информации не сверху вниз, а горизонтально. Отличный вариант такого редактора – TheDotFactory (можно скачать в приложении). После поместим полученный код в память, а при выводе информации на экран будем применять следующую уловку: закрашивать пиксель, который должен быть видимым (бит=1), цветом, отличным от цвета фона, а пиксель, который видимым быть не должен (бит=0), цветом, совпадающим с цветом фона.

В итоге на экране можно получать всевозможные разноцветные надписи или картинки:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Исходник на С для поочерёдного вывода на экран обеих проиллюстрированных изображений вы можете скачать ниже.

И, вместо завершения, маленькое ИМХО, описывающее моё субъективное мнение о соотношении цена/качество/возможности данного дисплея: мне кажется, что в своём форм-факторе на сегодняшний день он является одним из лучших для применения в радиолюбительских (и не только) поделках.

 

Засим, всем спасибо за уделённое время и удачи, решившим повторить.

P.S. К сожалению у меня нет информации о времени наработки этого дисплея на отказ, так что все сделанные в ИМХЕ выводы – не более, чем мысли вслух ))


Файлы:
Исходник
ConvertBMP
TheDotFactory
Datasheet ST7735


Все вопросы в Форум.


Как вам эта статья?

Заработало ли это устройство у вас?

34 4 2