新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > Keil C51漢字顯示的bug問(wèn)題

Keil C51漢字顯示的bug問(wèn)題

作者: 時(shí)間:2016-11-10 來(lái)源:網(wǎng)絡(luò) 收藏
一、緣起

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

通過(guò)調(diào)試發(fā)現(xiàn),上述漢字顯示不正常的時(shí)候,是因?yàn)樵谧謳?kù)中找不到匹配的漢字??墒牵越ǖ淖謳?kù)中明明有這些漢字,而且"數(shù)","正"字在后面無(wú)字符的時(shí)候是顯示正確的?。?br />問(wèn)題找了好久,懷疑傳參類(lèi)型不對(duì),漢字查找可能溢出等,反復(fù)修改,總是無(wú)法解決問(wèn)題,而且從現(xiàn)象來(lái)思考,都不應(yīng)該是這些問(wèn)題。
今日靈光一現(xiàn):為什么不在傳遞字符串后顯示該字符串的變量值呢?

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

1."數(shù)","正","過(guò)"正確顯示時(shí)其傳參值為:0xca00,0xd500,0xb900;而其正確的機(jī)內(nèi)碼應(yīng)該是:0xcafd,0xd5fd,0xb9fd。看來(lái)其低位字節(jié)被無(wú)情忽視。
2."數(shù)","正","過(guò)"單獨(dú)顯示正確,但是后面帶一個(gè)字符或漢字就顯示亂碼了。如"正:"傳參的值為:0xd53a,0x0000;"數(shù)
"傳參的值為:0xca20,0x0000。而":"和"
"的ASCII值恰好是0x3a,0x20,看來(lái)這幾個(gè)漢字是叛變到西文字符中去了,機(jī)內(nèi)碼只有一個(gè)高位字節(jié)了。
3.將傳參值直接賦給漢字顯示函數(shù),如"過(guò)"用"0xb9,0xfd"是顯示不了的,只能用"0xb9,0x00"。
4.比較發(fā)現(xiàn),顯示不正常的"數(shù)","正","過(guò)"三個(gè)字的低位字節(jié)都是0xfd,而一直顯示正確的"一二"等漢字機(jī)內(nèi)碼的低位字節(jié)都不是0xfd。
莫非keil跟0xfd有不共戴天之仇?
四、解決
天涯茫茫尋不到,無(wú)奈只有上百度。用"keil
c51的漢字顯示問(wèn)題"一搜就找到組織了,淚奔啊。組織的力量大,很快就給出了讓我這等底層開(kāi)發(fā)者勞累辛苦的原因:這是萬(wàn)惡的keil存在的一個(gè)臭名昭著的bug!偉大的組織同時(shí)無(wú)私的提供了答案,而且還不止一種哦。以下是從某同志的blog中摘錄:
“解決方法兩個(gè):
①下個(gè)曉奇工作室出的補(bǔ)丁,自己搜一下。(http://www.xiao-qi.com/mcu/)請(qǐng)下載之后放到你的keilc51bin 目錄里,運(yùn)行這個(gè)程序.就可以了
②用十六進(jìn)制編輯軟件如HexEdit打開(kāi)c51.exe,搜索80FBFD,改為80FBFF即可。
c51.exe位置:Keil安裝目錄/keil/c51/bin/c51.exe”
趕緊拿起前輩們提供的武器,向keil 0xfd bug發(fā)起猛烈沖鋒!……
待我重新燒錄好程序,輕輕的打開(kāi)電源,液晶屏幕上的一個(gè)個(gè)漢字顯示得整齊而又干凈,整個(gè)世界清靜了…………


關(guān)鍵詞: KeilC51漢字顯示bug問(wèn)

評(píng)論


技術(shù)專(zhuān)區(qū)

關(guān)閉