一、缘起
  这两天改进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/)
②用十六进制编辑软件如HexEdit打开c51.exe,搜索80FBFD,改为80FBFF即可。
c51.exe位置:Keil安装目录/keil/c51/bin/c51.exe”
赶紧拿起前辈们提供的武器,向keil 0xfd bug发起猛烈冲锋!……
待我重新烧录好程序,轻轻的打开电源,液晶屏幕上的一个个汉字显示得整齐而又干净,整个世界清静了…………

Keil C51汉字显示的bug问题(0xFD问题)的更多相关文章

  1. Keil C51汉字显示的bug问题

    一.缘起 这两天改进MCU的液晶显示方法,采用“即编即显”的思路,编写了一个可以直接显示字符串的程序.如程序调用disstr("我是你老爸");液晶屏上就会显示“我是你老爸”. 二 ...

  2. Keil version 2汉字显示乱码的解决方案

    Keil version 2汉字显示乱码的解决方案 Keil2对汉字的支持不好,在删除汉字字符时,一不小心会删除一半而留一半,这时并不显示错误或乱码,而是貌似都删除了,但编译程序可能会报错,这时再查错 ...

  3. Keil C51必须注意的一些有趣特性

    Keil c51号称作为51系列单片机最好的开发环境,大家一定都很熟悉.它的一些普通的特性大家也都了解,(书上也都说有)如:因为51内的RAM很小,C51的函数并不通过堆栈传递参数(重入函数除外),局 ...

  4. Keil C51编译及连接技术

    主要介绍Keil C51的预处理方法如宏定义.常用的预处理指令及文件包含指令,C51编译库的选择及代码优化原理,C51与汇编混合编程的方法与实现以及超过64KB空间的地址分页方法的C51实现. 教学目 ...

  5. KEIL C51 printf格式化输出特殊用法

    作者:dragoniye   发布:2014-02-15 12:44   分类:硬件     抢沙发   /*******************************************KEI ...

  6. 配置keil MDK和keil C51共存

    配置keil MDK和keil C51共存:1.首先安装keilMDK或者安装KeilC51其中一个:2.安装到D:\keil路径下,按照默认的配置安装,完成:3.使用管理员身份打开安装好的软件,打开 ...

  7. Keil C51 中的函数指针和再入函数

    函数指针是C语言中几个难点之一.由于8051的C编译器的独特要求,函数指针和再入函数有更多的挑战需要克服.主要由于函数变量的传递.典型的(绝大部分8051芯片)函数变量通过堆栈的入栈和出栈命令来传递. ...

  8. Keil C51中函数指针的使用

    函数指针在C语言中应用较为灵活.在单片机系统中,嵌入式操作系统.文件系统和网络协议栈等一些较为复杂的应用都大量地使用了函数指针.Keil公司推出的C51编译器是事实上80C51 C编程的工业标准,它针 ...

  9. Keil C51里关于堆栈指针的处理

    Keil C是非常优秀的C51编译器,可能是最好的C51编译器,提供各种优化模式,对变量的优化和地址安排做得非常好.这是用C语言写代码的好处之一,如果用汇编写,得费一大番功夫给各个变量安排内存物理地址 ...

随机推荐

  1. 关于 Dictionary<string,string>,和List<T>在View的使用

    在MVC中Dictionary<string,string>如何应用到View页面中呢,例: <input type="text" name=key value= ...

  2. 浅谈Android Fragment嵌套使用存在的一些BUG以及解决方法

    时间 2014-03-18 18:00:55 eoe博客 原文  http://my.eoe.cn/916054/archive/24053.html 主题 安卓开发 自从Android3.0引入了F ...

  3. [工具类]获取url中参数列表

    写在前面 在项目中经常用到解析url中参数的逻辑,今天先下载就自己封装了一个方法,方便以后使用的时候,信手拈来.当然这里给出的方法是针对常见的url参数类型的,对于重写url,或者路由格式的不考虑. ...

  4. canvas API ,通俗的canvas基础知识(六)

    这篇是canvas API系列的首尾之作,这篇以后,所有的canvas的属性和方法就将完了,哦,不对,应该是大部分常用的,还有部分不常用的属性和方法,因为种种原因,就不介绍了,后期的重点就是多写一点c ...

  5. artice与section的区别

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  6. u-boot子目录Makefile分析

    一.概述 u-boot的子目录Makefile是整个Makefile体系的重要组成部分,决定了对应子目录的编译过程. 二.分析 以cpu/arm920t/Makefile为例进行说明 (1)首先,调用 ...

  7. PHP 关于MongoDB的操作

    <?php header("Content-type:text/html;charset=utf-8"); $m = new MongoClient(); // 连接 $db ...

  8. jQuery的入门与简介

    jQuery的入门与简介<思维导图>   <初学者请各位高手指点指点> jQuery是继Prototype之后又一个优秀的JavaScript库,在JavaScript基础上我 ...

  9. LightGBM调参总结

    1. 参数速查 使用num_leaves,因为LightGBM使用的是leaf-wise的算法,因此在调节树的复杂程度时,使用的是num_leaves而不是max_depth. 大致换算关系:num_ ...

  10. android开发,权限获取

    转:http://blog.csdn.net/yawinstake/article/details/6748897 访问登记属性 android.permission.ACCESS_CHECKIN_P ...