找回密码
 立即注册
查看: 549|回复: 2

(转)KEIL的中断号大于31时的解决、C51汉字显示的bug修复

[复制链接]
  • TA的每日心情
    开心
    前天 23:14
  • 签到天数: 127 天

    [LV.7]常住居民III

    13

    主题

    52

    回帖

    1342

    积分

    金牌会员

    积分
    1342
    发表于 2023-5-26 17:57:20 | 显示全部楼层 |阅读模式
    本帖最后由 飞哥 于 2023-5-26 18:44 编辑

            (转载)KEIL的中断号大于31时编译出错的修复
    目前Keil各个版本的C51和C251编译器均只支持32个中断号(0~31),即中断向量必须小于0100H。在Keil公司没有解决中断号超过32个的问题之前,我们可以采用多种变通的方法临时用着。目前已经有多款STC单片机的中断号超过此数值,比如STC8H8K64U、STC32G12K128单片机。这里介绍了通过修改打补丁实现取消最大中断号31的限制方法。31对应的十六进制为1F,在特定的判断位置更改为其它数值即可取消此限制,类似之前的汉字FD BUG及补丁。具体修改、增加KEIL最大31个中断号的办法为:
    分别备份与修改以下两个exe文件:
    \KEIL\C51\BIN\C51.exe
    \KEIL\C251\BIN\C251.exe

    用UltraEdit软件打开这两个文件,搜索十六进制的“F81F76”,改为“F8FF76”即可。

    本文不对补丁后可能产生的损失负责,请自行测试。如不正确请指正。


    ---
            (转载)关于Keil汉字显示bug的解决方法(0xFD问题)

        在调试LCD12864的过程中,有些“幽灵”般存在的问题一直很令人头疼,其中就有一项:某些汉字无法直接显示,例如:三、数、听……这些较为常用的字体。
    原来的解决办法简单粗暴:查阅12864的手册,将对应的汉字内码拿出直接用,但是这种方法是较为局限的,在某些情况下,这种方法甚至无法使用,或者说是太过麻烦,例如数据库的录入问题,我在制作goto手柄的过程中就遇到了这个问题。
    今天通过上网查阅资料才得知,这个问题并不是LCD12864的硬件问题,而是Keil软件本身的一个“BUG”,keil编译器会忽略0xFD值的字符串,而这些显示不出来的汉字的内码的后一半正好通通都是0XFD……

    下面是Keil官方的说明:
    http://www.keil.com/support/docs/2618.htm
    GENERAL COMPILER IGNORES 0XFD, 0XFE, 0XFF VALUES IN STRINGS
    Information in this article applies to

    C166 Compiler All Versions
    Cx51 Compiler All Versions
    C251 Compiler All Versions
    QUESTION
    I have a problem with the interpretation of Russian strings in the Keil C51 compiler. Some Russian characters are using the encoding 0xFD. It looks like this encoding is ignored by the compiler and is not included in the program code.

    Example

    code char RussianString[] =  ;
    Why does this problem exist and how can I avoid this behavior

    ANSWER
    The character encodings 0xFD, 0xFE, and 0xFF are used internally by the C compiler. The ANSI standard only requires support for ASCII characters in the range 0x00 - 0x7F.

    You may insert these characters by using HEX encodings in the string as follows

    code char RussianString[] = My Text xFD;
    A simple text replacement which replaces all 0xFD characters with the string ' xFD' should do the job.

    总之人家不认为这个是BUG,所以很多年就没改过……


    网上有很多关于修正这一BUG的方法,补丁或者动手修改软件本身什么的

    解决方法一
    就是按照Keil官方的来,常用的也就那几个,所以“加后缀”的方法就很好。

    具体方法:遇到无法显示字符时在其后加\xFD
    如 :unsigned char code s[]=数学; 改为 unsigned char code s[]=数\xFD学; 即可正常显示。

    下面是从GB2312中挑出来的相关汉字:

    褒 饼 昌 除 待 谍 洱 俘庚过

    糊 积 箭 烬 君 魁 例 笼慢谬

    凝 琵 讫 驱 三 升 数 她听妄

    锡 淆 旋 妖 引 育 札正铸

    佚 冽 邶 埤 荦 蔟 摭 啐帻猃

    恺 泯 潺 妪 纨 琮 椠 辇挲臊

    忑 睚 铨 稞 瘕 颀 螨 簖酏觚

    鳊鼾

    碰到这些字,手动处理一下吧。


    解决方法二
        后来经常写代码,发现GBK才是用得最多的字库。对应缺少不能显示的汉字(包括生僻字)突然多达近百个。是可忍孰不可忍,开始探寻究竟:

        通过调试发现,上述汉字显示不正常的时候,是因为在字库中找不到匹配的汉字。可是,自建的字库中明明有这些汉字,而且"数","正"字在后面无字符的时候是显示正确的啊!
        问题找了好久,怀疑传参类型不对,汉字查找可能溢出等,反复修改,总是无法解决问题,而且从现象来思考,都不应该是这些问题。
        今日灵光一现:为什么不在传递字符串后显示该字符串的变量值呢?
        经过详细研究,西文字符在传递时应该是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中摘录:
        “解决方法两个:
         ①下个补丁,自己搜一下。
         ②用十六进制编辑软件如HexEdit打开c51.exe,搜索80FBFD,改为80FBFF即可。
                       c51.exe位置:Keil安装目录/keil/c51/bin/c51.exe”
        赶紧拿起前辈们提供的武器,向keil 0xfd bug发起猛烈冲锋!……
        待我重新烧录好程序,轻轻的打开电源,液晶屏幕上的一个个汉字显示得整齐而又干净,整个世界清静了…………


    ---
    归纳一下。以上两个解决方法各有特点,个人倾向于后者。但是对编译器的修改会让源程序与之前的不兼容,会在“\xFD”处报错。



    回复 送花

    使用道具 举报

  • TA的每日心情
    开心
    前天 23:14
  • 签到天数: 127 天

    [LV.7]常住居民III

    13

    主题

    52

    回帖

    1342

    积分

    金牌会员

    积分
    1342
     楼主| 发表于 2023-5-26 18:57:23 | 显示全部楼层
    关于0xfd的两个不同程序对比,可以参考我的帖子:
    https://www.stcaimcu.com/forum.php?mod=viewthread&tid=2409
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    3 天前
  • 签到天数: 85 天

    [LV.6]常住居民II

    14

    主题

    608

    回帖

    2279

    积分

    超级版主

    积分
    2279
    QQ
    发表于 2023-5-27 08:42:53 | 显示全部楼层
    感谢热心大佬分享,我司官网也有提供Keil终端拓展插件:深圳国芯人工智能有限公司-工具软件  https://www.stcai.com/gjrj
    1.png

    www.STCAI.com
    微信&手机:18106296591
    QQ:3133693787
    回复 支持 反对 送花

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-3 17:54 , Processed in 0.067854 second(s), 41 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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