Урок 37
Часть 3
Дисплей TFT 240×320 8bit
В прошлой части данного урока мы начали писать инициализацию дисплея и уже проверили самое главное — мы считали идентификатор дисплея, увидели его на символьном дисплее, а это значит, что подключено всё правильно и с дисплеем мы уже общаемся.
Продолжим писать инициализацию дисплея далее, также время от времени заглядывая в даташит на контроллер (в принципе комментарии возле каждой настройки в коде сами о себе скажут):
TFT9341_SendCommand(0x01);//Software Reset
DelayMicro(1);
TFT9341_SendCommand(0xCB);//Power Control A
TFT9341_SendData(0x39);
TFT9341_SendData(0x2C);
TFT9341_SendData(0x00);
TFT9341_SendData(0x34);
TFT9341_SendData(0x02);
DelayMicro(1);
TFT9341_SendCommand(0xCF);//Power Control B
TFT9341_SendData(0x00);
TFT9341_SendData(0xC1);
TFT9341_SendData(0x30);
DelayMicro(1);
TFT9341_SendCommand(0xE8);//Driver timing control A
TFT9341_SendData(0x85);
TFT9341_SendData(0x00);
TFT9341_SendData(0x78);
DelayMicro(1);
TFT9341_SendCommand(0xEA);//Driver timing control B
TFT9341_SendData(0x00);
TFT9341_SendData(0x00);
DelayMicro(1);
TFT9341_SendCommand(0xED);//Power on Sequence control
TFT9341_SendData(0x64);
TFT9341_SendData(0x03);
TFT9341_SendData(0x12);
TFT9341_SendData(0x81);
DelayMicro(1);
TFT9341_SendCommand(0xF7);//Pump ratio control
TFT9341_SendData(0x20);
DelayMicro(1);
TFT9341_SendCommand(0xC0);//Power Control 1
TFT9341_SendData(0x10);
DelayMicro(1);
TFT9341_SendCommand(0xC1);//Power Control 2
TFT9341_SendData(0x10);
DelayMicro(1);
TFT9341_SendCommand(0xC5);//VCOM Control 1
TFT9341_SendData(0x3E);
TFT9341_SendData(0x28);
DelayMicro(1);
TFT9341_SendCommand(0xC7);//VCOM Control 2
TFT9341_SendData(0x86);
DelayMicro(1);
TFT9341_SetRotation(0);
DelayMicro(1);
TFT9341_SendCommand(0x3A);//Pixel Format Set
TFT9341_SendData(0x55);//16bit
DelayMicro(1);
TFT9341_SendCommand(0xB1);
TFT9341_SendData(0x00);
TFT9341_SendData(0x18);// Частота кадров 79 Гц
DelayMicro(1);
TFT9341_SendCommand(0xB6);//Display Function Control
TFT9341_SendData(0x08);
TFT9341_SendData(0x82);
TFT9341_SendData(0x27);//320 строк
DelayMicro(1);
TFT9341_SendCommand(0xF2);//Enable 3G (пока не знаю что это за режим)
TFT9341_SendData(0x00);//не включаем
DelayMicro(1);
TFT9341_SendCommand(0x26);//Gamma set
TFT9341_SendData(0x01);//Gamma Curve (G2.2) (Кривая цветовой гаммы)
DelayMicro(1);
TFT9341_SendCommand(0xE0);//Positive Gamma Correction
TFT9341_SendData(0x0F);
TFT9341_SendData(0x31);
TFT9341_SendData(0x2B);
TFT9341_SendData(0x0C);
TFT9341_SendData(0x0E);
TFT9341_SendData(0x08);
TFT9341_SendData(0x4E);
TFT9341_SendData(0xF1);
TFT9341_SendData(0x37);
TFT9341_SendData(0x07);
TFT9341_SendData(0x10);
TFT9341_SendData(0x03);
TFT9341_SendData(0x0E);
TFT9341_SendData(0x09);
TFT9341_SendData(0x00);
DelayMicro(1);
TFT9341_SendCommand(0xE1);//Negative Gamma Correction
TFT9341_SendData(0x00);
TFT9341_SendData(0x0E);
TFT9341_SendData(0x14);
TFT9341_SendData(0x03);
TFT9341_SendData(0x11);
TFT9341_SendData(0x07);
TFT9341_SendData(0x31);
TFT9341_SendData(0xC1);
TFT9341_SendData(0x48);
TFT9341_SendData(0x08);
TFT9341_SendData(0x0F);
TFT9341_SendData(0x0C);
TFT9341_SendData(0x31);
TFT9341_SendData(0x36);
TFT9341_SendData(0x0F);
DelayMicro(1);
TFT9341_SendCommand(0x11);//Выйдем из спящего режим
HAL_Delay(150);
TFT9341_SendCommand(0x29);//Включение дисплея
TFT9341_SendData(0x2C);
HAL_Delay(150);
Попробуем теперь закрасить дисплей в какой-нибудь цвет. Для этого нам потребуется целых три функции
//—————————————————————
void TFT9341_Flood(uint16_t color, uint32_t len)
{
uint16_t blocks;
uint8_t i, hi = color>>8, lo=color;
TFT9341_SendCommand(0x2C);
TFT9341_SendData(hi);
DelayMicro(1);
TFT9341_SendData(lo);
len—;
blocks=(uint16_t)(len/64);//64 pixels/block
while(blocks—)
{
i=16;
do
{
TFT9341_SendData(hi);
TFT9341_SendData(lo);
TFT9341_SendData(hi);
TFT9341_SendData(lo);
TFT9341_SendData(hi);
TFT9341_SendData(lo);
TFT9341_SendData(hi);
TFT9341_SendData(lo);
} while (—i);
}
//Fill any remaining pixels(1 to 64)
for (i=(uint8_t)len&63;i—;)
{
TFT9341_SendData(hi);
TFT9341_SendData(lo);
}
}
//—————————————————————
void TFT9341_SetAddrWindow(uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2)
{
TFT9341_SendCommand(0x2A);//Column Addres Set
TFT9341_SendData(x1 >> 8);
TFT9341_SendData(x1 & 0xFF);
TFT9341_SendData(x2 >> 8);
TFT9341_SendData(x2 & 0xFF);
DelayMicro(1);
TFT9341_SendCommand(0x2B);//Page Addres Set
TFT9341_SendData(y1 >> 8);
TFT9341_SendData(y1 & 0xFF);
TFT9341_SendData(y2 >> 8);
TFT9341_SendData(y2 & 0xFF);
DelayMicro(1);
}
//—————————————————————
void TFT9341_FillScreen(uint16_t color)
{
TFT9341_SetAddrWindow(0,0,X_SIZE-1,Y_SIZE-1);
TFT9341_Flood(color,(long)X_SIZE*(long)Y_SIZE);
}
//—————————————————————
Для функции TFT9341_FillScreen напишем прототип и вызовем ее в main()
TFT9341_ini();
TFT9341_FillScreen(RED);
/* USER CODE END 2 */
Соберем, прошьем, проверим.
У нас дисплей светится красным цветом.
Добавим глобальную переменную в файл ili9341.c
//—————————————————————
extern RNG_HandleTypeDef hrng;
uint16_t X_SIZE = 0;
Напишем функцию для установки случайного цвета для дисплея
uint16_t TFT9341_RandColor(void)
{
return HAL_RNG_GetRandomNumber(&hrng)&0x0000FFFF;
}
//—————————————————————
Т
акже создадим для данной функции прототип.
Напишем небольшой тест в функции main(). Для этого сначала добавим переменную для счетчика циклов (заодно уберем переменную str)
/* USER CODE BEGIN 1 */
uint16_t i;
/* USER CODE END 1 */
Теперь собственно тест
TFT9341_ini();
for(i=0;i<20;i++)
{
TFT9341_FillScreen(TFT9341_RandColor());
HAL_Delay(150);
}
TFT9341_FillScreen(BLACK);
HAL_Delay(500);
Соберем и прошьем проект. Мы должны увидеть вот такое на экране нашего дисплея TFT окрашивание дисплея в разные цвета раз в 0,15 секунд
Теперь попробуем написать функцию для закрашивания произвольной прямоугольной области дисплея, а не всего экрана
void TFT9341_FillRectangle(uint16_t color, uint16_t x1, uint16_t y1,
uint16_t x2, uint16_t y2)
{
TFT9341_SetAddrWindow(x1, y1, x2, y2);
TFT9341_Flood(color, (uint16_t)(x2-x1+1) * (uint16_t)(y2-y1+1));
}
//—————————————————————
Сделаем прототип функции и напишем ещё один лёгонький тест в main()
HAL_Delay(500);
for(i=0;i<20;i++)
{
TFT9341_FillRectangle(TFT9341_RandColor(),0,0,119,159);
HAL_Delay(100);
TFT9341_FillRectangle(TFT9341_RandColor(),120,0,239,159);
HAL_Delay(100);
TFT9341_FillRectangle(TFT9341_RandColor(),0,160,119,319);
HAL_Delay(100);
TFT9341_FillRectangle(TFT9341_RandColor(),120,160,239,319);
HAL_Delay(100);
}
HAL_Delay(500);
TFT9341_FillScreen(BLACK);
Соберем и прошьем проект. Если всё правильно, то должна получиться вот такая картина
В следующей части мы продолжим писать другие тесты и функции дисплея.
Предыдущая часть Программирование МК STM32 Следующая часть
Техническая документация на контроллер дисплея
Отладочную плату можно приобрести здесь STM32F4-DISCOVERY
Переходник I2C to LCD можно приобрести здесьI2C to LCD1602 2004
Где приобрести именно такой дисплей TFT 240×320, написать затрудняюсь, так как может прийти не всегда именно такой дисплей, какой заявлен в продаже. Либо придет подключаемый по SPI, либо с другим контроллером. Поэтому все тонкости уточняйте у продавца.
Смотреть ВИДЕОУРОК в RuTube (нажмите на картинку)
Смотреть ВИДЕОУРОК в YouTube (нажмите на картинку)
Добавить комментарий