以下资料为网络搜集,发现很多都为"原创",无法判断作者了. 自己理解后整理,看官自己另行查找详源
.
也可以参考一下这文章 : STM32F429 之 LTDC汉字显示_ 开发效果图(含代码下载包)
1:一个汉字所占用的空间大小是2B
2: 机内码:计算机中字符的实际存储码。如西文字符,是以ascii码的形式进行存储的,而汉字,是在区位码的基础上加上0xA0,就变成了汉字在计算集中的存储码,也就是机内码。
定义汉字点阵结构体
typedef struct typFNT_GB16 // 汉字字模数据结构
{
signed char Index[2]; // 汉字内码索引
char Msk[32]; // 点阵码数据
};
紧接着建立自己所需的字库,在这我随意创建一个:
struct typFNT_GB16 code GB_16[] = // 数据表
{
"饼", 0x20,0x00,0x21,0x08,0x20,0x90,0x3C,0x00,
0x47,0xFC,0x48,0x90,0xA0,0x90,0x20,0x94,
0x27,0xFE,0x20,0x90,0x20,0x90,0x24,0x90,
0x28,0x90,0x31,0x10,0x22,0x10,0x04,0x10,
"昌", 0x1F,0xF0,0x10,0x10,0x10,0x10,0x1F,0xF0,
0x10,0x10,0x10,0x10,0x1F,0xF0,0x00,0x08,
0x3F,0xFC,0x20,0x08,0x20,0x08,0x3F,0xF8,
0x20,0x08,0x20,0x08,0x3F,0xF8,0x20,0x08,
"除", 0x00,0x40,0x78,0x40,0x48,0xA0,0x50,0xA0,
0x51,0x10,0x62,0x0E,0x55,0xF4,0x48,0x40,
0x48,0x50,0x4F,0xFC,0x68,0x40,0x51,0x50,
0x42,0x4C,0x44,0x44,0x41,0x40,0x40,0x80,
}
其中定义的汉字结构体元素中Index[2]存放汉字,而Msk用于存放点阵码。
具体程序如下:
void show_chinese(uint16_t x, uint16_t y, uint8_t *p, uint16_t wordColor, uint16_t backColor)
{
uint8_t i, wordByte ;
uint16_t color,wordNum;
u8 k=0;
while(*p != '\0')
{
for(wordNum=0;wordNum<3;wordNum++)
{
if(*p==chinese[wordNum].Index[0] && *(p+1)==chinese[wordNum].Index[1])
{
tft_set_window(x, y, x+15, y+15);
for(wordByte = 0;wordByte < 32; wordByte++)
{
uint8_t color = chinese[wordNum].Msk[wordByte];
for ( k = 0;k<8; k++)
{
if ((color&0x80) == 0x80) tft_wrdat(wordColor);
else tft_wrdat(backColor);
color = color<<1;
} // end for k
} // end for sordByte
p+=2;
x += 16;
if(x > 225)
{
x = 0;
y += 16;
}
}
}
}
}
其中tft_set_window(x, y, x+15, y+15)设置要操作的窗口范围,tft_wrdat(wordColor)LCD写数据,
然后就可以直接在主函数中进行汉字的显示程序编写:
int main()
{
tft_init(); //TFT彩屏初始化
LED_Init(); //LED初始化
tft_clear_screen(BLACK); //清屏
show_chinese(6,20,"饼昌除",MAGENTA,YELLOW); //YELLOW
while(1)
{
led_display(); //LED闪烁
}
}
代码已验证无错, 大家可参考思路!
加油干~~~