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