一、缘起
这两天改善MCU的液晶显现办法,选用“即编即显”的思路,编写了一个能够直接显现字符串的程序。如程序调用disstr(“我是你老爸”);液晶屏上就会显现“我是你老爸”。
二、问题
可是,花了1天多时刻辛辛苦苦改好的程序后,却发现有些汉字显现有问题。比方:
P1:在榜首行显现“实时参数”,第二行显现“作业状况”,实际上“作业状况”却重复显现了,除了在正确的当地显现外,还在“实时参数”后显现了。
P2:”正”字后若有”:”,则都显现成乱码。假如后边没有”:”,则”正”字可正确显现,可是后边却显现了后边的一行字。
P3:”过”字总显现乱码;
三、求索
通过调试发现,上述汉字显现不正常的时分,是因为在字库中找不到匹配的汉字。可是,自建的字库中分明有这些汉字,并且”数”,”正”字在后边无字符的时分是显现正确的啊!
问题找了良久,置疑传参类型不对,汉字查找或许溢出等,重复修正,总是无法处理问题,并且从现象来考虑,都不应该是这些问题。
今天灵光一现:为什么不在传递字符串后显现该字符串的变量值呢?
通过具体研讨,西文字符在传递时应该是ACSII值,一个字节,数值小于128;而汉字传递的是其机内码,分凹凸2个字节,2个字节都大于127,当然并小于256。
字符串传递参数值一显现,可不得了。其惊人之处有:
1.”数”,”正”,”过”正确显现时其传参值为:0xca00,0xd500,0xb900;而其正确的机内码应该是:0xcafd,0xd5fd,0xb9fd。看来其低位字节被无情忽视。
2.”数”,”正”,”过”独自显现正确,可是后边带一个字符或汉字就显现乱码了。如”正:”传参的值为:0xd53a,0x0000;”数
“传参的值为:0xca20,0x0000。而”:”和”
“的ASCII值恰好是0x3a,0x20,看来这几个汉字是叛变到西文字符中去了,机内码只要一个高位字节了。
3.将传参值直接赋给汉字显现函数,如”过”用”0xb9,0xfd”是显现不了的,只能用”0xb9,0x00″。
4.比较发现,显现不正常的”数”,”正”,”过”三个字的低位字节都是0xfd,而一向显现正确的”一二”等汉字机内码的低位字节都不是0xfd。
难道keil跟0xfd有不共戴天之仇?
四、处理
天边苍茫寻不到,无法只要上百度。用”keil
c51的汉字显现问题”一搜就找到安排了,泪奔啊。安排的力量大,很快就给出了让我这等底层开发者劳累辛苦的原因:这是万恶的keil存在的一个臭名远扬的bug!巨大的安排一起忘我的供给了答案,并且还不止一种哦。以下是从某同志的blog中摘抄:
“处理办法两个:
①下个晓奇作业室出的补丁,自己搜一下。(http://www.xiao-qi.com/mcu/)请下载之后放到你的keil\c51\bin 目录里,运转这个程序.就能够了
②用十六进制修改软件如HexEdit翻开c51.exe,查找80FBFD,改为80FBFF即可。
c51.exe方位:Keil装置目录/keil/c51/bin/c51.exe”
赶忙拿起长辈们供给的兵器,向keil 0xfd bug建议强烈冲击!……
待我从头烧录好程序,悄悄的翻开电源,液晶屏幕上的一个个汉字显现得规整而又洁净,整个国际喧嚣了…………