摘 要:嵌入式系統(tǒng)的應(yīng)用日益廣泛,在中國嵌入式系統(tǒng)迫切需要使用更為友善的漢字界面,嵌入式系統(tǒng)下漢字顯示問題就顯得十分重要。本文詳細(xì)探討了嵌入式系統(tǒng)中建立專用小型漢字庫的方法和利用點(diǎn)陣進(jìn)行漢字的顯示的原理、程序設(shè)計方法與步驟。
關(guān)鍵詞:嵌入式系統(tǒng) 內(nèi)碼 字模 點(diǎn)陣 字庫
中圖分類號:TP36文獻(xiàn)標(biāo)識碼:A文章編號:1674-098X(2012)03(a)-0047-02
1 引言
近年來,基于云平臺和智能網(wǎng)絡(luò)的物聯(lián)網(wǎng)技術(shù)風(fēng)起云涌,從而進(jìn)一步推動了嵌入式系統(tǒng)在各個領(lǐng)域的發(fā)展,掌上電腦、數(shù)字電視、手機(jī)、可視電話、車載智能設(shè)備、數(shù)控機(jī)床等各種數(shù)字化終端的流行都使得嵌入式產(chǎn)品面臨著難得的市場機(jī)會[1]。然而,中國的語言環(huán)境使許多應(yīng)用軟件設(shè)計需要用漢字進(jìn)行提示和人機(jī)交互對話,古老而復(fù)雜的漢字屬于二維平面的方塊字,無論是輸出還是輸入都顯得十分復(fù)雜。因此,利用嵌入式系統(tǒng)的開發(fā)平臺編制能顯示漢字的程序?qū)η度胧较到y(tǒng)產(chǎn)品在中國的普及有著深遠(yuǎn)的意義。本文對在嵌入式系統(tǒng)下的漢字顯示問題作了詳細(xì)的探討。
2 漢字顯示的原理
2.1 漢字的顯示
計算機(jī)上顯示的漢字,是來自存儲在計算機(jī)上的漢字庫。目前,漢字的顯示方法分為兩種,一種是點(diǎn)陣式,一種是矢量式。
點(diǎn)陣字庫的漢字是由點(diǎn)信息構(gòu)成的,由于所占的字節(jié)少,當(dāng)漢字庫較小時,采用它不僅方便,而且制作比較容易[2]。點(diǎn)陣顯示也有多種形式,比較常見的有16*16,24*24兩種。16*16點(diǎn)陣漢字在放大時或打印時,都會出現(xiàn)十分明顯的鋸齒狀,看起來不美觀。為了克服上述問題,又另外提供了24*24點(diǎn)陣,它主要是利用字模的各個字節(jié)在庫中的排列順序與16*16點(diǎn)陣的不同來適應(yīng)打印的要求的。
矢量漢字顯示的特點(diǎn)是可以進(jìn)行各種字體的實(shí)現(xiàn)以及無級縮放。打印出來的漢字比較圓滑,美觀。在現(xiàn)代工業(yè)控制和一些智能化儀器儀表中,越來越多的場所需要用點(diǎn)陣圖形顯示器顯示漢字。
2.2 漢字的編碼
計算機(jī)內(nèi)英文字符是用一個字節(jié)的ASCII代碼表示的。該字節(jié)的最高位一般用作奇偶校驗(yàn),故實(shí)際是用7位碼來表示128個字符。但對眾多的漢字,需用兩個字節(jié)才能表示。國家為此制定了統(tǒng)一標(biāo)準(zhǔn),稱為國標(biāo)碼。國標(biāo)碼規(guī)定組成兩字節(jié)代碼的每個字節(jié)最高位均為0,即每個字節(jié)僅使用7位。這樣在機(jī)器內(nèi)使用時,由于英文的ASCII碼也為7位,因此可能將國標(biāo)碼看成兩個ASCII碼。因而規(guī)定用國標(biāo)碼在機(jī)內(nèi)表示漢字時,每個字節(jié)的最高位置為1,來說明該碼表示漢字。這些國標(biāo)碼的兩字節(jié)最高位加1后的代碼成為計算機(jī)內(nèi)的漢字代碼,簡稱為內(nèi)碼。
為了保證中西文兼容,漢字系統(tǒng)的內(nèi)碼必須允許ASCII碼和漢字同時使用,規(guī)定每個字節(jié)只用7位,如果兩個字節(jié)的最高位是1,則該字符為漢字。以“大”字為例,其國標(biāo)碼表示如圖1(a)所示,內(nèi)碼表示如圖1(b)所示。
2.3 漢字的區(qū)位碼
我們根據(jù)漢字使用的頻繁程度,把漢字進(jìn)行了分類,并對漢字庫結(jié)構(gòu)作了統(tǒng)一規(guī)定。這個規(guī)定將字庫分成94個區(qū),每個區(qū)有94個漢字(以位區(qū)別),每一個漢字在漢字庫中有確定的區(qū)和位編號(用兩個字節(jié))。這就是所謂的區(qū)位碼(區(qū)位碼的第一個字節(jié)表示區(qū)號,第二個字節(jié)表示位號)。只要知道了區(qū)位碼,就可知漢字在字庫中的地址,進(jìn)而在顯示器中將漢字顯示出來。
2.4 內(nèi)碼與區(qū)位碼的轉(zhuǎn)換
使用鍵盤輸入漢字時,相應(yīng)的內(nèi)碼已經(jīng)在程序中存在(即內(nèi)碼已在原漢字的位置),已知漢字的內(nèi)碼并將其轉(zhuǎn)換為區(qū)位碼,就可從字庫中找到對應(yīng)的漢字,將其字模直接顯示即可。漢字內(nèi)碼與區(qū)位碼有固定轉(zhuǎn)換關(guān)系。若漢字內(nèi)碼為十六進(jìn)制數(shù)aaff,則區(qū)號qh和位號wh分別為:
qh=aa-0xa0;
wh=ff-0xa0;
若用十進(jìn)制表示內(nèi)碼為AB,則
qh=A-160;
wh=B-160;
即區(qū)位碼qw為:
qw=100*(A-160)+(B-160);
因而該漢字在漢字庫中離起點(diǎn)的偏移位置(以字節(jié)為單位)計算式為:
offset=(94*(qh-1)+(wh-1))*32L;
因此當(dāng)定義了一個漢字庫,并用函數(shù)打開字庫,再用漢字在庫中的偏移地址找出對應(yīng)的字模,然后將字模按行掃描的辦法(通過循環(huán))在屏幕上顯示出像點(diǎn),存1的點(diǎn)在屏上顯示一個亮點(diǎn),存0的點(diǎn)則不顯示,由此組合成一個漢字。
3 嵌入式系統(tǒng)下漢字的顯示
嵌入式系統(tǒng)下進(jìn)行漢字顯示時,漢字信息來自存儲在系統(tǒng)下的漢字庫,由于系統(tǒng)的存儲空間有限以及嵌入式系統(tǒng)注重效率,若將含全部漢字和符號的標(biāo)準(zhǔn)漢字庫調(diào)入,將會給工作帶來極大的不便,通常的做法是將要用到的漢字從漢字庫中選出來,把他們的點(diǎn)陣存入存儲器中,使用時查找這些漢字的點(diǎn)陣,從而大大節(jié)省程序開銷,提高運(yùn)行速度[3]。同時嵌入式系統(tǒng)下顯示的漢字在字體如字形、字號等方面的要求不高,使用點(diǎn)陣字庫存儲漢字信息就十分可行。所以,建立小型專用漢字庫是很必要的。
3.1 小型專用漢字庫的建立
在嵌入式系統(tǒng)下將菜單中或程序提示中的漢字放在一個專用漢字庫中,而不必使用系統(tǒng)中標(biāo)準(zhǔn)的漢字庫,從而可以大大節(jié)省程序開銷,提高運(yùn)行速度,由于用到的漢字?jǐn)?shù)量很少,所以建立一個小型的漢字庫是比較容易的。
建立一個面向人機(jī)交互界面的小型漢字庫,其主要任務(wù)是將該軟件要用到的漢字字模信息從大型字庫中讀出,存放到小型漢字庫中,顯示漢字時從小型字庫中讀出字模信息顯示漢字。
小型專用漢字庫的結(jié)構(gòu):專用字庫的結(jié)構(gòu)形式可根據(jù)情況而定。其結(jié)構(gòu)定義可表示如圖2所示。
struct hz_mat{
unsigned incode;
char mat[32];
}
struct hzlib{
int n;
struct hz_mat Lib[N];
}clib;
小型漢字庫有一系列顯示碼和字模組成,即橫向一項(xiàng)存儲庫中漢字個數(shù)N和豎向N向存儲漢字機(jī)內(nèi)碼與對應(yīng)的16*16點(diǎn)陣的字模[4]。機(jī)內(nèi)碼在庫中按升序(即從小到大)排列。
小型專用漢字庫的建立:在嵌入式系統(tǒng)下建立小型專用漢字庫的原理是從標(biāo)準(zhǔn)字庫中讀出對應(yīng)的內(nèi)碼和16*16點(diǎn)陣字模,并將其寫到庫結(jié)構(gòu)相應(yīng)的項(xiàng)中去。這樣循環(huán)N次,可將所用的N個漢字均填入小型漢字庫中,然后再用排序程序,將其按內(nèi)碼升序排列。
該庫可作為一個頭文件,用預(yù)編譯包含形式將其和自己的應(yīng)用程序連起來。這樣,在應(yīng)用程序用到庫中的漢字時,便可立即在庫中找出對應(yīng)的字模。也可用程序生成一個小型庫文件,在應(yīng)用程序中用打開文件的方式使用它。
從用該方法生成的“myclib.h”頭文件中的字模清單可以看出漢字內(nèi)碼及其對應(yīng)的漢字字模已按升序排列。其中包含的漢字有“花落知多少”,第一個是“花”字的內(nèi)碼0xa8bb,它處于第27區(qū)的第8位,其后是它的字模;第二個是“知”字的內(nèi)碼0xaad6,它處于第48區(qū)第10位,其后是字模;該庫中共有5個這樣的結(jié)構(gòu)。
3.2 嵌入式系統(tǒng)中顯示漢字的程序?qū)嵗?/p>
利用生成的小型專用漢字庫進(jìn)行漢字顯示的程序中,要將漢字庫以頭文件形式包含到文本文件中。當(dāng)查找漢字時,便以全局變量的形式查找該庫。在進(jìn)行文件包含時,要寫成#include"myclib.h",而不能寫成#include
嵌入式系統(tǒng)的程序執(zhí)行前首先應(yīng)初始化系統(tǒng)的各類函數(shù)。當(dāng)運(yùn)行main函數(shù)時,程序調(diào)用c centry時,即完成初始化程序。程序中,函數(shù)init()為屏幕初始化函數(shù),dis_hz(int x0,int y0,unsigned code)為根據(jù)漢字區(qū)位碼獲得漢字函數(shù),dis_scr(int x,int y,unsigned char*pt,int color)為在屏幕指定位置使用指定顏色顯示漢字函數(shù),unsigned char*get_dismat(unsigned code)為獲得漢字字模信息的函數(shù),該函數(shù)返回漢字的字模。
程序運(yùn)行的結(jié)果為,在屏幕指定的坐標(biāo)處,用程序指定的顏色顯示漢字。
4 結(jié)語
由以上的程序?qū)嵗梢钥闯?,嵌入式系統(tǒng)下漢字的顯示由于建立了小型的專用漢字庫使占用的磁盤空間減少,將小字庫調(diào)入內(nèi)存還可以避免顯示漢字時的頻繁讀盤,大大提高漢字顯示速度。另外,該方法對計算機(jī)要求低,實(shí)用性強(qiáng),適用范圍廣。
參考文獻(xiàn)
[1]張茹,孫松林,余曉剛.嵌入式系統(tǒng)技術(shù)基礎(chǔ)[M].北京:北京郵電大學(xué)出版社,2006.
[2l呂寧,錢璟.16*16點(diǎn)陣漢字顯示[J].教育界:高等教育研究,2011(2):191.
[3]徐卓農(nóng),張永忠.單片機(jī)系統(tǒng)中的漢字顯示[J].單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2001(7):31~33.
[4]于化龍,呂玉琴.基于單片機(jī)的智能終端中漢字顯示的處理[J].嵌入式應(yīng)用,2002(10):43~45.