一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 3645|回复: 18
收起左侧

[51单片机] 求助:Keil 4编译12864显示程序出现奇葩问题

[复制链接]
发表于 2017-3-12 06:13 | 显示全部楼层 |阅读模式
本帖最后由 fqdatiancai 于 2017-3-12 06:16 编辑

软件环境:Keil μvision 4.00a(C51编译器V9.00)
硬件环境:STC89C52RC,12MHz时钟,12864B液晶模块,4位总线驱动方法
问题如下:12864主要控制都正常,可以正常初始化,可以正常设置光标位置,可以正常显示绝大多数汉字,但少数汉字乱码。
具体信息:
期初发现汉字“三”和“数”不能正常显示,显示此汉字时该汉字和其后面的汉字全部乱码。
通过测试和分析发现,显示“三”和“数”时,实际上光标只移动了一个位置,而不是正常情况下汉字光标移动两个位置,后面汉字乱码是因为光标位置出现奇数而导致的,如果在“三”和“数”之后加一个ASCII字符,则ASCII字符后的汉字可正常显示。紧跟着“三”和“数”的ASCII字符无法显示,且会影响乱码字符。
如果程序中定义的字不变,则乱码后产生的字符不变。
将正确字符、乱码字符写成二进制形式如下图所示(“错误”表示乱码后出现的字符,“正确”表示程序中定义的字符,“错误”后面的括号是产生此乱码所使用的字符串):
乱码1.jpg
通过观察发现,“数”和“三”两个汉字存在一个共同的特点——其第2字节为0xFD。
于是乎,我通过查询汉字编码表,找到了其它几个第2字节为0xFD的汉字(测试了“她”、“饼”两个字)进行测试,结果也全部乱码。
“数”这个字的编码应该是0xCAFD,尝试直接使用该12864的驱动程序中的单字节数据发送函数向屏幕发送0xCAFD,可以使屏幕正常显示出“数”这个字,因此排除12864本身故障的可能,同时也排除了单字节数据发送函数存在Bug的可能。
接下来的事情我就完全蒙了:
我将“数”这个汉字单独存放在一个数组中,然后按照位权将其转换为int型数据,再将这个int数据打印出来,居然是51712(十进制)!51712对应的十六进制数是0xCA00,并非0xCAFD!也就是说,我将汉字存储在数组中后,数组中的数据就已经出错了,这是肿么回事?????
相关测试程序:
乱码2.jpg
类似的,换成“三”这个字后,输出结果是51200(0xC800),而正确结果应该是51453(0xC8FD)。
为了确认一下,我又将“数”换成了其它汉字,比如“学”,其转换为int后输出结果为53671(十进制),对应十六进制数0xD1A7,与“学”字的汉字编码相符,也就是说我这么验证编码应该是没错的。
通过串口将含有“数”这个字的字符串输出给电脑,电脑这边同样乱码。
从以上测试结果来看,问题似乎出在Keil本身了。
这到底是啥毛病?有没有别人遇到过类似的情况?为何我的Keil无法正确处理第2字节为0xFD的汉字?
发表于 2017-3-12 07:07 | 显示全部楼层
我只知道这是“Keil”的老毛病了
发表于 2017-3-12 08:05 | 显示全部楼层
可能是对多字节字符的支持不够,
尤其是多字节与单字节衔接处易出错.

我用 iar 有时会出现换行错误,删掉所有代码,按原样重写就好了.
发表于 2017-3-12 09:16 | 显示全部楼层
老毛病了,不重视中国市场的原因。这个bug貌似从keil2就有,一直没有修正。民间有补丁,打上就好
发表于 2017-3-12 10:50 | 显示全部楼层
我之前也碰到过,后来发现是KEIL的0xFD字符BUG,建议更换字符重新编译成HEX后再替换回来
 楼主| 发表于 2017-3-12 15:04 | 显示全部楼层
dzljp 发表于 2017-3-12 07:07
我只知道这是“Keil”的老毛病了

好吧,现已确认这是Keil自身的Bug,在Keil官网里有相关说明。
 楼主| 发表于 2017-3-12 15:05 | 显示全部楼层
junyee 发表于 2017-3-12 08:05
可能是对多字节字符的支持不够,
尤其是多字节与单字节衔接处易出错.

现已确认这是Keil自身的Bug,在Keil官网里有相关说明。
 楼主| 发表于 2017-3-12 15:06 | 显示全部楼层
sdf15937 发表于 2017-3-12 09:16
老毛病了,不重视中国市场的原因。这个bug貌似从keil2就有,一直没有修正。民间有补丁,打上就好

现已确认这是Keil自身的Bug,在Keil官网里有相关说明。官网里说是用“\xFD”的方法解决,试了可行,没打什么补丁。
 楼主| 发表于 2017-3-12 15:06 | 显示全部楼层
sln.1550 发表于 2017-3-12 10:50
我之前也碰到过,后来发现是KEIL的0xFD字符BUG,建议更换字符重新编译成HEX后再替换回来

出错的字符后面加“\xFD”,亲测可行。
发表于 2017-3-13 15:22 | 显示全部楼层
keil的漏洞,一直都有,从来没有重视过

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-3-29 16:08 , Processed in 0.072539 second(s), 38 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表