Урок 37
Часть 7
Дисплей TFT 240×320 8bit
В прошлой части данного урока мы написали очень сложную функцию по работе со шрифтами, так как шрифты у нас будут подгружаться не из массивов, а с внешнего USB Flesh, который мы подключили к плате посредством кабеля OTG.
Ну, раз уж функция такая сложная, то не обошлось без ошибок. Давайте их исправлять. Их целых 8. Вообще весь этот процесс интереснее всего смотреть в видеоуроке, потому что текст функции, размещенной в прошлом занятии, написан без ошибок.
Работа над ошибками:
1.
typedef struct _tFont
{
uint16_t Width;
uint16_t Heigth Height;
} sFONT;
2.
void TFT9341_FontsIni(void)
{
Font8.Heigth Height=8;
Font8.Width=5;
Font12.Heigth Height=12;
Font12.Width=7;
Font16.Heigth Height=16;
Font16.Width=11;
Font20.Heigth Height=20;
Font20.Width=14;
Font24.Heigth Height=24;
Font24.Width=17;
3.
if((x+width)>=X_SIZE) return;
switch(height)
4.
height = lcdprop.pFont->Heigth Height;
uint16_t fontsize=0;//размер символа в байтах в таблице
5.
uint16_tuint32_t line=0;//горизонтальная линия пикселей шрифта
6.
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]); (вместо двух || одна |)
7.
TFT9341_DrawPixel(x+j,y,lcdprop.TextColor);
}
else
if(line&(1<<(width-j+offset1-1)))
{
8.
TFT9341_DrawPixel(x+j,y,lcdprop.BackColor);
}
y++;
}
y++;
}
Добавим прототип данной функции в хедер-файл.
Напишем ещё три функции для установки размера шрифта, цвета шрифта и цвета фона символа
//—————————————————————
void TFT9341_SetFont(uint8_t f)
{
switch(f)
{
case 8:
f_close(&MyFile);
if(f_open(&MyFile, «font8.bin», FA_READ) != FR_OK)
{
Error_Handler();
}
else
{
lcdprop.pFont=&Font8;
}
break;
case 12:
f_close(&MyFile);
if(f_open(&MyFile, «font12.bin», FA_READ) != FR_OK)
{
Error_Handler();
}
else
{
lcdprop.pFont=&Font12;
}
break;
case 16:
f_close(&MyFile);
if(f_open(&MyFile, «font16.bin», FA_READ) != FR_OK)
{
Error_Handler();
}
else
{
lcdprop.pFont=&Font16;
}
break;
case 20:
f_close(&MyFile);
if(f_open(&MyFile, «font20.bin», FA_READ) != FR_OK)
{
Error_Handler();
}
else
{
lcdprop.pFont=&Font20;
}
break;
case 24:
f_close(&MyFile);
if(f_open(&MyFile, «font24.bin», FA_READ) != FR_OK)
{
Error_Handler();
}
else
{
lcdprop.pFont=&Font24;
}
break;
}
}
//—————————————————————
void TFT9341_SetTextColor(uint16_t color)
{
lcdprop.TextColor=color;
}
//—————————————————————
void TFT9341_SetBackColor(uint16_t color)
{
lcdprop.BackColor=color;
}
//—————————————————————
Добавим на них на все прототипы
Напишем тест вывода символов на экран в теле функции FileReadWrite
Предыдущие тесты пока закомментируем
else
{
TFT9341_FillScreen(BLACK);
while(1)
{
TFT9341_FillScreen(BLACK);
TFT9341_SetTextColor(YELLOW);
TFT9341_SetBackColor(BLUE);
TFT9341_SetFont(24);
TFT9341_DrawChar(10, 10, (uint8_t)'S');
TFT9341_DrawChar(27, 10, (uint8_t)'t');
TFT9341_DrawChar(44, 10, (uint8_t)'m');
TFT9341_DrawChar(61, 10, (uint8_t)'3');
TFT9341_DrawChar(78, 10, (uint8_t)'2');
TFT9341_SetTextColor(GREEN);
TFT9341_SetBackColor(RED);
TFT9341_SetFont(20);
TFT9341_DrawChar(10, 34, (uint8_t)'S');
TFT9341_DrawChar(24, 34, (uint8_t)'t');
TFT9341_DrawChar(38, 34, (uint8_t)'m');
TFT9341_DrawChar(52, 34, (uint8_t)'3');
TFT9341_DrawChar(66, 34, (uint8_t)'2');
TFT9341_SetTextColor(BLUE);
TFT9341_SetBackColor(YELLOW);
TFT9341_SetFont(16);
TFT9341_DrawChar(10, 54, (uint8_t)'S');
TFT9341_DrawChar(21, 54, (uint8_t)'t');
TFT9341_DrawChar(32, 54, (uint8_t)'m');
TFT9341_DrawChar(43, 54, (uint8_t)'3');
TFT9341_DrawChar(54, 54, (uint8_t)'2');
TFT9341_SetFont(12);
TFT9341_SetTextColor(CYAN);
TFT9341_SetBackColor(BLACK);
TFT9341_DrawChar(10, 70, (uint8_t)'S');
TFT9341_DrawChar(17, 70, (uint8_t)'t');
TFT9341_DrawChar(24, 70, (uint8_t)'m');
TFT9341_DrawChar(31, 70, (uint8_t)'3');
TFT9341_DrawChar(38, 70, (uint8_t)'2');
TFT9341_SetFont(8);
TFT9341_SetTextColor(RED);
TFT9341_SetBackColor(GREEN);
TFT9341_DrawChar(10, 82, (uint8_t)'S');
TFT9341_DrawChar(15, 82, (uint8_t)'t');
TFT9341_DrawChar(20, 82, (uint8_t)'m');
TFT9341_DrawChar(25, 82, (uint8_t)'3');
TFT9341_DrawChar(30, 82, (uint8_t)'2');
HAL_Delay(5000);
}
}
Соберем, прошьем, посмотрим
Напишем функцию для вывода строки символов
void TFT9341_String(uint16_t x, uint16_t y, char *str)
{
while (*str)
{
TFT9341_DrawChar(x,y,str[0]);
x += lcdprop.pFont->Width;
(void)*str++;
}
}
//—————————————————————
Напишем прототип и попробуем повыводить строки в main.c в функции FileReadWrite
Создадим переменную
void FileReadWrite(void)
{
uint8_t i=0;
if(f_mount(&USBDISKFatFs,(TCHAR const*)USBH_Path,0)!=FR_OK)
Предыдущий код вывода отдельных символов закомментируем
Вот собственно тест
// HAL_Delay(10000);
TFT9341_SetTextColor(YELLOW);
TFT9341_SetBackColor(BLUE);
for(i=0;i<16;i++)
{
TFT9341_SetFont(24);
TFT9341_FillScreen(BLACK);
TFT9341_String(1, 100, «ABCDEF12345678»);
TFT9341_SetFont(20);
TFT9341_String(1, 124, «ABCDEFGHI12345678»);
TFT9341_SetFont(16);
TFT9341_String(1, 144, «ABCDEFGHIKL 123456789»);
TFT9341_SetFont(12);
TFT9341_String(1, 160, «ABCDEFGHIKLMNOPQRSTUVWXY 123456789»);
TFT9341_SetFont(8);
TFT9341_String(1, 172, «ABCDEFGHIKLMNOPQRSTUVWXYZ 123456789 ABCDEFGHIKL»);
HAL_Delay(2000);
TFT9341_SetRotation(i%4);
}
Так как мы до конца написали данную функцию только в следующей части занятия, то и тест мы посмотрим тоже в ней.
Предыдущая часть Программирование МК STM32 Следующая часть
Техническая документация на контроллер дисплея
Отладочную плату можно приобрести здесь STM32F4-DISCOVERY
Переходник I2C to LCD можно приобрести здесьI2C to LCD1602 2004
Где приобрести именно такой дисплей TFT 240×320, написать затрудняюсь, так как может прийти не всегда именно такой дисплей, какой заявлен в продаже. Либо придет подключаемый по SPI, либо с другим контроллером. Поэтому все тонкости уточняйте у продавца.
Смотреть ВИДЕОУРОК в RuTube (нажмите на картинку)
Смотреть ВИДЕОУРОК в YouTube (нажмите на картинку)
Добавить комментарий