在STM32中怎样在LCD显示屏中对汉字进行显示(只是汉字),下面针对这个问题是我的一点小小的看法,如有问题希望读者留言;
以下程序主要针对STM32中库函数进行操作:
在LCD显示汉字,首先需要对汉字进行取模,我们都知道一个汉字所占用的空间大小是2B。接下来通过取模软件对所需要显示的汉字进行取模(注意有的取模软件可能存在问题)。
在这我们要补充一个知识就是汉字在计算机中存储形式:
输入码:汉字的字数繁多,字形复杂,常用的汉字有6000—7000个,比英文的26个字母要多得多。在计算机系统中使用汉字,首先遇到的问题就是如何把汉字输入到计算机内。为了能直接使用西文标准 进行输入,必须为汉字设计相应的编码方法。汉字编码方法主要分为三类:数字编码、拼音编码和字形编码。
机内码:计算机中字符的实际存储码。如西文字符,在计算机中是以ascii码的形式进行存储的,而我们的汉字,是在区位码的基础上加上A0H(16进制),就变成了汉字在计算集中的存储码,也就是机内码。 汉字点阵码是一种用黑白两色点阵来表示汉字字形的编码。
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;
}
}
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闪烁
}
}
具体的LED和TFT的初始化各位应该都是很清楚的,在这就不多说了。