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



Урок 37

Часть 5

 

Дисплей TFT 240×320 8bit

 

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

Сегодня мы также продолжим данное интересное дело.

Добавим функцию отрисовки прямоугольника, но уже не закрашенного

 

void TFT9341_DrawRect(uint16_t color, uint16_t x1, uint16_t y1,

                                                         uint16_t x2, uint16_t y2)

{

        TFT9341_DrawLine(color,x1,y1,x2,y1);

        TFT9341_DrawLine(color,x2,y1,x2,y2);

        TFT9341_DrawLine(color,x1,y1,x1,y2);

        TFT9341_DrawLine(color,x1,y2,x2,y2);

}

//—————————————————————

 

Напишем прототип и соответственно тест в main()

 

        TFT9341_FillScreen(BLACK);

         for(j=0;j<20;j++)

        {

                for(i=0;i<120;i++)

                {

                        TFT9341_DrawRect(TFT9341_RandColor(),i,i,239-i,319-i);

                }

                HAL_Delay(100);

                if(j<19)TFT9341_FillScreen(BLACK);

        }

        HAL_Delay(1000);

         TFT9341_FillScreen(BLACK);

 

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

 

 

Соберём проект, прошьём контроллер и посмотрим результат

 

image08

 

Теперь напишем функцию рисования на дисплее окружности с определенным радиусом

 

void TFT9341_DrawCircle(uint16_t x0, uint16_t y0, int r, uint16_t color)

{

        int f = 1-r;

        int ddF_x=1;

        int ddF_y=-2*r;

        int x = 0;

        int y = r;

        TFT9341_DrawPixel(x0,y0+r,color);

        TFT9341_DrawPixel(x0,y0-r,color);

        TFT9341_DrawPixel(x0+r,y0,color);

        TFT9341_DrawPixel(x0-r,y0,color);

        while (x<y)

        {

                if (f>=0)

                {

                        y—;

                        ddF_y+=2;

                        f+=ddF_y;

                }

                x++;

                ddF_x+=2;

                f+=ddF_x;

                TFT9341_DrawPixel(x0+x,y0+y,color);

                TFT9341_DrawPixel(x0-x,y0+y,color);

                TFT9341_DrawPixel(x0+x,y0-y,color);

                TFT9341_DrawPixel(x0-x,y0-y,color);

                TFT9341_DrawPixel(x0+y,y0+x,color);

                TFT9341_DrawPixel(x0-y,y0+x,color);

                TFT9341_DrawPixel(x0+y,y0-x,color);

                TFT9341_DrawPixel(x0-y,y0-x,color);

        }

}

//—————————————————————

 

 

Создадим прототип данной функции, и, соответственно тест в main()

 

        TFT9341_FillScreen(BLACK);

         for(i=0;i<2000;i++)

        {

                TFT9341_DrawCircle(HAL_RNG_GetRandomNumber(&hrng)%200+20,

                HAL_RNG_GetRandomNumber(&hrng)%280+20, 20,

                                                          TFT9341_RandColor());

        }

        HAL_Delay(1000);

        TFT9341_FillScreen(BLACK);

 

Посмотрим результат данного теста, предварительно собрав проект и прошив контроллер

 

image09

 

Теперь попробуем поработать с символами. Чтобы не занимать много оперативной и флеш-памяти контроллера, подключим к нему по USB OTG FS фшеш-накопитель, на который скопируем заранее созданные файлы пяти шрифтов различной высоты. Данные шрифты даны в папке с примерами Keil, но они там даны в текстовых массивах, которые я преобразовал в бинарные файлы, кстати тоже не без помощи контроллера stm32 и библиотеки FATFS (файлы будут прикреплены в конце части).

Подключим USB Flash к Discovery через OTG-кабель точно так же, как мы это проделывали в уроке 36, когда изучали класс USB Mass Storage.

Напишем еще несколько переменных в файл ili9341.c

 

uint32_t dtt=0;

uint32_t  TextColor;

uint32_t  BackColor;

uint8_t *pchar, *str2;

extern FIL MyFile;                   /* File object */

extern void Error_Handler(void);

//—————————————————————

void TFT9341_Delay(uint32_t dly)

 

Теперь добавим две структурки и еще несколько переменных.

 

extern void Error_Handler(void);

 

typedef struct _tFont

{    

  uint16_t Width;

  uint16_t Height;

 

} sFONT;

 

typedef struct

{

  uint32_t  TextColor;

  uint32_t  BackColor;  

  sFONT     *pFont;

}LCD_DrawPropTypeDef;

 

sFONT Font24;

sFONT Font20;

sFONT Font16;

sFONT Font12;

sFONT Font8;

 

LCD_DrawPropTypeDef lcdprop;

 

Напишем функцию установки шрифтов по умолчанию

 

void TFT9341_FontsIni(void)

{

                Font8.Height=8;

                Font8.Width=5;

                Font12.Height=12;

                Font12.Width=7;

                Font16.Height=16;

                Font16.Width=11;

                Font20.Height=20;

                Font20.Width=14;

                Font24.Height=24;

                Font24.Width=17;

                lcdprop.BackColor=BLACK;

                lcdprop.TextColor=GREEN;

                lcdprop.pFont=&Font16;

}

//—————————————————————

 

Вызовем ее в инициализации в самом конце функции

        HAL_Delay(150);

        TFT9341_FontsIni();

}

 

В следующей части мы продолжим работу со шрифтами.

 

 

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

 

 

Cодержимое FLASH Drive

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

 

 

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

STM32F4-DISCOVERY

Дисплей LCD 20×4

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

 

 

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

 

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

2 комментария на “STM Урок 37. Дисплей TFT 240×320 8bit. Часть 5
  1. Сергей:

    я переписал функцию рисования окружности, код стал выглядеть красивей)
    да и переменных меньше стало.

    void ILI_9341_DrawCircle(int16_t x0, int16_t y0, int16_t r, uint32_t color) {
    int16_t f = 1 — r;
    int16_t x = 0;
    int16_t y = r;

    while (x = 0)
    {
    y—;
    f -=y*2;
    }

    ILI_9341_DrawPixel(x0 + x, y0 + y, color); // Punkt 1
    ILI_9341_DrawPixel(x0 — x, y0 + y, color); // Punkt 2
    ILI_9341_DrawPixel(x0 + x, y0 — y, color); // Punkt 3
    ILI_9341_DrawPixel(x0 — x, y0 — y, color);

    ILI_9341_DrawPixel(x0 + y, y0 + x, color); // Punkt 5
    ILI_9341_DrawPixel(x0 — y, y0 + x, color); // Punkt 6
    ILI_9341_DrawPixel(x0 + y, y0 — x, color); // Punkt 7
    ILI_9341_DrawPixel(x0 — y, y0 — x, color); // Punkt 8

    x++;
    f += x*2-1;
    }
    }

  2. Сергей:

    для тех кому интересно, привожу код рисования закрашенной окружности

    void ILI_9341_DrawFillCircle(int16_t x0, int16_t y0, int16_t r, uint32_t color) {
    int16_t f = 1 — r;
    int16_t x = 0;
    int16_t y = r;

    while (x = 0) {
    y—;
    f -=y*2;
    }

    ILI_9341_DrawLine(x0 — x, y0 + y, x0 + x, y0 + y, color); // 2-1
    ILI_9341_DrawLine(x0 + x, y0 — y, x0 — x, y0 — y, color); // 3-4

    ILI_9341_DrawLine(x0 + y, y0 + x, x0 — y, y0 + x, color); // 5-6
    ILI_9341_DrawLine(x0 + y, y0 — x, x0 — y, y0 — x, color); // 7-8

    x++;
    f += x*2-1;
    }
    }

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

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

*