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



Урок 37

Часть 6

 

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

 

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

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

 

 

Напишем функцию вывода символа на экран дисплея (все объяснения кода вы можете услышать, глядя видеоверсию урока, прикреплённую ниже)

 

void TFT9341_DrawChar(uint16_t x, uint16_t y, uint8_t s)

{

  FRESULT res;          /* FatFs function common result code */

        uint32_t bytesread;

        uint8_t charbuf[100];

  uint32_t i = 0, j = 0;

  uint16_t height, width;

  width  = lcdprop.pFont->Width;

  height  = lcdprop.pFont->Height;

        uint16_t fontsize=0; //размер символа в байтах в таблице

  uint32_t line=0; //горизонтальная линия пикселей шрифта

  uint8_t offset1; //разница между реальной шириной и шириной в байтах

        uint16_t offsetfile=0;//Смещение символа в файле шрифта

        

        if ((x+lcdprop.pFont->Width)>=X_SIZE) return;

        switch(lcdprop.pFont->Height)

        {

                case 8:

                        offset1=3;

                        fontsize=8;//размер символа в байтах

                        HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_SET);

                        offsetfile=(s-' ')*fontsize;

                        f_lseek(&MyFile,offsetfile);

                        res = f_read(&MyFile, charbuf, 8, (void *)&bytesread);

                        if((bytesread == 0) || (res != FR_OK))

                        {

                                Error_Handler();

                        }

                        break;

                case 12:

                        offset1=1;

                        fontsize=12;//размер символа в байтах

                        HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_SET);

                        offsetfile=(s-' ')*fontsize;

                        f_lseek(&MyFile,offsetfile);

                        res = f_read(&MyFile, charbuf, 12, (void *)&bytesread);

                        if((bytesread == 0) || (res != FR_OK))

                        {

                                Error_Handler();

                        }

                        break;

                case 16:

                        offset1=5;

                        fontsize=32;//размер символа в байтах

                        HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_SET);

                        offsetfile=(s-' ')*fontsize;

                        f_lseek(&MyFile,offsetfile);

                        res = f_read(&MyFile, charbuf, 32, (void *)&bytesread);

                        if((bytesread == 0) || (res != FR_OK))

                        {

                                Error_Handler();

                        }

                        break;

                case 20:

                        offset1=2;

                        fontsize=40;//размер символа в байтах

                        HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_SET);

                        offsetfile=(s-' ')*fontsize;

                        f_lseek(&MyFile,offsetfile);

                        res = f_read(&MyFile, charbuf, 40, (void *)&bytesread);

                        if((bytesread == 0) || (res != FR_OK))

                        {

                                Error_Handler();

                        }

                        break;

                case 24:

                        offset1=7;

                        fontsize=72;//размер символа в байтах

                        HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_SET);

                        offsetfile=(s-' ')*fontsize;

                        f_lseek(&MyFile,offsetfile);

                        res = f_read(&MyFile, charbuf, 72, (void *)&bytesread);

                        if((bytesread == 0) || (res != FR_OK))

                        {

                                Error_Handler();

                        }

                        break;

        }

 

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

        {

                if((height==8)||(height==12))        line=charbuf[i];

                else if((height==16)||(height==20)) line=(charbuf[i*2]<<8)|(charbuf[i*2+1]);

                else line=(charbuf[i*3]<<16)|(charbuf[i*3+1]<<8)|(charbuf[i*3+2]);

//                line=0xFFFF;

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

                {

                                if (line&(1<<(width-j+offset1-1)))

                                {

                                        TFT9341_DrawPixel(x+j,y,lcdprop.TextColor);

                                }

                                else

                                {

                                        TFT9341_DrawPixel(x+j,y,lcdprop.BackColor);

                                }

                }

                y++;

        }

}

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

 

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

 

 

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

 

 

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

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

 

 

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

STM32F4-DISCOVERY

Дисплей LCD 20×4

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

 

 

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

 

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

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

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

*