硬件: STC12C5A60S2 + LCD12864 (ic ST7565,裸屏,不带字库)
现象:
1 ,字符串只显示“正”字,则“正”字后面多显示相连的字符串。
2,字符串显示含有“正”字的多个汉字,则显示乱码。
3,显示其它汉字都正常,就是"正"字不正常,把字库中“正”的国标码索引替换为其它汉字索引,可以正常显示出“正”字模。
"正", 0x00,0x02,0x02,0xC2,0x02,0x02,0x02,0xFE,
0x82,0x82,0x82,0xC2,0x83,0x02,0x00,0x00,
0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x7F,
0x40,0x40,0x40,0x40,0x40,0x60,0x40,0x00
//
// 显示1个汉字 16*16
//
void ST7565_ShowChina(u8 x,u8 y, u8 *hz)
{
u8 k,j,ch_w;
for(k=0;k<sizeof(GB_16)/sizeof(GB_16[0]);k++) //sizeof 函数,求得字库中汉字个数
{
if((hz[0] == GB_16[k].Index[0]) && (hz[1] == GB_16[k].Index[1])) { break;} //汉字两字节国标码比较,相同,则得到汉字所在数组序号k
}
ST7565_Setadd(x,y);
for(j=0;j<16;j++) //显示字模的前16字节
{
ch_w=GB_16[k].Msk[j]; //对应字库中的一个字节
ST7565_WriteData(ch_w); //显示一个字节
}
ST7565_Setadd(x,y+1);
for(j=0;j<16;j++) //显示字模的后16字节
{
ch_w=GB_16[k].Msk[16+j]; //对应字库中的1个字节
ST7565_WriteData(ch_w); //显示1个字节
}
}
// 显示字符串 字符8*16 汉字16*16
// 地址x,y *p:要显示的字符串
void ST7565_ShowStr(u8 x,u8 y,u8 *p)
{
u8 i=0;
while(p>0x20) ASCII码的起始0x20
{
if(p<0x80) // 索引在字符区间,显示字符
{
ST7565_ShowChar_16(x,y,p);
x+=8; //显示完一个字符,坐标X+8
i++; //字模字节序号+1
}
if(p>0xa0) // 索引在汉字国标码区间,显示汉字
{
T7565_ShowChina(x,y,&p);
x+=16; //显示完一个汉字,坐标X+16
i++; //字模字节序号+2
}
}
}
主程序
ST7565_ShowStr(8,0,"码表");
ST7565_ShowStr(8,2,"看门狗测试");
ST7565_ShowStr(8,4,"正"); //本是要写“正弦波”,但是显示错误
ST7565_ShowStr(8,6,"电压表");
只发现“正”字的字符串显示不正常,怀疑程序对“正”的国标码(0xD5,0xFD)处理有误,请高手帮忙分析一下!!花两天时间了还是没找出原因。
|