В начало | Зарегистрироваться | Заказать наши киты почтой
 
 
 
 

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

📆14 сентября 2016   ✒️erbol   🔎55.753   💬20  
Следующий из рассматриваемых нами модулей обладает полноцветным дисплеем под управлением контроллера 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 ⇣ 178

Архив библиотеки:
🎁st7735_kod.7z  1.72 Kb ⇣ 277

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

У китайцев, конечно!
1.8 дюйма полноцветный TFT-дисплей 128х160 px, SPI. Забираем на Али!

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

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

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

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




 

Читательское голосование

Нравится

Статью одобрили 59 читателей.

Для участия в голосовании зарегистрируйтесь и войдите на сайт с вашими логином и паролем.
 

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

 

 

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

 

Схема на Датагоре. Новая статья Визуализация для микроконтроллера. Часть 1. OLED дисплей 0.96" (128х64) на SSD1306... Добрый день, друзья! Эта статья открывает цикл, посвящённый средствам визуального отображения...
Схема на Датагоре. Новая статья Визуализация для микроконтроллера. Часть 3. TFT дисплей 2.8" (240х320) на ILI9341... Битва за урожай закончена, можно продолжить повествование. Полноцветный TFT-дисплей 240×320 ILI9341...
Схема на Датагоре. Новая статья Беспроводной канал связи 2,4 ГГц на базе трансивера nRF24L01+ от Nordic Semiconductor. Часть 1... Доброго вам дня, уважаемые граждане и гости Датагор.ру - этого замечательного сообщества увлечённых...
Схема на Датагоре. Новая статья Визуализация для микроконтроллера. Часть 4. Android... Вообще то я планировал рассказать сегодня про дисплей на базе ILI9481. Однако, он настолько похож...
Схема на Датагоре. Новая статья Микроконтроллеры AVR семейств Tiny и Mega фирмы ATMEL, Евстифеев А.В.... Издательство: Додэка XXI [М.], 560 стр. 2005 г. Книга посвящена вопросам практического применения...
Схема на Датагоре. Новая статья Програмирование в AVR Studio 5 с самого начала. Часть 2... Пишем первую программу!Большинство начинают с мигания светодиодов, и мы не исключение. Если...
Схема на Датагоре. Новая статья Беспроводной канал связи 2,4 ГГц на базе трансивера nRF24L01+ от Nordic Semiconductor. Часть 2... Продолжаем разговор. Как-то раз мы с пацанами решили соединить Микроконтроллер Attiny85 на Али...
Схема на Датагоре. Новая статья Автоматическое зарядно-тренирующее и измеряющее устройство для 12-вольтовых герметичных аккумуляторов (PIC12F675). Часть 2... Предлагаю вашему вниманию дополнения и улучшения к моему проекту на Датагоре «Автоматическое...
Схема на Датагоре. Новая статья Доработка модуля китайского вольтметра... ПрелюдияИзучая как-то бескрайние просторы Интернета на предмет китайских полезностей, наткнулся я...
Схема на Датагоре. Новая статья Аудио ЦАП DAC. Поделки начинающего цапостроителя. Часть 18:1. Рулим ЦАП AK4399 с помощью Arduino... Я долго колебался – писать эту статью или нет. Это решение нужно было принять — основываясь на...
Схема на Датагоре. Новая статья USB-программатор AVR на FT232RL с буффером... Иметь дело с микроконтроллерами (как и вообще с цифровой техникой) мне приходится довольно редко и...
 

Комментарии, вопросы, ответы, дополнения, отзывы

 

Назад Вперед
<
Читатель Датагора

StalKer-NightMan

<
Читатель Датагора

erbol

<
Читатель Датагора

galrad

<
Читатель Датагора

erbol

<
Читатель Датагора

Sergiy_83

<
Читатель Датагора

erbol

<
Читатель Датагора

Максим

<
Читатель Датагора

Datagor



<
Читатель Датагора

Максим

<
Читатель Датагора

Datagor

<
Читатель Датагора

Datagor



<
Читатель Датагора

erbol

<
Читатель Датагора

Максим

<
Читатель Датагора

Datagor

<
Читатель Датагора

Мак

<
Читатель Датагора

Гость say

Назад Вперед

Добавить комментарий, вопрос, отзыв 💬

Камрады, будьте дружелюбны, соблюдайте правила!

  • Смайлы и люди
    Животные и природа
    Еда и напитки
    Активность
    Путешествия и места
    Предметы
    Символы
    Флаги
 
 
В начало | Зарегистрироваться | Заказать наши киты почтой