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

 
 
 

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

Разместил erbol 14 сентября 2016. Просмотров: 3261

6 Следующий из рассматриваемых нами модулей обладает полноцветным дисплеем под управлением контроллера ST7735.

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

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

Назначение выводов модуля 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 и подавать любое из указанного диапазона удобное для вас напряжение.
Визуализация для микроконтроллера. Часть 2. TFT дисплей 1.8" (128х160) на ST7735


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

Функции обмена для 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. Команды настройки – все остальные команды, которые по большому счёту используются один раз – при инициализации модуля.

Я не стал переводить на русский язык таблицы команд в силу их громоздкости и, порой, избыточности. Обращу ваше внимание лишь на некоторые особенности в структуре таблиц и приведу описание команд с подробностью, соответствующей их важности.
На рисунке ниже изображён заголовок таблицы из даташита.
Визуализация для микроконтроллера. Часть 2. TFT дисплей 1.8" (128х160) на ST7735

Столбцы, выделенные зелёным цветом, относятся к другим протоколам, поддерживаемым 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);   

По исполнению вы получите точку прямо по центру экрана с вертикальной ориентацией.
Визуализация для микроконтроллера. Часть 2. TFT дисплей 1.8" (128х160) на ST7735


О координатах и цвете 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);     

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

красный – горит максимально ярко (все биты равны 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), вы легко поймёте из следующего рисунка даташита:
Визуализация для микроконтроллера. Часть 2. TFT дисплей 1.8" (128х160) на ST7735


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

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

Файлы

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


Архив библиотеки:
Файловый сервис доступен только полноправным членам сообщества и подписчикам.
Пожалуйста, ознакомьтесь с условиями доступа.


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

У китайцев, конечно. Выбирайте ваш любимый магазин.


Визуализация для микроконтроллера. Часть 2. TFT дисплей 1.8" (128х160) на ST77351.8 дюйма полноцветный TFT-дисплей 128х160 px, SPI. Забираем на Али!
Визуализация для микроконтроллера. Часть 2. TFT дисплей 1.8" (128х160) на ST77351.8 inch TFT LCD Module SPI Serial Port Display 4 I / O Display for Arduino — RED PCB
Визуализация для микроконтроллера. Часть 2. TFT дисплей 1.8" (128х160) на ST77351.8 Inch 128×160 SPI Serial TFT LCD Display Module
1.8 Inch Serial SPI TFT LCD Display Module With Power IC SD Socket
Визуализация для микроконтроллера. Часть 2. TFT дисплей 1.8" (128х160) на ST77351.8 inch LCD Tft Module 128×160 PCB SPI Port ST7735


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

Об авторе

Ербол (erbol)
Актобе, Казахстан
Мне 50 лет. Родился и вырос в г. Актюбинск (ныне - Актобе), Казахстан. Женат, воспитываю четверых прекрасных детей.

С программированием и электроникой имею может и не отдаленные, но весьма эпизодические отношения: в далекие и бурные 90-е годы аж прошлого века посчастливилось участвовать в автоматизации экспериментальной установки с использованием микропроцессорного комплекта КР580.

А пару лет назад мои сорванцы вдруг заинтересовались микроконтроллерами. Пришлось из дальних уголков памяти вытаскивать свои старые познания и стряхивать с них пыль.
 

Понравилось? Палец вверх!

  • всего лайков: 39

Поделись с друзьями!


Связанные материалы:


Kaspersky FREE. Бесплатная годовая лицензия для России, Белоруссии и Украины

Привет, друзья! Очередной подарок от kaspersky.ru — антивирус «Kaspersky FREE». Спасибо...

Визуализация для микроконтроллера. Часть 1. OLED дисплей 0.96" (128х64) на SSD1306

Добрый день, друзья! Эта статья открывает цикл, посвящённый средствам визуального отображения...

Пусть всегда будет солнце!

Сегодня День Победы. Мы так долго живём без войны, что начали забывать, что это...

Доработанный вариант малошумящего двухполярного источника питания

Здравствуйте, коллеги! Размещаю дополнение к статье «Малошумящий двухполярный блок питания...

Кит отладочной платы ЦАПа «Silver Wolf R192» (WM8805, WM8740, TOSLINK, S/PDIF с

Для разработки следующего Датагорского ЦАПа и написания управляющего софта была создана...

17/01 киберсубботник на портале

Привет, дрУги! В ближайщую субботу на нашем портале и в магазине будет...

Автоматическое зарядно-тренирующее и измеряющее устройство для 12-вольтовых

Предлагаю вашему вниманию дополнения и улучшения к моему проекту на Датагоре «Автоматическое...

Библиотеки Diptrace +3D. Разъёмы PBS (розетки)

Продолжая тему библиотек для Diptrace, хочу предложить розетки однорядные PBS для пайки...

Схемка в блокнот. Индикатор разрядки аккумуляторной батареи

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

Сделай сам преобразователь сигналов для механического энкодера, v.2

Хотелось бы дополнить и продолжить мою статью про энкодер «Преобразователь сигналов...

Transformer: программа расчета маломощного (до 500 Вт) силового трансформатора на

Предлагаю начинающим очень простую программулину для расчета силовых трансформаторов. Автор...

Датагорская Ярмарка электроники v.2 открылась!

Уважаемые граждане Датагории и гости нашего кибер-города! После обновления открылась...
<
  • Подписчик
14 сентября 2016 16:31

Игорь / StalKer-NightMan

  • Регистрация: 15.03.2012
  • Публикаций: 1
  • Комментариев: 84
 
  • 0
Спасибо, Эрбол за проделанную работу. Как всегда, у Вас все по полочкам разложено.

<
  • Бонус
14 сентября 2016 19:16

Ербол / erbol

  • Регистрация: 11.12.2014
  • Публикаций: 7
  • Комментариев: 58
 
  • 0
Игорь, спасибо большое! smile

<
  • Гражданин
16 сентября 2016 11:35

Радик / galrad

  • Регистрация: 23.08.2011
  • Публикаций: 12
  • Комментариев: 84
 
  • 0
Хорошая статья, действительно - все основные моменты для работы с дисплеем учтены. Для начинающих осваивать микроконтроллеры при переходе на работу с дисплеями очень полезная информация!
Есть одно небольшое пожелание - это практические примеры, пару, тройку штучек в виде вывода на экран (полнофункционального цветного дисплея) текстового приветствия и сгенерированных картинок. Конечно такие дисплеи позволяют выводить информацию непосредственно с компьютера, но оптимальным, мне кажется, показать схему подключения к микроконтроллеру, тогда для начинающих многие вопросы упрощаются, даже в плане прямого копирования схемы... smile
Эрболу респект за проделанную работу! handshake

<
  • Бонус
16 сентября 2016 12:14

Ербол / erbol

  • Регистрация: 11.12.2014
  • Публикаций: 7
  • Комментариев: 58
 
  • 0
Спасибо, Радик! smile
В 5-й части цикла как раз будет рассматриваться единая для всех описываемых дисплеев библиотека, включая примеры рисования геометрических фигур, текстовых строк, а также вывод изображения с флэш-накопителя drinks

<
  • Гражданин
16 сентября 2016 15:17

Сергей / Sergiy_83

  • Регистрация: 16.10.2012
  • Публикаций: 1
  • Комментариев: 23
 
  • 0
Ербол, за статьи спасибо, продолжайте в том же духе.!

Цитата: galrad
Конечно такие дисплеи позволяют выводить информацию непосредственно с компьютера

Еще можно размещать небольшие изображения во флеш самого микроконтроллера (в области программы). Если использовать относительно небольшие иконки, то вполне реально обойтись без сторонней памяти.

<
  • Бонус
16 сентября 2016 18:03

Ербол / erbol

  • Регистрация: 11.12.2014
  • Публикаций: 7
  • Комментариев: 58
 
  • 0
Спасибо, Сергей! smile
Сохранение изображений во флэш-памяти и вывод их на дисплей также будут рассмотрены в 5-й части

Информация
Вы не можете участвовать в комментировании. Вероятные причины:
— Администратор остановил комментирование этой статьи.
— Вы не авторизовались на сайте. Войдите с паролем.
— Вы не зарегистрированы у нас. Зарегистрируйтесь.
— Вы зарегистрированы, но имеете низкий уровень доступа. Получите полный доступ.