读字库遇到坑爹的问题
转载请注明出处:http://blog.csdn.net/qq_26093511/article/details/53099262
最近在做一个led显示屏的项目, 我想显示 “常”,“州”,“大”,“学”这几个字,但是只能显示 “常” 和 “大”,其他两个字是乱码。坑啊,一直在查找问题所在,但是一直没找到,试了各种方法:换查找字库的索引,修改变量类型,但是还是不行!
下面是部分代码:
unsigned char xdata Font_H,Font_L;
unsigned long xdata addr;
unsigned char col ,num;
io_init();
//time0_init();
variable_init();
for(col=0;col<4;col++)
{
Font_L =chepai[col][0];
Font_H =chepai[col][1];
addr =(unsigned long)(Font_L-0xa1)*0xbc0;
addr = addr + (Font_H-0xa1)*0x20;
// for(num =0; num<32;num++)
{
W25Q16_Read(addr ,Tmp[col],32);
}
}
经过仿真,发现 “常” 的索引字是 0x0000D3C0 ,“州”索引值是0x00027640 ,“大“的索引值是0x0000E980,”学“的索引值是0x000234C0
我们发现常大是16位的,而州和学超过了16位而显示乱码,所以猜测 数据溢出,定义的变量类型太小。而unsigned long 就是32位的,所以索引的地址变量没问题,进而猜测 W25Q16的底层读函数有点问题,我们进入 void W25Q16_Read(unsigned int address,uchar *date,uchar j) , 发现了问题所在!!
unsigned int 是16位的,所以索引值超过16位,就会溢出,从而引发错误!
只需把 unsigned int 改成 unsigned long 就行了
在此非常感谢郑老师的帮助!