Обзор дисплея 128х160 точек с контроллером st7735

Обзор дисплея 128х160 точек с контроллером ST7735

Всем привет. Сегодня речь пойдет о дисплейном модуле который можно приобрести на просторах китайских (и не только) магазинов примерно за 200-300р. Выглядит он вот так:

Ну ничего особенного: плата, дисплей, разъем для SD карточки. Пройдемся по ТТХ данного модуля:

  • Разрешение: 128х160;
  • Количество цветов: 262000;
  • Режимы цветового пространства: RGB444, RGB565, RGB888;
  • Напряжение питания: 5В (можно подавать и 3,3В, если запаять перемычку возле стабилизатора на плате);
  • Интерфейс подключения: SPI + служебные входы;
  • Управляющий контроллер: ST7735;
  • Размер модуля: 58х34,5 мм;
  • Размер активной области дисплея: 35х28 мм;

Настало время попытаться что-нибудь вывести на экран. Подключать мы его будем к STM32F103. Для подключения требуется 5 выводов (вообще-то у ST7735 есть и параллельный интерфейс, но тут выведен лишь SPI): SDA (MOSI), SCK, CS, A0 (RS), RESET. Ну и питание с подсветкой. Я сразу закатал дисплей в то устройство, где он будет использоваться. Уж очень хотелось проверить, как он туда становится.

С управлением все просто. Все отправляемые на дисплей данные делятся на два типа: команды и данные. Выбор осуществляется при помощи вывода A0 (RS). Когда вывод в высоком уровне дисплей воспринимает получаемую информацию, как данные. В противном случае — как команды. Т.е. управление предельно простое, главное не забывать вовремя дергать выводы RS и CS. А прочтение даташита на управляющий контроллер показало, что система команд до безобразия простая. Серьезно. Из всех цветных дисплеев, прошедших через мои руки, у данного экземпляра самая простая инициализация. Требуется всего 6 команд:

Рассмотрим каждую из них подробнее:

  • 0x01 Программный сброс. При наличии аппаратного сброса команда необязательна;
  • 0x11 Выход из режима сна;
  • 0x3A Формат цифрового пространства. После команды передается 1 байт данных, в котором 3 первых бита используются для задания формата (011 — RGB444, 101 — RGB565, 110 — RGB666);
  • 0x36 Режим отрисовки данных из памяти дисплея. Проще говоря — ориентация. Работает аналогично предыдущей команде. Передается команда, а следом 1 байт данных, отвечающих за настройку.
  • 0xB1 Частота обновления дисплея. В принципе тоже необязательная команда, но без нее дисплей работает на минимальной частоте и видно мерцание. Здесь для настройки параметров используется целых 3 байта данных.
  • 0x29 Собственно, включение дисплея. Сразу после получения этой команды, дисплей должен залиться цветным шумом.

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

После этого, все отправленные по SPI данные будут интерпретироваться как графические и выводиться на экран. Действие команды прекращается после перевода линии CS в высокий уровень. При записи в память адрес автоматически инкрементируется.

Теперь можно попробовать вывести что-то осмысленное. Для этого понадобятся невероятно полезные команды адресации памяти при помощи которых можно задать окно для отрисовки. Грубо говоря, прямоугольник, за пределы которого не будет выходить адресация памяти. Это позволяет здорово экономить процессорное время, т.к. отпадает надобность указывать адрес каждой строки. Достаточно установить окно и отправить данные. С адресацией дисплей разберется сам. Для установки окна есть 2 команды:

Каждая координата имеет размерность 16 бит, но разрешение дисплея всего 160х128, поэтому старшую половину можно смело записывать нулями. Теперь у нас есть все, что требуется для вывода любого изображения. Осталось написать функции для отрисовки графических примитивов и шрифтов. Функция вывода текста оптимизирована для работы со шрифтами с сайта http://www.rinkydinkelectronics.com/r_fonts.php Все, что требуется — это скачать шрифт, закинуть его в проект и указать в параметре функции вывода его название. Очень, знаете ли, удобно.

Для вывода текста служит функция:

Тут все просто, указываем координаты начала строки, сам выводимый текст, цвет текста, цвет фона, размер пробела между символами и название шрифта. Получаем что-то вроде этого (тут у меня уже готовый интерфейс отрисован):

Яркости хватает с запасом.

Углы обзора у дисплея довольно неплохие, но, увы, только с двух сторон. Поэтому при установке дисплея в устройство необходимо продумать, как на него будут смотреть:

Можно вывести и картинку, для этого есть функция :

Указываем координаты начала вывода, ссылку на массив с изображением, ширину и высоту картинки. И вуаля:

Теперь о скорости работы. У STM32F103 SPI тактируется от 32 МГц максимум, что дает скорость передачи данных 16 МБит (в случае непрерывного потока). Т.е. 2 мегабайта в секунду, что позволяет очень быстро заполнить память дисплея (40Кб для RGB 565) В результате заливка происходит практически незаметно для глаза, а вывод текста и примитивов вообще шикарно. Если же подключить дисплей к тому же AVR МК, то все будет гораздо медленнее. Тактирование 8МГц при максимальной частоте ядра в 16МГц, что дает всего 4Мбит, а значит 500Кб в секудну. В реальности скорость будет еще ниже, т.к. непрерывно лить данные AVR не умеет. Т.е. заливка будет длиться что-то около 100мс. Хотя для того же текста скорости вполне хватит, если не пытаться зарисовать им сразу весь дисплей.

На этом, пожалуй, все. Дисплей понравился, неплохая яркость и цветопередача, простая настройка и подключение с использованием малого количества выводов МК. Самое то для всевозможных самоделок. Библиотеку для работы с дисплеем прикладываю. Передача данных не имеет привязки к конкретному МК. Для применения библиотеки с другим типом МК достаточно заменить наполнение функций Send_DAT, Send_DAT16, Send_CMD. Ну и небольшое видео напоследок.

Записки программиста

Осваиваем работу с цветными TFT-дисплеями на базе ST7735

Если зайти на eBay и ввести в поиске «ST7735», можно найти немало модулей с дисплеем на базе данного контроллера. Модули обычно бывают двух типов — с TFT-дисплеем диагональю 1.44″ и разрешением 128 x 128 пикселей, а также с диагональю 1.8″ и разрешением 128 x 160 пикселей. Последние в большинстве случаев также имеют и разъем для подключения SD-карт. Дисплеи позволят отображать 65536 цветов в палитре R5G6B5. Интересны данные модули тем, что будучи чуть-чуть дороже популярных 0.96-дюймовых OLED-экранчиков на базе SSD1306 предлагают существенно большие разрешение и диагональ, а также в

30 тысяч раз больше цветов.

Fun fact! Еще есть шилд для Arduino от Duinopeak с 1.8-дюймовым дисплеем, джойстиком и разъемом для SD-карт, а также шапка для Raspberry Pi от WaveShare с 1.44-дюймовым дисплеем, джойстиком и тремя кнопками . Однако цена этих модулей с учетом доставки относительно высока. Кроме того, на AliExpress доступны укороченные 0.96-дюймовые модули с разрешением 80 x 160.

Модули питаются от 3.3 В или 5 В, имеют подсветку (которая питается только от 3.3 В, благодаря чему ее легко случайно спалить!) и используют SPI-подобный протокол. Желающие посмотреть на конкретные единички и нолики протокола, могут воспользоваться Sigrok и соответствующим .sr файлом из репозитория sigrok-dumps. Также мной был написан простенький декодер протокола ST7735 для Sigrok, но на момент написания этих строк патч еще не был вмержен в основную ветку (UPD: как оказалось, на самом деле он уже вмержен, см раз и два).

В PulseView протокол выглядит как-то так:

Команды и данные передаются с помощью пинов SCLK и MOSI, с порядком бит msb-first, как в обычном SPI. Здесь байт B1 является кодом команды FRMCTR1, а байты 01, 2C и 2D — аргументами этой команды. Отличить аргументы от команды можно по пину DC (data or command), который имеет низкое напряжение для команд и высокое для данных. Также можно заметить, что CS (chip select) можно смело менять посреди передачи фрейма. Как и в традиционном SPI, чип выбран, когда напряжение на CS низкое. Наконец, пин RES позволяет сбросить состояние контроллера, подав на этот пин низкое напряжение.

Читайте также  Управление освещением в прихожей

Для получения приведенной выше картинки я использовал Arduino Uno и библиотеку для ST7735 от Adafruit. В версиях этой библиотеки старше 1.0.8 также вкорячили поддержку ST7789, с иерархиями классов, обмазкой всего макросами, и всяким таким. Из-за этого код библиотеки стал намного труднее для восприятия. Любопытно, что ST7789 не является слишком уж распространненым контроллером. Он похож на ST7735, но в виде модуля продается только в магазине Adafruit за сравнительно большие деньги. Модуль имеет разрешение 240 x 240 при диагонали 1.54″. В своих проектах я бы не стал использовать этот модуль из-за небольшой диагонали, высокой стоимости и завязки на одного производителя. А для изучения работы интересного мне ST7735 я использовал тэг 1.0.8 библиотеки.

Было решено спортировать библиотеку от Adafruit на STM32. Конечно, под STM32 нашлись и готовые библиотеки. Но, во-первых, использование готового кода — это скучно 🙂 Во-вторых, оно не приводит к появлению нормального понимания работы устройства. Наконец, в-третьих, библиотеки, которые мне удалось найти, были написаны хардкорными бородатыми эмбеддерами, привыкшими делать все напрямую через регистры и бинарные сдвиги. Не будучи хардкорным бородатым эмбеддером, я предпочитаю библиотеки без преждевременных оптимизаций, основанные на HAL, которые легче в поддержке и расширении.

Интерфейс библиотеки вышел следующим:

void init ( ) <
ST7735_Init ( ) ;
>

void loop ( ) <
// Check border
ST7735_FillScreen ( ST7735_BLACK ) ;

for ( int x = 0 ; x ST7735_WIDTH ; x ++ ) <
ST7735_DrawPixel ( x , 0 , ST7735_RED ) ;
ST7735_DrawPixel ( x , ST7735_HEIGHT — 1 , ST7735_RED ) ;
>

for ( int y = 0 ; y ST7735_HEIGHT ; y ++ ) <
ST7735_DrawPixel ( 0 , y , ST7735_RED ) ;
ST7735_DrawPixel ( ST7735_WIDTH — 1 , y , ST7735_RED ) ;
>

// Check fonts
ST7735_FillScreen ( ST7735_BLACK ) ;
ST7735_WriteString ( 0 , 0 , «Font_7x10» , Font_7x10 ,
ST7735_RED , ST7735_BLACK ) ;
ST7735_WriteString ( 0 , 3 * 10 , «Font_11x18» , Font_11x18 ,
ST7735_GREEN , ST7735_BLACK ) ;
ST7735_WriteString ( 0 , 3 * 10 + 3 * 18 , «Font_16x26» , Font_16x26 ,
ST7735_BLUE , ST7735_BLACK ) ;
HAL_Delay ( 2000 ) ;

// Check color inversion
ST7735_InvertColors ( true ) ;
HAL_Delay ( 2000 ) ;
ST7735_InvertColors ( false ) ;
HAL_Delay ( 2000 ) ;

// Display test image
ST7735_DrawImage ( 0 , 0 , ST7735_WIDTH , ST7735_HEIGHT ,
( uint16_t * ) test_img_128x128 ) ;
HAL_Delay ( 15000 ) ;
>

Пример вывода текста на дисплей с диагональю 1.44″:

Интересно, что если в случае SSD1306 можно было спокойно хранить всю картинку в памяти и каждый раз передавать ее дисплею целиком, то в случае с ST7735 этого уже так просто сделать нельзя. Тут и цвет 16-и битный, а не монохромный, да и разрешение в 2-2.5 раза выше. Чтобы хранить картинку в памяти микроконтроллера, понадобится 32 Кб для дисплея 128 x 128 и 40 Кб для дисплея 128 x 160. Тем временем, какой-нибудь STM32F103C8T6, используемый в Blue Pill, имеет всего 20 Кб RAM. Конечно, используемый в Nucleo-F411RE микроконтроллер STM32F411RET6 имеет уже 128 Кб RAM. Но мне хотелось бы, чтобы библиотека работала на любом микроконтроллере, и желательно без хаков типа использования 4-х битной палитры, уменьшения разрешения или использования индексированных цветов. Поэтому, в отличие от библиотеки для SSD1306, библиотека для ST7735 сразу отправляет все данные дисплею и ничего не хранит в памяти.

В первом приближении, это все, о чем я хотел сегодня рассказать. Желающие ознакомиться с полной версией кода к этой заметке могут найти его на GitHub. Код работает с дисплеями, имеющими разрешение 80 x 160, 128 x 128 и 128 x 160 пикселей, требуется лишь немного подправить файл st7735.h в соответствии с комментариями в нем. Наиболее же полную информацию о ST7735 вы найдете в даташите [PDF].

А доводилось ли вам использовать подобные модули, и если да, то в каких проектах?

Визуализация для микроконтроллера. Часть 2. TFT дисплей 1.8″ (128х160) на ST7735

• Размеры модуля: 35 мм х 57 мм х 7 мм.
• Разрешение: 128×160 пикселей.
• Цветность: 65 тысяч цветов в формате RGB 5-6-5.
• Напряжение питания: 3.3В – 5В.
• Протокол обмена данными: SPI.
• Встроенный разъём для SD-карты.

Рассмотрим модуль на ST7735 поближе и разберемся с программированием под него.

Содержание / Contents

  • 1 Назначение выводов модуля ST7735
  • 2 Протокол обмена данными
  • 3 Система команд
  • 4 Вывод изображения на дисплей ST7735
  • 5 О координатах и цвете ST7735
  • 6 Структура и содержание нашей библиотеки
  • 7 Файлы
  • 8 Где брать дисплеи для экспериментов?

↑ Назначение выводов модуля ST7735

↑ Протокол обмена данными

Функции обмена для ST7735 по содержанию абсолютно такие же, как и в случае с SSD1306:

Единственным отличием в протоколе обмена является то, что для записи параметров, следующих за командой, используется функция st7735_data () , а не st7735_command () :

↑ Система команд

Если, по причине отсутствия вывода MISO, отбросить из прилагаемого даташита команды чтения, то оставшиеся команды можно разбить на две группы:
1. Оперативные команды, которые используются постоянно. Их всего три — CASET (0×2A), RASET (0×2B), RAMWR (0×2C).
2. Команды настройки – все остальные команды, которые по большому счёту используются один раз – при инициализации модуля.

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

Столбцы, выделенные зелёным цветом, относятся к другим протоколам, поддерживаемым ST7735, поэтому можете их игнорировать.
Значение в столбце «D/CX» определяет, какую функцию нужно использовать для записи данных из соответствующей строки:
0 – st7735_command ();
1 – st7735_data ();

Столбцы D7-D0 – побитовая расшифровка команды или параметра.

Далее в таблице идут следующие графы:
Description – описание команды.

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

Default – значения регистров контроллера по сбросу/подаче питания. Здесь следует обратить внимание на то, что порядок установки значений при подаче питания для некоторых команд может быть случайным (Random в строке «Power On Sequence»), а значения в строках «S/W Reset» и «H/W Reset» могут отличаться, как уже говорилось выше.

Flow Chart – блок-схема применения команды. Графа, отвратившая меня от полного перевода таблиц.

Теперь непосредственно о командах.

CASET (2Ah) – установка начального (параметр XS) и конечного (параметр XE) адресов столбцов (иначе – координаты Х) в ОЗУ контроллера и, соответственно, на дисплее. В зависимости от ориентации дисплея значения параметров варьируются в диапазоне 0-127 (вертикальная ориентация) или 0-159 (горизонтальная ориентация) в десятичном исчислении. Длина параметров XS и XE — 16 бит, поэтому запись каждого производится в два приёма. Более подробно об использовании этой и двух последующих команд мы поговорим ниже.

RASET (2Bh) – установка начального (параметр YS) и конечного (параметр YE) адресов строк (иначе – координаты Y). Значения параметров — 0-159 (вертикальная ориентация) или 0-127 (горизонтальная ориентация) в десятичном исчислении. Длина параметров YS и YE — 16 бит, запись, как и в предыдущем случае, в два приёма.

RAMWR (2Ch) – команда записи данных в ОЗУ (вывода на дисплей). Эта команда появилась, поскольку, в отличие от SSD1306, в этом контроллере функция st7735_data () используется и для записи параметров команды, и для записи данных в RAM. Количество и значение параметров, записываемых после команды RAMWR, определяют, соответственно, количество и цвет активируемых на дисплее пикселей.

Читайте также  Жив или мёртв? проверяем радиодетали

NOP (00h) – пустая команда.

SWRESET (01h) – программный сброс.

SLPIN (10h) / SLPOUT (11h) – перевод в спящий режим и вывод из него узлов обслуживания дисплея – преобразователя напряжения, тактового генератора и др. По сбросу/подаче питания исполняется команда SLPIN, поэтому команда SLPOUT – обязательная при инициализации модуля.

PTLON (12h) / NORON (13h) – выбор рабочей области дисплея. Использование команды PTLON в комбинации с PTLAR (30h) активизирует только часть дисплея по высоте (остальная часть выключена). Эти команды, среди прочего, позволяют использовать контроллер ST7735 с дисплеями иной размерности. По сбросу/подаче питания включается полноэкранный режим (NORON) и именно его мы будем использовать.

INVOFF (20h) / INVON (21h) – выключение/включение инверсии дисплея.

GAMSET (26h) – выбор гаммы цветов.

DISPOFF (28h) / DISPON (29h) – выключение/включение дисплея. DISPON – ещё одна команда, которую нужно включать в процедуру инициализации, т.к. по сбросу/подаче питания дисплей отключается.

MADCTL (36h) – установка режима адресации и, соответственно, порядка вывода данных на дисплей. Говоря проще, эта команда определяет ориентацию изображения на экране. Кроме того, бит RGB параметра этой команды ответственен за распределение интенсивности между субпикселями (красным, зелёным и синим). Более подробно об это – чуть позже.

COLMOD (3Ah) – установка формата слова, определяющего цвет пикселя. С точки зрения кода эта команда определяет длину аргумента функции st7735_data () при записи данных в ОЗУ. Мы будем использовать 16-битный формат.

Группа команд с окончанием CTR (FRMCTR, PWCTR, GMCTRP и т.п.) –аппаратная настройка параметров модуля (кадровой частоты, напряжений питания, цветовой гаммы и т.д.).

↑ Вывод изображения на дисплей ST7735

После инициализации модуля для активизации на дисплее одного пикселя, к примеру, белого цвета и с координатами 64/80, достаточно следующего кода:

По исполнению вы получите точку прямо по центру экрана с вертикальной ориентацией.

↑ О координатах и цвете ST7735

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

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

Что касается цвета. Как уже говорилось выше мы будем использовать 16-битное значение цвета в формате RGB 5-6-5. Означает это следующее.
Каждый пиксель дисплея состоит из трёх субпикселей – красного (R — Red), зелёного (G — Green) и синего (B — Blue). 16 битов числа, определяющего цвет, распределяются между субпикселями – 5 бит для красного, 6 бит для зелёного и 5 бит для синего – и определяют интенсивность их свечения. Если мы отправим в ОЗУ число 0хF800 (1111100000000000 в двоичном исчислении)

то получим такое распределение интенсивностей:

красный – горит максимально ярко (все биты равны 1), а зелёный и синий выключены (все биты равны 0). На дисплее вы увидите точку красного цвета.
Таким образом, чтобы получить зелёный цвет, надо отправить число 0×07E0 (0000011111100000), а в случае синего – 0×001F (0000000000011111). Чёрный цвет достигается записью нулей во всех битах (число 0×0000), а белый – единиц (число 0хFFFF). Все остальные 65 с лишним тысяч цветов и оттенков (2^16 = 65536) располагаются в промежутках между вышеуказанными тремя. В файле st7735.h библиотеки определены следующие основные цвета:

Следует отметить, что приведённые числа верны для случая, когда бит RGB параметра команды MADCTL (36h) ровен 0. Если RGB = 1, то из ОЗУ на дисплей число будет выводиться в обратном порядке, т.е. записанное в модуль число 1111100000000000 (красный цвет) будет отображено на экране как 0000000000011111, и вы получите синий цвет.
Без изменения останутся, в силу симметричности их бинарного представления, лишь чёрный и белый цвета. Поэтому для этого варианта значения бита RGB необходимо вычислить и прописать соответствующие значения.

Как меняется ориентация изображения по пути от вашего МК к ОЗУ модуля (а значит — и к дисплею) в зависимости от состояния битов MV, MX и MY параметра команды MADCTL (36h), вы легко поймёте из следующего рисунка даташита:

↑ Структура и содержание нашей библиотеки

Библиотека состоит из 5 файлов следующего содержания:
1. main.c – подключение библиотек, инициализация модуля, закрашивание дисплея синим цветом и вывод на его центр точки жёлтого цвета.
2. spi.c – функции протокола SPI.
3. spi.h – назначение выводов МК, участвующих в протоколе SPI, включение/отключение аппаратного сброса.
4. st7735.с – код функций записи команд и данных, аппаратного и программного сброса, инициализации модуля, прорисовки точки и установки ориентации дисплея.
5. st7735.h – макроопределения размеров дисплея, используемых цветов, команд контроллера.

↑ Файлы

Даташит на st7735:
▼ st7735_datasheet.7z 1,64 Mb ⇣ 119

Архив библиотеки:
▼ st7735_kod.7z 1,72 Kb ⇣ 181

↑ Где брать дисплеи для экспериментов?

На этом вторая часть статьи завершена.
Спасибо за внимание!

Камрад, рассмотри датагорские рекомендации

Полезные и проверенные железяки, можно брать

Куплено и опробовано читателями или в лаборатории редакции.

Обзор дисплея 128х160 точек с контроллером st7735

‘ CS —> portb.0
‘ DC —> portb.1
‘ reset —> portb.2
‘ Mosi —> portb.3
‘ SCLK—>portb.5
‘ Lite —> +5V
Config Portb.0 = Output ‘Display CS
Config Portb.1 = Output ‘Display DC
Config Portb.2 = Output ‘Display reset
Lcd_cs Alias Portb.0
Lcd_dc Alias Portb.1
Lcd_reset Alias Portb.2
Portb.0 = 1
Config Spi = Soft , Dout = Portb.3 , Ss = None , Clock = Portb.5 ‘ Din = None ,
Spiinit
Declare Sub Lcd_init()
Declare Sub Lcd_command(byval Command As Byte)
Declare Sub Lcd_data(byval Da_ta As Byte)
Declare Sub Lcd_write_color(byval Color As Word)
Declare Sub Lcd_set_window(byval Xs As Byte , Byval Ys As Byte , Byval Xe As Byte , Byval Ye As Byte)
Declare Sub Lcd_set(byval Xs As Byte , Byval Ys As Byte)
Declare Sub Lcd_clear(byval Color As Word)
Declare Sub Lcd_set_pixel(byval X As Byte , Byval Y As Byte , Byval Color As Word)
Declare Sub Lcd_text(byval D3310string As String * 14 , Byval Xs As Byte , Byval Ys As Byte )
Const Transparent = &H1000
Const синий = &H001F
Const зеленый = &H07E0
Const красный = &HF800
Const белый = &HFFFF
Const серый = &H0000
Const черный = &H0000
‘use for demo
Dim Xx As Byte , Yy As Byte , Temp As Byte , Yy1 As Byte , Xx1 As Byte , Col5 As Word , Teller As Byte , Pix As Word

CALL Lcd_text( «HELLO WORD» , 1 , 10 )
Wait 3
Do
CALL Lcd_text( «433.925» , 1 , 50 )
Wait 3
CALL Lcd_text( «HELLO WORD» , 100 , 100 )
Wait 3

Читайте также  Обзор карманного осциллографа dso201

Call Lcd_command(&H2b) ‘row set y
Call Lcd_data(&H00)
Call Lcd_data(ys) ‘Start

Call Lcd_command(&H36) ‘направление вывода изображения:
Call Lcd_data(&H14) ‘ снизу вверх, справа на лево, порядок цветов RGB

Call Lcd_command(&H29) ‘ включаем изображение
Lcd_cs = 1

Sub Lcd_text(byval D3310string As String * 14 , byval Xs As Byte , Byval Ys As Byte )
Local XS_ As Byte : XS_ = XS
Local YS_ As Byte : YS_ = YS
Local cikl As Byte
Local D3310length As Byte ‘Holds the length of D3310string
Local D3310character As String * 1 ‘Holds each consecutive character in turn during display output
Local D3310stringloop As Byte ‘Loop variable for the string
Local D3310columnloop As Byte ‘Loop variable for the columns
Local D3310column As Byte ‘Display column output
D3310length = Len(d3310string) ‘Establish the number of characters
For D3310stringloop = 1 To D3310length ‘Loop through the string
D3310character = Mid(d3310string , D3310stringloop , 1) ‘Get the current character
Select Case D3310character ‘Position the pointer to the correct character in the Eeprom and read the first byte
Case «0» : Restore Zero
Case «1» : Restore One
Case «2» : Restore Two
Case «3» : Restore Three
Case «4» : Restore Four
Case «5» : Restore Five
Case «6» : Restore Six
Case «7» : Restore Seven
Case «8» : Restore Eight
Case «9» : Restore Nine
Case «A» : Restore A
Case «B» : Restore B
Case «C» : Restore C
Case «D» : Restore D
Case «E» : Restore E
Case «F» : Restore F
Case «G» : Restore G
Case «H» : Restore H
Case «I» : Restore I
Case «J» : Restore J
Case «K» : Restore K
Case «L» : Restore L
Case «M» : Restore M
Case «N» : Restore N
Case «O» : Restore O
Case «P» : Restore P
Case «Q» : Restore Q
Case «R» : Restore R
Case «S» : Restore S
Case «T» : Restore T
Case «U» : Restore U
Case «V» : Restore V
Case «W» : Restore W
Case «X» : Restore X
Case «Y» : Restore Y
Case «Z» : Restore Z
Case «Е» : Restore Aa
Case «Д» : Restore Ae
Case «Ц» : Restore Oe
Case «a» : Restore A1
Case «b» : Restore B1
Case «c» : Restore C1
Case «d» : Restore D1
Case «e» : Restore E1
Case «f» : Restore F1
Case «g» : Restore G1
Case «h» : Restore H1
Case «i» : Restore I1
Case «j» : Restore J1
Case «k» : Restore K1
Case «l» : Restore L1
Case «m» : Restore M1
Case «n» : Restore N1
Case «o» : Restore O1
Case «p» : Restore P1
Case «q» : Restore Q1
Case «r» : Restore R111
Case «s» : Restore S1
Case «t» : Restore T1
Case «u» : Restore U1
Case «v» : Restore V1
Case «w» : Restore W1
Case «x» : Restore X1
Case «y» : Restore Y1
Case «z» : Restore Z1
Case «е» : Restore Aa1
Case «д» : Restore Ae1
Case «ц» : Restore Oe1
Case » » : Restore Spacesign
Case «-» : Restore Dash
Case «.» : Restore Dot
Case «:» : Restore Colon
Case «>» : Restore Arrowright
Case «°» : Restore Degree
Case «@» : Restore Alpha
Case «&» : Restore Ampersand
Case «‘» : Restore Apostrophe
Case «

Дисплеи ST7735 и ST7789. Подключаем к ESP8266, выводим изображение без SD карты.

Недавно заказал с алиэкпресс интересный экран, достаточно маленького размера, всего 1.44 дюйма, но обладающий разрешением 240х240 пикселей на матрице IPS, и обладающий SPI контроллером ST7789, т.е. его можно подружить с библиотекой Adafruit. Появление таких качественных экранов по бросовой цене, могу объяснить только тем, что возможно их сделали огромную партию под какие-нибудь смарт-часы или похожие устройства.

К AVR подключать его не сильно хотелось, ведь его тактовая частота выводит изображения с сильной задержкой, и я решил протестировать его на ESP8266. Конечно особой информации в сети не нашлось, но вроде стандартная библиотека, судя по быстрому описанию на гитхабе, позволяла легко его подключить (хаха, не тут то было). Добавляем библиотеку в Arduino IDE

Открываем пример graphictest, который появится у нас после добавления библиотеки, и видим много ifdef, для разных чипов, и вариантов подключений. Я эти куски сразу почистил, до лаконичных выводов, которые мне нужны. Собственно, какую-то часть менять не нужно, так как она завязана на аппаратный SPI

Тут я всё понял, когда посмотрел на выводы дисплея, ведь зашитая на спех программа ничего не отобразила на дисплее. Причину нашёл быстро, ведь я никуда не подключил вывод CS. Стоп, а где он?

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

К сожалению вывод CS был припаян к земле, и я решил, что его переходной контакт будет под экраном и аккуратно ножом сдёрнул его.

Но там его не оказалось, и остался вариант сложнее – полностью отпаять шлейф экрана, что было не просто, ведь его легко порвать. Кстати теперь сам дисплей можно использовать в своих устройствах без этой синей площадки. Распаять его достаточно легко на свою плату, изготовленную ЛУТом например, шаг выводов позволяет.

Контакт этот я срезал ножом, что он не контактировал с контактом GND, это делать нужно тоже аккуратно.

Теперь запаиваем обратно шлейф матрицы, и к выводу CS припаиваем уже свой провод, который можно подключить в ESP8266.

Итоговая схема подключения дисплея на ST7789 (и ST7735) получилась такая

Ещё раз пройдёмся по коду из примера graphictest из библиотеки st7789 и st7735

Как я писал выше, я убрал все замены ifdef, и оставил выводы, которые точно буду использовать (выше в статье). ЗАтем закомментировал ненужный контроллер, и раскомментировал тот, что установлен в этом дисплее

Также раскомментировал строку, с разрешением, которое мне нужно. Остальные удалил

Вот теперь, при подключённом выводе CS демка сразу заработала. Значит нам доступны все функции библиотек adafruit_gfx. Скорость работы намного выше, чем у AVR.

Чтобы оценить качество экрана в полной мере, лучше вывести изображение, обычно это делается с micro-sd карты, но в самом экране её нет (хотя у adafruit вроде есть версии с флеш-слотом). Вспомнив, что у ESP8266 достаточно много собственной памяти для программ, решил попробовать записать изображение в память программы. Для этого можно воспользоваться ссылкой

Загружаем картинку нужного разрешения, и конвертируем в *.с файл. Далее, я чищу header этого файла, переименовываю в *.h, кладу в папку с проектом, и подключаю командой

Файл очень большой, и когда он лежит в проекте занимает много места. Каждый пиксель описывается в 16 битной цветовой гамме, и это конечно избыточно, замедляет вывод изображения. В самом файле картинки нас интересует переменная памяти программ, я назвал её DogBitmap

Теперь простой командой из библиотеки adafruit можно вывести её на экран

Где, первые два аргумента (0,0) – это стартовая позиция отрисовки, потом имя нашей переменной, и затем размеры изображения по ширине и высоте (240х240). Смотрим результат. Картинку я взял из известных стикеров Вконтакте.

Как я уже писал, у этого экрана потрясающие углы обзора, и большое разрешение на 1.4 дюйма размера, так что для отображения картинок в маленьких устройствах он подходит великолепно. Как обычно, код по ссылке