當(dāng)前位置:首頁(yè) > 電源 > 數(shù)字電源
[導(dǎo)讀]綜合幾種常用單片機(jī)漢字顯示方案,提出一種基于PC機(jī)預(yù)處理的漢字動(dòng)態(tài)編碼和動(dòng)態(tài)字庫(kù)的顯示方法,較好地解決了存儲(chǔ)空間、顯示速度、軟件開(kāi)發(fā)維護(hù)幾方面的相互矛盾;具有平臺(tái)化的優(yōu)點(diǎn),同時(shí),給出針對(duì)MCS51優(yōu)化的匯編顯示例程。

    摘要:綜合幾種常用單片機(jī)漢字顯示方案,提出一種基于PC機(jī)預(yù)處理的漢字動(dòng)態(tài)編碼和動(dòng)態(tài)字庫(kù)的顯示方法,較好地解決了存儲(chǔ)空間、顯示速度、軟件開(kāi)發(fā)維護(hù)幾方面的相互矛盾;具有平臺(tái)化的優(yōu)點(diǎn),同時(shí),給出針對(duì)MCS51優(yōu)化的匯編顯示例程。

    關(guān)鍵詞:機(jī)內(nèi)碼 動(dòng)態(tài)編碼 字庫(kù)

因?yàn)闈h字本身的特點(diǎn),顯示漢字始終是計(jì)算機(jī)在我國(guó)應(yīng)用普及的一個(gè)障礙。最初,為了能在PC機(jī)上顯示、處理漢字,國(guó)人發(fā)明了一種硬件設(shè)備"漢卡",后來(lái)各種各樣的采用純軟件技術(shù)的中文DOS逐漸成熟,其中、西文軟件的運(yùn)行速度和性能還是有明顯的差距。最終在軟件進(jìn)入支持UNICODE、真正實(shí)現(xiàn)國(guó)際化的WIN95以后,硬件跨入"奔騰"時(shí)代,才實(shí)現(xiàn)了漢字與西文的統(tǒng)一顯示,但是這一切是以硬件資源的飛速發(fā)展為前提的。以國(guó)際GB2312為例,一、二級(jí)漢字庫(kù)共收錄了6000多個(gè)漢字,每個(gè)字按16×16點(diǎn)陣計(jì)算,字模需要占用32字節(jié)的存儲(chǔ)空間,整個(gè)字庫(kù)的規(guī)模在200k字節(jié)以上,高點(diǎn)陣(24點(diǎn)陣以上)和矢量字庫(kù)以及Windows用的TrueType字體的字庫(kù)規(guī)模都是幾兆字節(jié)大小,這在早期的386時(shí)代是難以想象的。單片機(jī)因?yàn)槭褂渺`活、結(jié)構(gòu)簡(jiǎn)單、體積小、成本低而在工業(yè)和生活中得到廣泛應(yīng)用,也正是因此,它的硬件資源很有 限,尋址和計(jì)算機(jī)能力都遠(yuǎn)低于PC機(jī),顯示漢字更受限制。人們不滿足單片機(jī)系統(tǒng)采用LED數(shù)碼管的簡(jiǎn)單顯示,根據(jù)單片機(jī)的特點(diǎn),開(kāi)發(fā)出了很多種漢字顯示方法。

1 幾種常用單片機(jī)顯示漢字方法

(1)采用標(biāo)準(zhǔn)字[1]

這種方法仿器中文DOS的辦法,將一個(gè)標(biāo)準(zhǔn)的漢字庫(kù)裝入ROM存儲(chǔ)器,再根據(jù)漢字的機(jī)內(nèi)碼在字庫(kù)中尋址,找到對(duì)應(yīng)的字模,提取后送到顯示器顯示。因?yàn)椴捎昧撕蚉C機(jī)相同的編碼(機(jī)內(nèi)碼),軟件的開(kāi)發(fā)和維護(hù)非常簡(jiǎn)單,基本上與寫(xiě)PC機(jī)軟件差不多。而對(duì)單片機(jī)系統(tǒng)自身的要求則相對(duì)高多了,16×16點(diǎn)陣的字庫(kù)需要256K字節(jié),但是一般8位單片機(jī)的尋址能力只有64K字節(jié),要進(jìn)行存儲(chǔ)器擴(kuò)充,除增加很大一部分硬件成本外,還因?yàn)橐M(jìn)行存儲(chǔ)器分頁(yè)管理、地址切換,顯示速度明顯受影響,而且只能顯示一種點(diǎn)陣字體。

(2)直接固化顯示字模[2]

將要顯示的語(yǔ)句中全部漢字的字模數(shù)據(jù)依次提取出來(lái),順序存放在存儲(chǔ)器中,當(dāng)顯示時(shí),直接取出字模數(shù)據(jù)送至顯示器即可。這種方法占用空間少,程序?qū)崿F(xiàn)簡(jiǎn)單,顯示速度快;但是字模數(shù)據(jù)的提取和存儲(chǔ)安排是一件委有繁瑣的事件,要想大量顯示漢字或進(jìn)行程序修改幾乎是不可能的,軟件的可維護(hù)性很差。

(3)建立帶索引的小字庫(kù)[3]

將全部要顯示的漢字統(tǒng)一建成一個(gè)小字庫(kù),字庫(kù)分為2部分:索引素和字模表。索引表由若干定長(zhǎng)記錄組成,記錄的內(nèi)容為:漢字機(jī)內(nèi)碼、地址碼、識(shí)別碼。其中地址碼是該漢字字模在字模表中的位置,識(shí)別碼標(biāo)志該漢字的點(diǎn)陣形式或字體等。字模表中按素引存放漢字字模。顯示漢字時(shí)先根據(jù)待顯漢字的機(jī)內(nèi)碼在索引表中尋找,找到對(duì)應(yīng)索引記錄后,讀出地址碼和識(shí)別碼,再根據(jù)此從字模表中讀出字模,送顯即可。這種方法可根據(jù)實(shí)際使用對(duì)字庫(kù)進(jìn)行裁剪,硬件開(kāi)銷較小,但是要進(jìn)行復(fù)雜的查詢運(yùn)算,字多了平均尋找時(shí)間就會(huì)變長(zhǎng),效率降低。

2 漢字動(dòng)態(tài)編碼

綜上所述,我們發(fā)現(xiàn):在方法1中,程序員工作量最少,但單片要機(jī)的軟、硬件開(kāi)銷最大;方法2中,單片機(jī)的開(kāi)銷較少,但是編寫(xiě)和維護(hù)軟件極為困難;方法3,介于二者之間。顯然,存儲(chǔ)空間、顯示速度、軟件開(kāi)發(fā)維護(hù)件間存在著矛盾。受各種PC機(jī)模擬軟件的啟發(fā),我們提出一種基于PC機(jī)預(yù)處理的漢字顯示方法--漢字動(dòng)態(tài)編碼,在實(shí)際應(yīng)用中較好地解決了這一問(wèn)題。其基本原理如下:建立一種新的編碼機(jī)制,這個(gè)漢字編碼是動(dòng)態(tài)的;一個(gè)編碼不與某個(gè)漢字具體相聯(lián)系,而僅代表某個(gè)漢字在字庫(kù)中的位置(這個(gè)位置也是動(dòng)態(tài)的);用該碼代替程序里字符串(C語(yǔ)言)或數(shù)據(jù)段(匯編語(yǔ)言)內(nèi)漢字的機(jī)內(nèi)碼,單處機(jī)顯示程序可根據(jù)這個(gè)新的編碼直接在專門(mén)建立的動(dòng)態(tài)小字庫(kù)中找到字模,不用進(jìn)行復(fù)雜的尋址、查找等運(yùn)算,如圖1所示。

實(shí)現(xiàn)漢字動(dòng)態(tài)編碼的過(guò)程就是先進(jìn)行漢字識(shí)別,然后建立編碼字典、提取字模、建立動(dòng)態(tài)字庫(kù)、改寫(xiě)機(jī)內(nèi)碼。首先掃描一遍程序文件,識(shí)別其中的漢字,將它們按出現(xiàn)先后順序或機(jī)內(nèi)碼的大小排序,重復(fù)出現(xiàn)的剔除,建立了一個(gè)編碼字典;根據(jù)漢字在編碼字典的位置(序號(hào)),可以對(duì)漢字按區(qū)碼、位碼進(jìn)行編碼,也可以采用其它的方法編碼,總之序號(hào)與它的動(dòng)態(tài)編碼存在一一對(duì)應(yīng)關(guān)系;根據(jù)字典中每個(gè)漢字的機(jī)內(nèi)碼依次從PC機(jī)的漢字點(diǎn)陣字庫(kù)中提取字模,順序存儲(chǔ),建立一個(gè)小規(guī)模的動(dòng)態(tài)字庫(kù),這樣每個(gè)漢字的字模在字庫(kù)中的位置就與其在編碼字典中的序號(hào)、動(dòng)態(tài)編碼一一對(duì)應(yīng)了。最后,再掃描一遍程序文件,按照編碼字典將每個(gè)漢字的機(jī)內(nèi)碼改寫(xiě)為對(duì)應(yīng)的動(dòng)態(tài)編碼。因?yàn)槌绦蛭募械臐h字隨時(shí)會(huì)增減,編碼隨之而變,字庫(kù)的大小也隨時(shí)在變。所以稱之為動(dòng)態(tài)編碼和動(dòng)態(tài)字庫(kù)。

考慮一般應(yīng)用場(chǎng)合,1000個(gè)左右的漢字即可滿足要求,按照漢字動(dòng)態(tài)編碼方法所需的字庫(kù)僅為32K字節(jié)大小,只需要1片27256即可,幾乎不用增加什么硬件。這樣,字庫(kù)的大小可由漢字的多少控制,程序的編寫(xiě)和維護(hù)可以沿用中文系統(tǒng)下的習(xí)慣,僅需要編寫(xiě)好的單片機(jī)程序用PC機(jī)進(jìn)行一次預(yù)處理,程序員從繁雜的漢字處理工作中解放出來(lái),有效地降低了軟件和硬件開(kāi)發(fā)成本。

3 漢字動(dòng)態(tài)編碼的具體實(shí)現(xiàn)

實(shí)現(xiàn)漢字動(dòng)態(tài)編碼的關(guān)鍵是建立編碼字典和改寫(xiě)機(jī)內(nèi)碼。下面以是顯示1行漢字"天上有個(gè)太陽(yáng),水中有個(gè)月亮"為例,說(shuō)明動(dòng)態(tài)編碼的實(shí)現(xiàn)過(guò)程。

(1)漢字識(shí)別

漢字在PC機(jī)內(nèi)的存儲(chǔ)和處理是用機(jī)內(nèi)碼來(lái)實(shí)現(xiàn)的。每個(gè)漢字的機(jī)內(nèi)碼是唯一的,由2個(gè)字節(jié)組成,分區(qū)碼和位碼,為了和西文的ASCII碼有區(qū)別,漢字機(jī)內(nèi)碼的區(qū)碼和位碼的取值都大于0A0H。我們要處理的源程序文件都是文本文件,存儲(chǔ)的都是西文字符、控制符的ASCII碼和中文字符的機(jī)內(nèi)碼,當(dāng)掃描到文件中大于0A0H的字節(jié)內(nèi)容時(shí),即可判斷該字節(jié)是漢字機(jī)內(nèi)碼的1個(gè)字節(jié),而且肯定是成對(duì)出現(xiàn),第1個(gè)字節(jié)是區(qū)別,第2個(gè)字節(jié)是位碼,都大于0A0H,否則出錯(cuò)。

在C和匯編程序中表示字符的方式有所不同,但最終字符在文件中的存儲(chǔ)格式是一樣的。顯示上面那行漢字,用C語(yǔ)言可以表示為:

char OneSent[]="天上有個(gè)太陽(yáng),水中有個(gè)月亮";

printfhz(OneSent);/*printfhz()顯示函數(shù)*/

用十六進(jìn)制編輯器(我們用的是UEdit32)察看文件中C語(yǔ)言字符串定義語(yǔ)句為:

63 68 61 72 20 20 4F 6E 65 53 65 6E 74 5B 5D 20 3D 20 22 CC EC C9 CF D3 D0 B8 F6 CC AB D1 F4 A3 AC CB AE D6 D0 D3 D0 B8 F6 D4 C2 C1 C1 22 20 3B 0D 0A

用匯編語(yǔ)言可以表示為:

ONESENT:DB '天上有個(gè)太陽(yáng),水中有個(gè)月亮',00H

MOV DPTR,ONESENT

LCALL DISPLAY;DISPLAY是顯示子程序

用十六進(jìn)制編輯器察看上面用匯編語(yǔ)言定義字符串的那一條語(yǔ)句為:

4F 4E 45 53 45 4E 54 3A 44 42 20 27 CC EC C9 CF D3 D0 B8 F6 CC AB D1 F4 A3 AC CB AE D6 D0 D3 D0 B8 F6 D4 C2 C1 C1 27 2C 30 30 48 0D 0A

由此可以觀察到情況確如前所述。

(2)建立編碼字典

編碼字典是在掃描的同時(shí)逐步建立起來(lái)的,每掃描到一個(gè)漢字(包括全角符號(hào)),即與字典中已有的字符進(jìn)行比較,如沒(méi)有重復(fù),是新的字符就順序存入字典,否則繼續(xù)掃描,直至文件結(jié)屬。由于每個(gè)字符都是從尾部添加的,它們的序號(hào)也是依次遞增的,根據(jù)序號(hào)就可以進(jìn)行動(dòng)態(tài)編碼了。由于顯示的漢字一般都得在256個(gè)以上,即使進(jìn)行動(dòng)態(tài)編碼,也需要用2字節(jié)編碼來(lái)實(shí)現(xiàn)。以MCS51系列單片機(jī)和16×16點(diǎn)陣漢字做一優(yōu)化編碼示例:8051的地址指針DPTR是16位指針,由高、低2字節(jié)指針DPH、DPL組合而成,如果將存儲(chǔ)器按0FFH(256)字節(jié)分布,修改DPH即可直接尋址到任一頁(yè),修改DPL可尋址該頁(yè)的任一字節(jié)。一個(gè)16×16點(diǎn)陣漢字的字模是32字節(jié)大小,每頁(yè)存儲(chǔ)器正好能容納8個(gè)漢字字模。可以優(yōu)化設(shè)計(jì)動(dòng)態(tài)編碼的高字節(jié)指向字模的頁(yè)地址(DPH),低字節(jié)指向字模在該頁(yè)的首地址(DPL)。考慮地址空間的有效分配,將字庫(kù)的地址放在0A000H以后(程序或數(shù)據(jù)存儲(chǔ)器均可),動(dòng)態(tài)編碼的高字節(jié)要加上地址有效分配,將字庫(kù)的地址放在0A000H以后(程序或數(shù)據(jù)存儲(chǔ)器均可),動(dòng)態(tài)編碼的高字節(jié)要加上地址的頁(yè)偏移量(大于等于0A0H);考慮漢字與西文字符的區(qū)別,動(dòng)態(tài)編碼的低字節(jié)也需要加上一個(gè)大于或等于0A0H的偏移量。設(shè)某漢字在編碼字典中的序號(hào)為Num,則該漢字的動(dòng)態(tài)編碼為:

動(dòng)態(tài)編碼高字節(jié)=頁(yè)偏移量+Num/8

動(dòng)態(tài)編碼低字節(jié)=偏移量+(Num%8)×32    (1)

偏移量一般可設(shè)為0A0H。當(dāng)單片機(jī)顯示某個(gè)漢字時(shí),只需將其動(dòng)態(tài)編碼的高字節(jié)送DPH,低字節(jié)減0A0H后送DPL,即可得到對(duì)應(yīng)字模的地址指針。

(3)提取字模、建立動(dòng)態(tài)字庫(kù)

漢字機(jī)內(nèi)碼與點(diǎn)陣字庫(kù)的詳細(xì)關(guān)系可參考有關(guān)資料,它們存在如下聯(lián)系:

字模首地址=((機(jī)內(nèi)碼高字節(jié)-1)×94+(機(jī)內(nèi)碼低字節(jié)-1))×N    (2)

注:N為一個(gè)漢字點(diǎn)陣字模的字節(jié)數(shù)。

按照編碼字典內(nèi)容,根據(jù)字模首地址,依次取出漢字字模,順序?qū)懭胍粋€(gè)二進(jìn)制文件,即建成動(dòng)態(tài)字庫(kù)(其它方法略),用燒錄器寫(xiě)入EPROM,就可以使用了。

(4)編碼改寫(xiě)

機(jī)內(nèi)碼是PC機(jī)識(shí)別處理漢字用的,單片機(jī)只能處理我們建立起來(lái)的動(dòng)態(tài)編碼,還得把程序中漢字的僅機(jī)碼根據(jù)編碼字典改成對(duì)應(yīng)的動(dòng)態(tài)編碼才行。由于在編寫(xiě)源程序的文本編輯器中看到的是經(jīng)過(guò)系統(tǒng)處理過(guò)的字節(jié),看不到漢字的機(jī)內(nèi)碼,也無(wú)法對(duì)其進(jìn)行改寫(xiě)。根據(jù)"漢字識(shí)別"一節(jié)所述,不經(jīng)過(guò)文本編輯器,直接將動(dòng)態(tài)編碼(十六進(jìn)制數(shù))定改磁盤(pán)文件對(duì)應(yīng)位置即可,但是處理過(guò)后的漢字在文本編輯器里會(huì)顯示出亂碼。

(5)漢字顯示

在明白了動(dòng)態(tài)編碼與動(dòng)態(tài)字庫(kù)中字模的關(guān)系后,可以完成按照PC機(jī)下漢字顯示原理進(jìn)行單片機(jī)下的程序設(shè)計(jì),編寫(xiě)前面的函數(shù)printhz()或子程序的DISPLAY,可參考相關(guān)資料[4]。

4 MCS51漢字顯示例程

根據(jù)上述漢字動(dòng)態(tài)編碼方法,我們利用Borland C++編寫(xiě)了PC機(jī)預(yù)處理程序,將ASM51或C51源程序用PC機(jī)預(yù)處理后,建立了動(dòng)態(tài)字庫(kù)和改寫(xiě)了機(jī)內(nèi)碼,并且用ASM51寫(xiě)了一個(gè)針對(duì)MCS51進(jìn)行優(yōu)化的子程序DIS_CHAR。它顯示一個(gè)西文或中文字符,實(shí)現(xiàn)過(guò)程如圖2所示。

西文字符碼的顯示與流字顯示基本相同,將西文字庫(kù)(僅數(shù)字和字符部分)裝入程序存儲(chǔ)器中,根據(jù)ASCII碼的值計(jì)算出字模首地址,將字符字模依次讀出,再送顯示即可。

此方案不但可用于單片機(jī)系統(tǒng)中,還可應(yīng)用于任何無(wú)中文系統(tǒng)支持的嵌入式系統(tǒng)中。根據(jù)這個(gè)思路還可設(shè)計(jì)出不同字體、點(diǎn)陣混合的字庫(kù),支持包含2萬(wàn)多個(gè)字符的新國(guó)標(biāo)編碼,甚至矢量字體在單片機(jī)系統(tǒng)中的應(yīng)用也成為可能。由于技術(shù)水平有限,此方案還存在一些不足之處,如改寫(xiě)編碼后源程序中漢字顯示為亂碼,不知道改碼處理是否正確,操作比較繁瑣。如果能采用插件技術(shù)實(shí)現(xiàn)此方案,編輯器中能正常顯示漢字,而輸出已經(jīng)是改碼后的程序文件,則能很好地解決上述不足。在這里,我們拋碼引玉,希望有興趣的朋友一起合作,實(shí)現(xiàn)單片機(jī)中文顯示的廣義開(kāi)發(fā)平臺(tái)。

動(dòng)態(tài)編碼預(yù)處理的C語(yǔ)言源程序(在BC++3.1下調(diào)試通過(guò))見(jiàn)網(wǎng)站補(bǔ)充版(http://www.dpj.com.cn)

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉