引言
近年來,以單片機以及嵌入式系統(tǒng)平臺為基礎的各種智能終端廣泛應用于各行各業(yè)的專用設備和產(chǎn)品中,也將逐漸滲透到家用電器和各種消費類電子產(chǎn)品中。
單片機以其價格低廉、技術成熟而廣泛應用于各種低端產(chǎn)品之中,但是由于單片機的尋址能力有限,限定了其最大的存儲空間。比如最常用的MCS-51單片機,其直接尋址的數(shù)據(jù)存儲空間為64k字節(jié),如果通過擴展來得到更大的存儲空間,既增加了系統(tǒng)成本,也為數(shù)據(jù)讀取操作帶來了不便(對擴展區(qū)間的訪問要通過端口操作實現(xiàn))。所以在單片機系統(tǒng)的設計中,存儲空間的大小是一個很重要的因素。
在PC機上的漢字顯示,是來自存儲在PC機上的漢字庫。漢字庫中的漢字以點陣形式組成。如果以一個16x16點陣的漢字庫作為基本字模庫,每個漢字占32 個字節(jié)。GB2312中規(guī)定了6763個二級漢字,則需要的存儲空間大體為6763×32字節(jié),約200多K字節(jié)。顯然,如果要在單片機終端上顯示漢字,不可能把以上所有的“漢字庫”信息都放在單片機系統(tǒng)的存儲空間中。
本文以我實驗室獨立開發(fā)的智能餐飲信息系統(tǒng)為例,首先介紹關于漢字顯示的基礎知識,然后說明在實際應用中如何對系統(tǒng)漢字庫進行裁減,只保留需要在終端上顯示的“漢字庫”信息,最后介紹在實際應用中會涉及到的有關字模提取和字模轉(zhuǎn)化的處理方法。
1:關于漢字顯示的基礎知識
在中文WIN9X下,我們輸入一個雙八位字節(jié),就得到一個漢字,就會認為這雙八位字節(jié)就是對應這樣的字形,這是錯誤的。這個雙八位字節(jié)被稱為漢字的內(nèi)碼(詳見下文),內(nèi)碼對于字庫來說,只是查找字形的索引。通過這個雙八位字節(jié)可以唯一的從漢字庫中查詢得到其對應的漢字字形數(shù)據(jù)(字模)。對應不同編碼標準的字體,內(nèi)碼對應了不同的字形。我們常用的是國標GB2312<<信息交換用漢字編碼字符集>>,包含了最常用的簡體中文文字。
如果系統(tǒng)所使用的“漢字庫”中每個漢字按16x16點陣模式存放,則每個漢字由16x16=256個點組成,占用16x2=32個字節(jié)的連續(xù)內(nèi)存單元。每個字節(jié)有8位,每一位都有兩種狀態(tài),即亮或暗,分別用1或0來表示。在16x16點陣中,用各個位的亮暗來表示一個字,凡是筆畫經(jīng)過的地方都為1(亮), 沒有筆畫的地方都為0(暗),這樣就可以表示不同的漢字。
圖1 是“大”字16x16點陣模式排列放大后的結果。
在PC機中,組成字模的32個字節(jié)默認的排列順序如圖2所示:每行兩個字節(jié),低字節(jié)為DB0~DB7,高字節(jié)為DB8~DB15,每字節(jié)8比特,共16行32個字節(jié)。圖中標出了第1、第2個字節(jié)和第31、第32個字節(jié)的存放位置。
于是,我們可以得到“大”字的漢字字模(32個字節(jié),10進制表示):(1,0,1,0,1,0,1,0,1,4,255,254,1,0,2,128,2,128,2,64,4,64,4,32,8,16,16,14,96,4,0,0)
2.字模提取及數(shù)據(jù)文件下載
2.1 在實際應用中,需要進行字模提取來適應有限的存儲空間
我實驗室獨立開發(fā)的餐飲業(yè)信息系統(tǒng)中就是應用單片機來實現(xiàn)智能點菜終端。系統(tǒng)構成如圖3所示:
在以上系統(tǒng)中,終端中存儲著所有的菜譜信息,操作員通過點菜終端可以瀏覽菜譜。簡單的操作流程為:當操作員通過終端點好了菜以后,終端以無線方式將菜肴信息發(fā)送到基站,基站通過串口將數(shù)據(jù)發(fā)送給服務器,服務器對數(shù)據(jù)進行處理之后要進行入庫、打印和向終端返回等操作。
在本系統(tǒng)中所采用的單片機為MSC-51,帶32K的外部RAM和128K的FLASH存儲器。其中,128K字節(jié)的FLASH存儲空間用作數(shù)據(jù)存儲器,記錄了菜譜、桌位等和業(yè)務相關的信息,另外有64K字節(jié)用作存儲漢字庫(字模)。
GB2312中規(guī)定常用的兩級漢字6763個(每個漢字有32字節(jié)),占用200多K字節(jié)的存儲空間。顯然,不能把漢字庫中的所有漢字字模都下載到終端上,只能是選擇終端需要顯示的漢字的字模進行提取和下載。終端的64K存儲空間可以存儲大約2000個漢字。在實際應用中一般酒店的菜肴數(shù)量在 200~600之間,要用到的漢字數(shù)在400~1800之間,所以64K的存儲空間足夠本系統(tǒng)的應用。
2.2 如何進行字模提取和下載處理
在本系統(tǒng)中,終端數(shù)據(jù)存儲區(qū)中的字庫信息、菜譜、桌位等業(yè)務信息是從服務器上下載得到的。首先,服務器中的處理程序提取相關數(shù)據(jù)并生成各個下載信息文件,然后處理程序?qū)⑦@些下載文件下載到終端上。系統(tǒng)和終端通過串口線相連,以串口通信方式將數(shù)據(jù)下傳到終端的數(shù)據(jù)存儲區(qū)。
字模裁減及填充終端字庫下載文件流程如圖4 所示:
首先,運行在服務器上的處理程序遍歷數(shù)據(jù)庫中的菜譜表、桌位表等所有包含下載信息的、帶有漢字的表記錄。從中找到需要下載的漢字,根據(jù)這些漢字的內(nèi)碼,從系統(tǒng)字庫中得到漢字的字模,經(jīng)過字模轉(zhuǎn)化(在后面介紹),然后保存在字庫下載文件中。
為了保證下傳的漢字字模不會重復,在數(shù)據(jù)庫中創(chuàng)建一個“漢字表”來存儲每個經(jīng)過篩選的漢字的信息。表中有兩個字段,一個用來存儲漢字的內(nèi)碼,另一個用來存儲該漢字字模在字庫下載文件中的偏移地址(終端程序可以通過某個漢字在字庫下載文件中的偏移地址來唯一確定該漢字的字模存放位置)。每得到一個漢字的內(nèi)碼時,先到漢字表中查詢表中是否已經(jīng)包含了該漢字,再決定是否進行提取和下載處理。
然后,處理程序逐個遍歷菜譜表、桌位表等數(shù)據(jù)表項來生成菜譜下載文件、桌位下載文件等。這些下載文件中涉及到的漢字,以該漢字的字模在終端下載字庫文件中的偏移地址來標識。這樣每個漢字可以用兩個字節(jié)唯一標識。
最后,處理程序?qū)⒁陨线@些下載文件通過串口下傳給終端,終端將下載文件的內(nèi)容保存在數(shù)據(jù)存儲區(qū)中,并記錄存放字庫下載文件數(shù)據(jù)區(qū)的起始地址,記為A。當需要顯示漢字時,終端程序先得到該漢字在下載文件中的偏移地址,記為B,然后計算出該漢字字模的存放位置(A+B),從此位置開始連續(xù)讀取32字節(jié),就得到了該漢字字模數(shù)據(jù),之后通過驅(qū)動液晶屏將漢字顯示出來。
3.需要注意的關鍵技術
3.1 漢字字模的提取
先說明一下在中文信息交換標準GB2312中涉及到的三個概念:區(qū)位碼、國標碼、內(nèi)碼。
中文國標字符集是一個94×94的矩陣,其中每一個漢字(包括數(shù)字、英文字母和標點符號)都是二維矩陣中的某個元素。這樣,每一個漢字都可以用一個二元組來表示(x,y)。其中,x是該字所在的行號,y為列號。
GB2312在此基礎上對矩陣進行劃分,分為94個區(qū),每區(qū)94位,x定義了該字所在的行號,y表示該字所在的位號,x和y均以二進制或十六進制表示。這就是“區(qū)位碼”,例如:“啊”字的區(qū)位碼為(0x10,0x01),表示位于16區(qū)第一位。于是漢字庫中的字模存放位置(相對于字庫文件頭的偏移地址)可以由區(qū)位碼計算得到:偏移地址=區(qū)碼×94+位碼。那么“啊”字的字模相對于字庫文件頭的偏移地址等于16×94+1=1505(十進制表示)。
但是許多低位數(shù)字已被其它領域所占用,比如:0x06表示通信確認回答標志。為了不與已經(jīng)存在的信碼相混淆,GB2312在每個區(qū)位碼上加上0x20,這樣形成的碼叫國標碼。例如:“啊”字的國標碼為(0x30,0x21)。
由于通用的ASCII字符的最高位為0,為了在計算機內(nèi)部和之間傳輸漢字時可以和ASCII碼區(qū)別開來,將表示漢字的兩個字節(jié)的最高位都置1。這樣,相當于在國標碼基礎上高低字節(jié)同時加了0x80,這就是上面提到的內(nèi)碼。比如:“啊”字的內(nèi)碼為(0xB0,0xA1)。在計算機內(nèi)部,用內(nèi)碼來唯一標識一個漢字。在程序中,通過調(diào)用系統(tǒng)函數(shù)取得某個漢字的ASCII字符表示,也就得到了這個漢字的內(nèi)碼。
在明白了內(nèi)碼和區(qū)位碼之間的關系后,我們可以根據(jù)某個漢字的內(nèi)碼計算得到該漢字的區(qū)位碼;再通過區(qū)位碼計算得到該漢字的字模在漢字庫表中的偏移地址;從此地址開始的連續(xù)32個字節(jié)就是該漢字的字模信息。
3.2 字模轉(zhuǎn)換
圖1中所示的漢字顯示與字模存放的關系是PC機中的字模存儲格式。而在單片機系統(tǒng)中,選擇不同的液晶驅(qū)動器要求有不同的字模存儲方式。比如我們在實際應用中,使用的是清華蓬遠科貿(mào)公司的HD61202液晶驅(qū)動器。圖5 指示了HD61202液晶驅(qū)動器所要求的字模存放與漢字顯示的關系。圖中標明了標出了第1、第2個字節(jié)和第31、第32個字節(jié)的存放位置。
造成漢字顯示與字模存放有這樣關系是因為不同的液晶驅(qū)動器有不同的掃描顯示方式。所以,為了能夠?qū)h字正確的顯示出來,針對不同的液晶驅(qū)動要做相應的字模轉(zhuǎn)化。字模轉(zhuǎn)化可以自編一個轉(zhuǎn)化函數(shù)來實現(xiàn),在寫入終端字庫下載文件前將32個字節(jié)的字模按位轉(zhuǎn)化為需要的格式,再按字節(jié)順序存入下載文件。
經(jīng)過轉(zhuǎn)化之后,“大”字的字模(32個字節(jié))變成:(32,32,32,32,32,32,160,127,0,64,64,32,16,12,3,0,160,32,32,32,32,48,32,0,1,6,8,16,32,96,32,0), 這就是存放在終端下載字庫中的字模格式。
參考資料:
1:《單片機應用系統(tǒng)設計》 何立民 北京航空航天大學出版社 1994
2:《漢字編碼標準與識別》