Keil C51汉字显示的bug问题
2016-07-30 来源:eefocus
一、缘起
这两天改进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发起猛烈冲锋!……
待我重新烧录好程序,轻轻的打开电源,液晶屏幕上的一个个汉字显示得整齐而又干净,整个世界清静了…………
进入单片机查看更多内容>>
这两天改进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发起猛烈冲锋!……
待我重新烧录好程序,轻轻的打开电源,液晶屏幕上的一个个汉字显示得整齐而又干净,整个世界清静了…………
上一篇:keil中的存储模式
下一篇:STC-ISP下载过程
相关文章
- keil中GD32 MCU IAP中APP的存储地址如何设置?
- 如何查看GD32 Keil和IAR工程的map文件
- GD32开发实战指南(基础篇) 第4章 GD32启动流程详解(Keil版)
- 如何使用Keil打开GD32 FPU及使用ARM DSP库 ?
- 【GD32 MCU 入门教程】一、GD32 MCU 开发环境搭建(1)使用Keil开发GD32
- STM32 FreeRTOS Keil环境搭建
- 用Keil编译STM32工程出现下面错误
- 基于STM32的Keil和偏移地址程序存储
- STM32通过命令行编译和下载keil和IAR工程的方法
- ch32可以用keil吗?ch32和stm32编程有区别吗?