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

 
 
 
6

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

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

Следующий из рассматриваемых нами модулей обладает полноцветным дисплеем под управлением контроллера 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 и подавать любое из указанного диапазона удобное для вас напряжение.


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

Функции обмена для 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);   

По исполнению вы получите точку прямо по центру экрана с вертикальной ориентацией.
Визуализация для микроконтроллера. Часть 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);     

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

красный – горит максимально ярко (все биты равны 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 загружен 26 раз.

Архив библиотеки:
st7735_kod.7z | Файл 1,72 Kb загружен 32 раз.

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

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


На этом вторая часть статьи завершена.
Спасибо за внимание!
Ербол (erbol)
Актобе, Казахстан
Профиль erbol
Мне 50 лет. Родился и вырос в г. Актюбинск (ныне - Актобе), Казахстан. Женат, воспитываю четверых прекрасных детей.

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

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

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

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

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

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


Схема на Датагоре. Новая статья Визуализация для микроконтроллера. Часть 3. TFT дисплей 2.8" (240х320) на ILI9341... Битва за урожай закончена, можно продолжить повествование. Полноцветный TFT-дисплей 240×320...
Схема на Датагоре. Новая статья Визуализация для микроконтроллера. Часть 1. OLED дисплей 0.96" (128х64) на SSD1306... Добрый день, друзья! Эта статья открывает цикл, посвящённый средствам визуального отображения...
Схема на Датагоре. Новая статья Трансивер 2,4 ГГц Nordic Semiconductor nRF24L01. Перевод таблиц даташита, пояснения и коды для организации сети... Wireless Transceiver Module NRF24L01+ 2.4GHz, 4 шт. на Али Привет, датагорцы! Выкладываю перевод...
Схема на Датагоре. Новая статья Беспроводной канал связи 2,4 ГГц на базе трансивера nRF24L01+ от Nordic Semiconductor. Часть 3... Wireless Transceiver Module NRF24L01+ 2.4GHz, 4 шт. на Али Приветствую всех настоящих и будущих...
Схема на Датагоре. Новая статья Беспроводной канал связи 2,4 ГГц на базе трансивера nRF24L01+ от Nordic Semiconductor. Часть 2... Продолжаем разговор. Как-то раз мы с пацанами решили соединить радио-модуль «nRF24L01+» вот с таким...
Схема на Датагоре. Новая статья Беспроводной канал связи 2,4 ГГц на базе трансивера nRF24L01+ от Nordic Semiconductor. Часть 1... Доброго вам дня, уважаемые граждане и гости Датагор.ру - этого замечательного сообщества...
Схема на Датагоре. Новая статья Поделки начинающего цапостроителя, часть 18/1. Рулим ЦАП АК4399 с помощью Arduino... Я долго колебался – писать эту статью или нет. Это решение нужно было принять — основываясь на...
Схема на Датагоре. Новая статья Автоматическое зарядно-тренирующее и измеряющее устройство для 12-вольтовых герметичных аккумуляторов (PIC12F675). Часть 2... Предлагаю вашему вниманию дополнения и улучшения к моему проекту на Датагоре «Автоматическое...
Схема на Датагоре. Новая статья Доработка модуля китайского вольтметра... ПрелюдияИзучая как-то бескрайние просторы Интернета на предмет китайских полезностей, наткнулся я...
Схема на Датагоре. Новая статья Вольтметр-амперметр переменного тока с вычислением мощности на PIC16F690 [Обновлено]... Довольно простой прибор измеряющий напряжение, ток и показывающий полную мощность потребляемую...
Схема на Датагоре. Новая статья Програмирование в AVR Studio 5 с самого начала. Часть 2... Пишем первую программу!Большинство начинают с мигания светодиодов, и мы не исключение. Если...
Схема на Датагоре. Новая статья Микроконтроллеры AVR семейств Tiny и Mega фирмы ATMEL, Евстифеев А.В.... Издательство: Додэка XXI [М.], 560 стр. 2005 г. Книга посвящена вопросам практического применения...
<
  • Подписчик
14 сентября 2016 16:31

Игорь / StalKer-NightMan

Цитата
  • С нами с 15.03.2012
  • Ушёл в реал Пользователь offline
  • 92 комментария
  • 1 публикация
 
  • 0
Спасибо, Эрбол за проделанную работу. Как всегда, у Вас все по полочкам разложено.

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

Ербол / erbol

Цитата
  • С нами с 11.12.2014
  • Ушёл в реал Пользователь offline
  • 59 комментариев
  • 9 публикаций
 
  • 0
Игорь, спасибо большое! smile

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

Радик / galrad

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

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

Ербол / erbol

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

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

Сергей / Sergiy_83

Цитата
  • С нами с 16.10.2012
  • Ушёл в реал Пользователь offline
  • 36 комментариев
  • 4 публикации
 
  • 0
Ербол, за статьи спасибо, продолжайте в том же духе.!

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

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

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

Ербол / erbol

Цитата
  • С нами с 11.12.2014
  • Ушёл в реал Пользователь offline
  • 59 комментариев
  • 9 публикаций
 
  • 0
Спасибо, Сергей! smile
Сохранение изображений во флэш-памяти и вывод их на дисплей также будут рассмотрены в 5-й части

Добавление комментария


Налетай! Паяльники, станции, жала с доставкой
  • smilelolbyewinkyahoocoollaughing
    crazybadcryingsadirefulsickstraight
    ballooncakegooddrinksmailbombsun
    nightrainstarscolddashguitar-manhandshake
    musicnegativenopardonshoksleepunknown
    wackoyawnblushbullyhashsmokingwhew
Скопируйте текст вашего комментария на случай неверного ответа на контрольный вопрос.