新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > Keil C51漢字顯示的bug問題

        Keil C51漢字顯示的bug問題

        作者: 時間:2016-11-10 來源:網絡 收藏
        一、緣起

        這兩天改進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/)請下載之后放到你的keilc51bin 目錄里,運行這個程序.就可以了
        ②用十六進制編輯軟件如HexEdit打開c51.exe,搜索80FBFD,改為80FBFF即可。
        c51.exe位置:Keil安裝目錄/keil/c51/bin/c51.exe”
        趕緊拿起前輩們提供的武器,向keil 0xfd bug發起猛烈沖鋒!……
        待我重新燒錄好程序,輕輕的打開電源,液晶屏幕上的一個個漢字顯示得整齊而又干凈,整個世界清靜了…………


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 滕州市| 江城| 邵阳县| 修水县| 盐边县| 广安市| 宜州市| 伊金霍洛旗| 德安县| 沙河市| 增城市| 桂林市| 涟水县| 上虞市| 博罗县| 乳源| 调兵山市| 丰顺县| 宣武区| 灵武市| 平武县| 永川市| 大荔县| 泰来县| 武乡县| 廊坊市| 平邑县| 东平县| 邯郸市| 肥乡县| 眉山市| 西充县| 桦川县| 文成县| 乐至县| 依兰县| 如皋市| 孟津县| 揭东县| 津市市| 驻马店市|