STM Урок 37. Дисплей TFT 240×320 8bit. Часть 3



Урок 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 */

Соберем, прошьем, проверим.

У нас дисплей светится красным цветом.

 

image03

 

 

Добавим глобальную переменную в файл 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);

 

Соберем и прошьем проект. Если всё правильно, то должна получиться вот такая картина

 

image04

 

В следующей части мы продолжим писать другие тесты и функции дисплея.

 

 

Предыдущая часть Программирование МК STM32 Следующая часть

 

 

Техническая документация на контроллер дисплея

 

 

Отладочную плату и дисплей LCD 20×4 можно приобрести здесь:

STM32F4-DISCOVERY

Дисплей LCD 20×4

Где приобрести именно такой дисплей TFT 240×320, написать затрудняюсь, так как может прийти не всегда именно такой дисплей, какой заявлен в продаже. Либо придет подключаемый по SPI, либо с другим контроллером. Поэтому все тонкости уточняйте у продавца.

 

 

Смотреть ВИДЕОУРОК (нажмите на картинку)

STM Дисплей TFT 240x320 8bit

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*