新聞中心

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

Keil C51漢字顯示的bug問題

作者: 時間:2016-11-10 來源:網(wǎng)絡 收藏
一、緣起

這兩天改進MCU的液晶顯示方法,采用“即編即顯”的思路,編寫了一個可以直接顯示字符串的程序。如程序調(diào)用disstr("我是你老爸");液晶屏上就會顯示“我是你老爸”。
二、問題
但是,花了1天多時間辛辛苦苦改好的程序后,卻發(fā)現(xiàn)有些漢字顯示有問題。比如:
P1:在第一行顯示“實時參數(shù)”,第二行顯示“工作狀態(tài)”,實際上“工作狀態(tài)”卻重復顯示了,除了在正確的地方顯示外,還在“實時參數(shù)”后顯示了。
P2:"正"字后若有":",則都顯示成亂碼。如果后面沒有":",則"正"字可正確顯示,但是后面卻顯示了后面的一行字。
P3:"過"字總顯示亂碼;
三、求索

通過調(diào)試發(fā)現(xiàn),上述漢字顯示不正常的時候,是因為在字庫中找不到匹配的漢字??墒?,自建的字庫中明明有這些漢字,而且"數(shù)","正"字在后面無字符的時候是顯示正確的啊!
問題找了好久,懷疑傳參類型不對,漢字查找可能溢出等,反復修改,總是無法解決問題,而且從現(xiàn)象來思考,都不應該是這些問題。
今日靈光一現(xiàn):為什么不在傳遞字符串后顯示該字符串的變量值呢?

經(jīng)過詳細研究,西文字符在傳遞時應該是ACSII值,一個字節(jié),數(shù)值小于128;而漢字傳遞的是其機內(nèi)碼,分高低2個字節(jié),2個字節(jié)都大于127,當然并小于256。
字符串傳遞參數(shù)值一顯示,可不得了。其驚人之處有:

1."數(shù)","正","過"正確顯示時其傳參值為:0xca00,0xd500,0xb900;而其正確的機內(nèi)碼應該是:0xcafd,0xd5fd,0xb9fd??磥砥涞臀蛔止?jié)被無情忽視。
2."數(shù)","正","過"單獨顯示正確,但是后面帶一個字符或漢字就顯示亂碼了。如"正:"傳參的值為:0xd53a,0x0000;"數(shù)
"傳參的值為:0xca20,0x0000。而":"和"
"的ASCII值恰好是0x3a,0x20,看來這幾個漢字是叛變到西文字符中去了,機內(nèi)碼只有一個高位字節(jié)了。
3.將傳參值直接賦給漢字顯示函數(shù),如"過"用"0xb9,0xfd"是顯示不了的,只能用"0xb9,0x00"。
4.比較發(fā)現(xiàn),顯示不正常的"數(shù)","正","過"三個字的低位字節(jié)都是0xfd,而一直顯示正確的"一二"等漢字機內(nèi)碼的低位字節(jié)都不是0xfd。
莫非keil跟0xfd有不共戴天之仇?
四、解決
天涯茫茫尋不到,無奈只有上百度。用"keil
c51的漢字顯示問題"一搜就找到組織了,淚奔啊。組織的力量大,很快就給出了讓我這等底層開發(fā)者勞累辛苦的原因:這是萬惡的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發(fā)起猛烈沖鋒!……
待我重新燒錄好程序,輕輕的打開電源,液晶屏幕上的一個個漢字顯示得整齊而又干凈,整個世界清靜了…………


評論


技術專區(qū)

關閉