Keil C51汉字显示的bug问题(0xFD问题)
Keil C51汉字显示的bug问题 
      一、缘起
         
      这两天改进MCU的液晶显示方法,采用即编即显的思路,编写了一个可以直接显示字符串的程序。如程序调用disstr("我是你老爸");液晶屏上就会显示我是你老爸
      二、问题
          但是,花了1天多时间辛辛苦苦改好的程序后,却发现有些汉字显示有问题。比如:
          P1:在第一行显示实时参数,第二行显示工作状态,实际上工作状态却重复显示了,除了在正确的地方显示外,还在实时参数后显示了。
          P2:""字后若有":",则都显示成乱码。如果后面没有":",则""字可正确显示,但是后面却显示了后面的一行字。
          P3:""字总显示乱码;
      三、求索
         
      通过调试发现,上述汉字显示不正常的时候,是因为在字库中不到匹配的汉字。可是,自建的字库中明明有这些汉字,而且""""c51中字符串函数字在后面无字符的时候是显示正确的啊!
          问题了好久,怀疑传参类型不对,汉字查可能溢出等,反复修改,总是无法解决问题,而且从现象来思考,都不应该是这些问题。
          今日灵光一现:为什么不在传递字符串后显示该字符串的变量值呢?
         
      经过详细研究,西文字符在传递时应该是ACSII值,一个字节,数值小于128;而汉字传递的是其机内码,分高低2个字节,2个字节都大于127,当然并小于256
          字符串传递参数值一显示,可不得了。其惊人之处有:
         
      1.""""""正确显示时其传参值为:0xca000xd5000xb900;而其正确的机内码应该是:0xcafd,0xd5fd,0xb9fd。看来其低位字节被无情忽视。
          2.""""""单独显示正确,但是后面带一个字符或汉字就显示乱码了。如":"传参的值为:0xd53a,0x0000"
      "传参的值为:0xca20,0x0000。而":""
      "ASCII值恰好是0x3a,0x20,看来这几个汉字是叛变到西文字符中去了,机内码只有一个高位字节了。
          3.将传参值直接赋给汉字显示函数,如"""0xb90xfd"是显示不了的,只能用"0xb90x00"
          4.比较发现,显示不正常的""""""三个字的低位字节都是0xfd,而一直显示正确的"一二"等汉字机内码的低位字节都不是0xfd
          莫非keil0xfd有不共戴天之仇?
      四、解决
          天涯茫茫寻不到,无奈只有上百度。用"keil
      c51的汉字显示问题"一搜就到组织了,泪奔啊。组织的力量大,很快就给出了让我这等底层开发者劳累辛苦的原因:这是万恶的keil存在的一个臭名昭著的bug!伟大的组织同时无私的提供了答案,而且还不止一种哦。以下是从某同志的blog中摘录:
          “解决方法两个:
          下个晓奇工作室出的补丁,自己搜一下。(www.xiao-qi/mcu/
          用十六进制编辑软件如HexEdit打开,搜索80FBFD,改为80FBFF即可。
                        位置:Keil安装目录/keil/c51/
          赶紧拿起前辈们提供的武器,向keil 0xfd bug发起猛烈冲锋!……
          待我重新烧录好程序,轻轻的打开电源,液晶屏幕上的一个个汉字显示得整齐而又干净,整个世界清静了…………
       
      本文来自CSDN博客,转载请标明出处:blog.csdn/willhu2008/archive/2009/08/25/4482487.aspx
Keil过滤0xfd字符的bug的修正
keil c51在编译的时候会将0xfd的字符(有些汉字含该字符的内码)过滤, 而导致程序出错.特别是在做液晶汉字
显示时. 针对这个bug.由网友编写了这个补丁. 请下载之后放到你的keil\c51\bin 目录里,运行这个程序.就可
以了. 支持v8.02
去晓奇网站上下个补丁程序运行下即可
这么多年了,Keil还是有这个Bug,而且晓奇做的哪个补丁程序也不错,这么多年了都还能适用:-)
相关链接:www.xiao-qi
直接用Uedit打开需要修改的文件,将对应的0xFD修改成0xFF就可
例如,对于51编译器,那么用Uedit打开C51/BIN/目录下的,然后查80FBFD56,到后将FD改成FF,保
存,就OK拉。
对于UV3CARM编译器,那么应该到ARM/BIN/目录下的CA.exe,然后查80FBFD,到后将FD改成FF,保存,
OK的拉~
就是遇到0xFD时就被过滤掉了。
例如,你写一个字符穿,里面包含一个数学的数字,那么这个数字就丢了一半……
char MyString[]="数字";
如果你不打补丁,通过串口发送出去的就是乱码...因为错位了,“数”字被丢掉了 
~~ 
v905之前的0xfd漏洞修正方法: HEXEdit修改
    80fbfd56
替换为 80fbff56
v9050xfd漏洞修正方法
    80fbfd0f
替换为 80fbff0f
你好,9.50的查那个数据提示没有到!!!
    80fbfd0f
替换为 80fbff0f
这个数据查,记得去掉勾选的FIND TEXT
    80fbfd0f
替换为 80fbff0f
这个数据查,记得去掉勾选的FIND TEXT
意思就是说,如果你的字符中包含了0xFD,那么就会被忽略。但如果用\x转义符写的却不会,例如可以在字符串
中写"\xFD",最后的数据中会保留这个字符。
所以对于受到影响的汉字,你可以直接用两个\x转义符把编码直接写上。或者额外写一个\xFD补上被滤掉的。
例如,“数字电路”这个字符串,直接写的话,“数”会出问题。那么你可以写:(“数”的编码是0xCA 0xFD
"\xCA\xFD字电路"
或者写:
"\xFD字电路"

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。