Для этого урока нам потребуется полноцветный 1.8 дюйма TFT-дисплей 128×160 px, SPI. Забираем на Али!
• Размеры модуля: 35 мм х 57 мм х 7 мм.
• Разрешение: 128×160 пикселей.
• Цветность: 65 тысяч цветов в формате RGB 5-6-5.
• Напряжение питания: 3.3В – 5В.
• Протокол обмена данными: SPI.
• Встроенный разъём для SD-карты.
Рассмотрим модуль на ST7735 поближе и разберемся с программированием под него.
Содержание статьи / Table Of Contents
↑ Назначение выводов модуля ST7735
• SCK, MOSI – линии протокола SPI. Альтернативные названия – DO/DI, SCL/SDA. Вывод MISO отсутствует.• CS – выбор чипа. Активный уровень низкий.
• DC – выбор типа записываемого в модуль слова – данные или команда. Возможны и иные обозначения этого вывода – A0, RS.
• RESET – аппаратный сброс. В состав команд ST7735 входит команда программного сброса, так что на этом выводе можно сэкономить. Однако, следует иметь в виду, что для некоторых регистров контроллера значения по аппаратному и программному сбросу не совпадают.
• VCC, GND – линии питания контроллера. Диапазон напряжения – от 3.3В до 5В.
• LED (или BL) – питание дисплея. Максимально допустимое значение подаваемого на этот вывод напряжения – 3.3 В. В последних модификациях обычно имеется преобразователь 5В –> 3.3 В. Если вы обнаружили его на оборотной стороне своего модуля, можно соединить между собой выводы LED и VCC и подавать любое из указанного диапазона удобное для вас напряжение.
↑ Протокол обмена данными
Функции обмена для ST7735 по содержанию абсолютно такие же, как и в случае с SSD1306:void st7735_command(uint8_t command)
{
cbi(ST_PORT, DC_pin);
cbi(ST_PORT, CS_pin);
SPI_byte(command);
sbi(ST_PORT, CS_pin);
}
void st7735_data(uint8_t data)
{
sbi(ST_PORT, DC_pin);
cbi(ST_PORT, CS_pin);
SPI_byte(data);
sbi(ST_PORT, CS_pin);
}
Единственным отличием в протоколе обмена является то, что для записи параметров, следующих за командой, используется функция st7735_data (), а не st7735_command ():
st7735_command(0x37);
st7735_data(parameter 1);
st7735_data(parameter 2);
↑ Система команд
Если, по причине отсутствия вывода 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, достаточно следующего кода:#define WHITE 0xFFFF
#define ST7735_CASET 0x2A
#define ST7735_RASET 0x2B
#define ST7735_RAMWR 0x2C
//команда установки адреса столбца или координаты X
st7735_command(ST7735_CASET);
//записываем 2 байта 16-битного значения начального адреса столбца
st7735_data(0); st7735_data(64);
//записываем 2 байта 16-битного значения конечного адреса столбца
st7735_data(0); st7735_data(65);
//команда установки адреса строки или координаты Y
st7735_command(ST7735_RASET);
//записываем 2 байта 16-битного значения начального адреса строки
st7735_data(0); st7735_data(80);
//записываем 2 байта 16-битного значения конечного адреса строки
st7735_data(0); st7735_data(81);
//команда записи в ОЗУ и вывода на дисплей
st7735_command(ST7735_RAMWR);
//записываем старший байт 16-битного значения цвета
st7735_data(WHITE >> 8);
//записываем младший байт 16-битного значения цвета
st7735_data(WHITE);
По исполнению вы получите точку прямо по центру экрана с вертикальной ориентацией.
↑ О координатах и цвете ST7735
Давайте поговорим поподробнее о координатах и цвете изображения, а также его ориентации на дисплее.При рисовании объектов, состоящих более чем из одной точки, совсем не обязательно задавать координаты для каждого пикселя, достаточно определить границы всего объекта. Например, нарисовать горизонтальную линию шириной в 1 и длиной в 10 пикселей можно так:
st7735_command(ST7735_CASET);
//начало линии, к примеру, в координате Х = 5
st7735_data(0); st7735_data(5);
//тогда конец линии - в координате Х = 5 + 10 = 15
st7735_data(0); st7735_data(15);
st7735_command(ST7735_RASET);
// начало линии, к примеру, в координате Y = 20
st7735_data(0); st7735_data(20);
//а ширина 1 пиксель, т.е. 20 + 1 = 21
st7735_data(0); st7735_data(21);
st7735_command(ST7735_RAMWR);
//открываем цикл числом по количеству пикселей в линии - 10
for(uint8_t counter = 0; counter <10; counter++)
{
//записываем старший байт 16-битного значения цвета
st7735_data(WHITE >> 8);
//записываем младший байт 16-битного значения цвета
st7735_data(WHITE);
}
Для вертикальной линии такой же длины и ширины всё будет, как вы понимаете, наоборот – начальный и конечный адреса столбцов будут отличаться на 1, а строк – на 15.
По той же схеме можно рисовать закрашенные определённым цветом прямоугольники заданного размера. Примером тому может служить функция st7735_fill_screen () из прилагаемой библиотеки, закрашивающая весь дисплей заданным цветом:
void st7735_fill_screen(uint16_t color)
{
st7735_command(ST7735_CASET);
//границы прямоугольника совпадают с границами дисплея
st7735_data(0x00); st7735_data(0x00);
st7735_data(0x00); st7735_data(ST7735_TFTWIDTH - 1);
st7735_command(ST7735_RASET);
st7735_data(0x00); st7735_data(0x00);
st7735_data(0x00); st7735_data(ST7735_TFTHEIGHT - 1);
st7735_command(ST7735_RAMWR);
//количество пикселей, т.е. площади прямоугольника и дисплея, также совпадают
for(uint16_t counter = 0; counter < (ST7735_TFTWIDTH*ST7735_TFTHEIGHT);
counter++)
{
st7735_data(color >> 8);
st7735_data(color);
}
}
Что касается цвета. Как уже говорилось выше мы будем использовать 16-битное значение цвета в формате RGB 5-6-5. Означает это следующее.
Каждый пиксель дисплея состоит из трёх субпикселей – красного (R — Red), зелёного (G — Green) и синего (B — Blue). 16 битов числа, определяющего цвет, распределяются между субпикселями – 5 бит для красного, 6 бит для зелёного и 5 бит для синего – и определяют интенсивность их свечения. Если мы отправим в ОЗУ число 0хF800 (1111100000000000 в двоичном исчислении)
st7735_command(ST7735_RAMWR);
st7735_data(0хF800);
то получим такое распределение интенсивностей:
красный – горит максимально ярко (все биты равны 1), а зелёный и синий выключены (все биты равны 0). На дисплее вы увидите точку красного цвета.
Таким образом, чтобы получить зелёный цвет, надо отправить число 0×07E0 (0000011111100000), а в случае синего – 0×001F (0000000000011111). Чёрный цвет достигается записью нулей во всех битах (число 0×0000), а белый – единиц (число 0хFFFF). Все остальные 65 с лишним тысяч цветов и оттенков (2^16 = 65536) располагаются в промежутках между вышеуказанными тремя. В файле st7735.h библиотеки определены следующие основные цвета:
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
Следует отметить, что приведённые числа верны для случая, когда бит 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 ⇣ 197
Архив библиотеки:
🎁st7735_kod.7z 1.72 Kb ⇣ 303
↑ Где брать дисплеи для экспериментов?
У китайцев, конечно!1.8 дюйма полноцветный TFT-дисплей 128х160 px, SPI. Забираем на Али!
На этом вторая часть статьи завершена.
Спасибо за внимание!
Камрад, рассмотри датагорские рекомендации
🌼 Полезные и проверенные железяки, можно брать
Опробовано в лаборатории редакции или читателями.