读字库遇到坑爹的问题

转载请注明出处: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 就行了



在此非常感谢郑老师的帮助!

posted @ 2016-11-09 14:37  隔壁王叔叔a  阅读(147)  评论(0编辑  收藏  举报