STM32F407 OLED汉字显示实验
中文占2个字节,英文及字符占一个字节。GBK汉字编码有两个字节,第一个字节为区码,第二个字节为段码。汉字的区码是一定大于127的,因此在编写显示函数的时候,可以判断GBK编码的第一个字节是否大于127来确定汉字还是字符。
---
实验环境:STM32407探索者,正点原子的OLED例程
需要软件:MDK,PCtoLCD2002完美版
---
首先用PCtoLCD2002生成需要显示的字模

这里的生成配置不是固定的,如果改变了生成方式,就要相对应的改变显示函数的代码。
- typedef struct
- {
- u16 Index;
- u8 Msk[32];
- } GBK16;
- //正(0) 点(1) 原(2) 子(3)
- GBK16 zifu[] ={
- '正',0x00,0x02,0x02,0xC2,0x02,0x02,0x02,0xFE,0x82,0x82,0x82,0x82,0x82,0x02,0x00,0x00,
- 0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,/*"正",0*/
- '点',0x00,0x00,0xC0,0x40,0x40,0x40,0x7F,0x48,0x48,0x48,0x48,0xC8,0x08,0x08,0x00,0x00,
- 0x80,0x40,0x37,0x04,0x04,0x14,0x64,0x04,0x14,0x64,0x04,0x07,0x10,0xE0,0x00,0x00,/*"点",1*/
- '原',0x00,0x00,0xFE,0x02,0x02,0xF2,0x92,0x9A,0x96,0x92,0x92,0xF2,0x02,0x02,0x02,0x00,
- 0x80,0x60,0x1F,0x40,0x20,0x17,0x44,0x84,0x7C,0x04,0x04,0x17,0x20,0x40,0x00,0x00,/*"原",2*/
- '子',0x80,0x82,0x82,0x82,0x82,0x82,0x82,0xE2,0xA2,0x92,0x8A,0x86,0x82,0x80,0x80,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"子",3*/
- };
- //{
- // {'正', 0x00, 0x02, 0x02, 0xC2, 0x02, 0x02, 0x02, 0xFE, 0x82, 0x82, 0x82, 0x82, 0x82, 0x02, 0x00, 0x00,
- // 0x40, 0x40, 0x40, 0x7F, 0x40, 0x40, 0x40, 0x7F, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00}, /*"正",0*/
- // {'点', 0x00, 0x00, 0xC0, 0x40, 0x40, 0x40, 0x7F, 0x48, 0x48, 0x48, 0x48, 0xC8, 0x08, 0x08, 0x00, 0x00,
- // 0x80, 0x40, 0x37, 0x04, 0x04, 0x14, 0x64, 0x04, 0x14, 0x64, 0x04, 0x07, 0x10, 0xE0, 0x00, 0x00}, /*"点",1*/
- // {'原', 0x00, 0x00, 0xFE, 0x02, 0x02, 0xF2, 0x92, 0x9A, 0x96, 0x92, 0x92, 0xF2, 0x02, 0x02, 0x02, 0x00,
- // 0x80, 0x60, 0x1F, 0x40, 0x20, 0x17, 0x44, 0x84, 0x7C, 0x04, 0x04, 0x17, 0x20, 0x40, 0x00, 0x00}, /*"原",2*/
- // {'子', 0x80, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0xE2, 0xA2, 0x92, 0x8A, 0x86, 0x82, 0x80, 0x80, 0x00,
- // 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,} /*"子",3*/
- //};
- void OLED_DrawPoints(u8 x, u8 y, u8 t)
- {
- u8 i, dat=t;
- for (i = 0; i < 8; i++)
- {
- if (dat & 0x01)
- OLED_DrawPoint(x, y++, 1);
- else
- OLED_DrawPoint(x, y++, 0);
- dat >>= 1;
- }
- }
- void OLED_Print(u8 x, u8 y, char *str)
- {
- unsigned char i, k, t, length;
- unsigned short Index = 0;
- length = strlen(str);//取字符串总长
- for (k = 0; k < length; k++)
- {
- //字符显示
- if (*(str + k) <= 127) //小于128是ASCII符号
- {
- OLED_ShowChar(x, y, *(str + k), 16, 1);
- x += 8;//x坐标右移8
- }
- //中文显示
- else if (*(str + k) > 127) //大于127,为汉字,前后两个组成汉字内码
- {
- Index = (*(str + k) << 8) | (*(str + k + 1)); //取汉字的内码
- for (i = 0; i < sizeof(zifu) / 34; i++) //查数组 一个汉字34个字节
- {
- if (Index == zifu[i].Index)
- {
- //查询到这个字
- for (t = 0; t < 16; t++)
- {
- OLED_DrawPoints(x+t, y, zifu[i].Msk[t]);
- }
- for (t = 0; t < 16; t++)
- {
- OLED_DrawPoints(x+t, y+8, zifu[i].Msk[t+16]);
- }
- x += 16;
- k += 1; //汉字占两位,所以跳一位
- }
- }
- }
- }
- }
复制代码 上面这部分代码是要添加的代码,在OLED例程上添加进去。这里我生成了正点原子四个字的字模,大家可以根据自己的需要生成字模。
这里其实完全可以根据自己字模生成的方式来进行修改,这里我生成的汉字是16x16的,而一个字节才8为,所以16个字节才显示上半个字,我是行列式,所以先显示每个字都先显示半个字,然后再回来显示下半个字。
附件放出来了,有需要的可以下载下来参考一下
|