<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 設計應用 > 漢字的動(dòng)態(tài)編碼與顯示方案

漢字的動(dòng)態(tài)編碼與顯示方案

作者: 時(shí)間:2008-06-30 來(lái)源:?jiǎn)纹瑱C與嵌入式系統應用 收藏

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

本文引用地址:http://dyxdggzs.com/article/84984.htm

       因為漢字本身的特點(diǎn),顯示漢字始終是計算機在我國應用普及的一個(gè)障礙。最初,為了能在PC機上顯示、處理漢字,國人發(fā)明了一種硬件設備"漢卡",后來(lái)各種各樣的采用純軟件技術(shù)的中文DOS逐漸成熟,其中、西文軟件的運行速度和性能還是有明顯的差距。最終在軟件進(jìn)入支持UNICODE、真正實(shí)現國際化的WIN95以后,硬件跨入"奔騰"時(shí)代,才實(shí)現了漢字與西文的統一顯示,但是這一切是以硬件資源的飛速發(fā)展為前提的。以國際GB2312為例,一、二級漢共收錄了6000多個(gè)漢字,每個(gè)字按16×16點(diǎn)陣計算,字模需要占用32字節的存儲空間,整個(gè)字庫的規模在200k字節以上,高點(diǎn)陣(24點(diǎn)陣以上)和矢量字庫以及Windows用的TrueType字體的字庫規模都是幾兆字節大小,這在

 
早期的386時(shí)代是難以想象的。單片機因為使用靈活、結構簡(jiǎn)單、體積小、成本低而在工業(yè)和生活中得到廣泛應用,也正是因此,它的硬件資源很有 限,尋址和計機能力都遠低于PC機,顯示漢字更受限制。人們不滿(mǎn)足單片機系統采用LED數碼管的簡(jiǎn)單顯示,根據單片機的特點(diǎn),開(kāi)發(fā)出了很多種漢字顯示方法。

       1 幾種常用單片機顯示漢字方法

       (1)采用標準字[1]

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

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

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

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

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

       2 漢字

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

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

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


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

       實(shí)現漢字動(dòng)態(tài)編碼的關(guān)鍵是建立編碼字典和改寫(xiě)機內碼。下面以是顯示1行漢字"天上有個(gè)太陽(yáng),水中有個(gè)月亮"為例,說(shuō)明動(dòng)態(tài)編碼的實(shí)現過(guò)程。
 
      (1)漢字識別
 
      漢字在PC機內的存儲和處理是用機內碼來(lái)實(shí)現的。每個(gè)漢字的機內碼是唯一的,由2個(gè)字節組成,分區碼和位碼,為了和西文的ASCII碼有區別,漢字機內碼的區碼和位碼的取值都大于0A0H。我們要處理的源程序文件都是文本文件,存儲的都是西文字符、控制符的ASCII碼和中文字符的機內碼,當掃描到文件中大于0A0H的字節內容時(shí),即可判斷該字節是漢字機內碼的1個(gè)字節,而且肯定是成對出現,第1個(gè)字節是區別,第2個(gè)字節是位碼,都大于0A0H,否則出錯。
在C和匯編程序中表示字符的方式有所不同,但最終字符在文件中的存儲格式是一樣的。顯示上面那行漢字,用C語(yǔ)言可以表示為:
char OneSent[]="天上有個(gè)太陽(yáng),水中有個(gè)月亮";
printfhz(OneSent);/*printfhz()顯示函數*/
用十六進(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
由此可以觀(guān)察到情況確如前所述。
 
      (2)建立編碼字典

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

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

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

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

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

       漢字機內碼與點(diǎn)陣字庫的詳細關(guān)系可參考有關(guān)資料,它們存在如下聯(lián)系:
字模首地址=((機內碼高字節-1)×94+(機內碼低字節-1))×N    (2)
注:N為一個(gè)漢字點(diǎn)陣字模的字節數。

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

       (4)編碼改寫(xiě)

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

       (5)漢字顯示

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


       4 MCS51漢字顯示例程

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

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

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

c++相關(guān)文章:c++教程


led顯示器相關(guān)文章:led顯示器原理




評論


相關(guān)推薦

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

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>