【国民技术低功耗系列N32L43x测评】05.SPI驱动TFT屏&TF卡实现中英文混合显示
[复制链接]
国民N32L43X系列MCU带有2个硬件SPI接口,我们可以使用其中一路来驱动SPI接口的TFT显示屏;虽然这个系列的MCU没有SDIO接口来操作TF卡,但TF卡可以工作在SPI模式,所以我们另外一路SPI可用作来驱动TF卡,通过移植FatFs文件系统来实现对文件的读取操作。
N32L43X系列MCU的SPI接口可工作于主机或从机模式,支持全双工、单工高速通讯模式,具有硬件CRC计算并可配置多主机模式,具有如下特征:
- 全双工和单工同步传输
- 支持主模式、从模式、多主模式
- 8位或16位数据帧格式
- 数据位顺序可编程
- 软件或硬件进行NSS管理
- 时钟极性和相位可编程
- 发送和接收支持硬件CRC计算、校验
- 支持DMA操作
我们使用SPI1接口来驱动TF卡,使用SPI2接口来驱动TFT显示屏,具体的引脚使用分配如下表所示:
复用功能
|
管脚
|
重映射
|
SPI1_NSS
|
PB6
|
AF4
|
SPI1_SCK
|
PB3
|
AF1
|
SPI1_MISO
|
PB4
|
AF1
|
SPI1_MOSI
|
PB5
|
AF0
|
复用功能
|
管脚
|
重映射
|
SPI2_NSS
|
PB12
|
AF0
|
SPI2_SCK
|
PB13
|
AF0
|
SPI2_MISO
|
PB14
|
AF0
|
SPI2_MOSI
|
PB15
|
AF0
|
实现功能
通过N32L43X系列MCU的SPI1接口来驱动TF卡,通过移植FatFs文件系统实现对存放在TF卡中的字库文件GBK_FONT.bin的数据读取操作、通过SPI2接口来驱动TFT显示屏,结合Image2Lcd工具提取图形数据,在TFT显示屏上显示图形、使用存放在MCU FLASH的英文字库点阵数据和存放在TF卡中的GBK中文字库点阵数据,在TFT上实现中英文的混合显示。主要实现代码如下所示:
读取GBK中文汉字字库点阵数据
void FatFs_GetGBK(const char *str, uint8_t *Buffer)
{
FIL File;
FRESULT Result;
UINT br = 0;
uint8_t GBKH = str[0];
uint8_t GBKL = str[1];
uint32_t Offset = 0;
if(GBKL < 0x7F) Offset = ((GBKH - 0x81) * 190 + GBKL - 0x40);
else Offset = ((GBKH - 0x81) * 190 + GBKL - 0x41);
Result = f_open(&File, "/GBK_FONT.bin", FA_OPEN_ALWAYS | FA_READ);
if(Result != RES_OK)
{
printf("\r\nf_open Fail! Result = %d\r\n", Result);
}
else
{
f_lseek(&File, Offset * 32);
Result = f_read(&File, Buffer, 32, &br);
f_close(&File);
}
}
显示图片
void LCD_DrawImage(void)
{
uint16_t Color = 0;
uint32_t Index = 8;
for(uint32_t i = 0; i < 30; i++)
{
for(uint32_t j = 0; j < 113; j++)
{
Color = gImage_LOGO[Index++];
Color <<= 8;
Color |= gImage_LOGO[Index++];
TFT_DrawPoint(64 + j, 30 + i, Color);
}
}
Index = 8;
for(uint32_t i = 0; i < 40; i++)
{
for(uint32_t j = 0; j < 135; j++)
{
Color = gImage_EEWORLD[Index++];
Color <<= 8;
Color |= gImage_EEWORLD[Index++];
TFT_DrawPoint(52 + j, 100 + i, Color);
}
}
}
显示中英文
void TFT_DrawEN(uint16_t StartX, uint16_t StartY, char ch)
{
uint8_t Data = 0;
uint16_t Color = 0;
for(uint8_t i = 0; i < 16; i++)
{
Data = ASCII_1608[ch - 32][i];
for(uint8_t j = 0; j < 8; j++)
{
if((Data >> j) & 0x01) Color = TFT_Forecolor;
else Color = BACKCOLOR;
TFT_DrawPoint(StartX + j, StartY + i, Color);
}
}
}
void TFT_DrawCN(uint16_t StartX, uint16_t StartY, const char *str)
{
uint8_t Buffer[32];
uint8_t Array[16][16];
uint8_t Point[16][16];
FatFs_GetGBK(str, Buffer);
for(uint8_t i = 0; i < 8; i++)
{
for(uint8_t j = 0; j < 4; j++)
{
uint8_t Data = Buffer[i*4+j];
for(uint8_t k = 0; k < 4; k++)
{
if(Data & (0x08 >> (k-0))) Array[i*2+0][j*4+k-0] = 1;
else Array[i*2+0][j*4+k-0] = 0;
}
for(uint8_t k = 4; k < 8; k++)
{
if(Data & (0x80 >> (k-4))) Array[i*2+1][j*4+k-4] = 1;
else Array[i*2+1][j*4+k-4] = 0;
}
}
}
for(uint8_t i = 0; i < 16; i++)
{
for(uint8_t j = 0; j < 16; j++)
{
Point[i][j] = Array[j][15-i];
}
}
for(uint8_t i = 0; i < 16; i++)
{
for(uint8_t j = 0; j < 16; j++)
{
if(Point[15-i][j])
{
TFT_DrawPoint(StartX+i, StartY+j, TFT_Forecolor);
}
else
{
TFT_DrawPoint(StartX+i, StartY+j, BACKCOLOR);
}
}
}
}
void TFT_ShowLOG(uint16_t StartX, uint16_t StartY, const char *str)
{
while(*str != '\0')
{
if(*str < 0x7F)
{
if(StartX > (240 - 8))
{
StartX = 0; StartY += 16;
}
if(StartY > (320 - 16))
{
StartX = 0; StartY = 0;
TFT_ClearScreen(BACKCOLOR);
}
TFT_DrawEN(StartX, StartY, *str);
StartX += 0x08;
str += 0x01;
}
else
{
if(StartX > (240 - 16))
{
StartX = 0; StartY += 16;
}
if(StartY > (320 - 16))
{
StartX = 0; StartY = 0;
TFT_ClearScreen(BACKCOLOR);
}
TFT_DrawCN(StartX, StartY, str);
StartX += 0x10;
str += 0x02;
}
}
}
其它比如SPI的配置、TFT显示屏的驱动及配置、TF卡的读写操作、FATFS文件系统的移植等等代码,具体可以参考附件中的软件工程源代码。
运行效果
附件
软件工程源代码:
Template_TFT.zip
(2.54 MB, 下载次数: 37)
|