王 江 李麗英 劉明德
(江西機電職業技術學院,江西 南昌 330013)
關鍵字:拼音輸入法;低性能單片機;軟件處理
隨著嵌入式系統應用領域的不斷拓展[1],越來越多的嵌入式設備要求實現中文漢字的輸入與顯示。目前應用于智能終端最為廣泛的是美國特捷通訊的T9輸入法,其次有Motorola的iTAP輸入法和Ericson的字能輸入法等[2]。盡管市場上還有許多輸入法,且它們的功能也十分強大,但是它們大多對硬件要求較高,幾乎不支持沒有操作系統的嵌入式產品。而在低端市場,單片機往往需要花費大部分資源來完成輸入法功能,這不免導致系統主功能缺少足夠的資源可供調用,出現頭重腳輕的狀況。因此,研究一種實用且低成本的中文輸入法是非常有市場前景和必要性的。
單片機中的輸入法的傳統思路是:選用較大容量的EEPROM存放漢字字庫,漢字內碼則裝入FLASH中,這樣雖然可以實現輸入法功能,但是其造成了主控芯片的資源大量浪費,FLASH不能用來存放更多的系統功能代碼。而后,雖然出現了帶字庫的LCD,但其做法大都是選擇具有較大程序存儲器的微處理器,以便存儲拼音到字型碼的映射表,這樣雖然可以解決FLASH不足的問題,但是成本大幅提高,產品競爭力將隨之下降。本文的設計思路是:采用已附帶漢字字庫的點陣液晶,直接略去字庫所需的內存;然后將漢字內碼保存到EEPROM,而內碼大小遠小于相應的字庫內容,在此處我們可以節省出大量空間。主控只需要在拼音與內碼之間建立一種對應關系,最后通過鍵盤選擇要輸入的漢字并顯示在液晶屏上。
本系統按功能可劃分為輸入、處理、存儲和輸出四個部分[3]。對于拼音輸入法來說,至少需要實現26 個字母鍵、10個數字鍵、ESC 鍵、OK 鍵、MENU 鍵、MODE 鍵、UP 鍵和DOWN 鍵,可以自制或選擇標準鍵盤。處理器選用NXP 的LPC2103 芯片,它的最高工作速度可達70MHz,擁有32KB的片內FLASH 程序存儲器和8K 的片內SRAM[4],能夠滿足大部分嵌入式系統的需求[5],特別適用于訪問控制和指紋打卡機等小型應用中,如果在該芯片上開發輸入法,作者經過實驗測試得到以下結論:使用傳統方法時片內FLASH 和RAM均存在內存不夠的問題,改進方案是去掉字模部分,引入帶字模的液晶顯示器,這樣就節約了大量的主控芯片的FLASH空間,但由于字庫內碼仍然存放在RAM中,LPC2103的RAM依然不足,所以這里采用24c256作為存儲器,搭配以ST7920為控制器的液晶,最后發現完成輸入法功能后,系統僅使用了主控3KByte FALSH,4KByte RAM,使得存儲量小的主控也能勝任調整后的拼音輸入法。
為了提高顯示效率,避免每次查找漢字內碼時對整個碼表進行遍歷,本文對漢字碼表的存儲地址做了一些調整,將碼表按照字母A-E、F-K、L-P、Q-W、X-Z 分成5 個碼段,處理器可以根據拼音首字母進行分段查找,每段包含的漢字內碼大小都是1Kbyte~2KByte范圍,所以在EEPROM中為每段分別分配了2Kbyte內存。每個拼音讀法之間以空格(空格的內碼是0x20 0x20)隔開,這樣在查找拼音的時候,當遇到0x20 0x20即表示該拼音讀法結束。
鍵盤設計模仿手機T9鍵盤方式,布局如圖1所示。
由圖1可知,按鍵功能存在較多的復用情況,在輸入拼音過程中,將得到不同的結果,所以需要對鍵值編碼進行特殊處理。比如MODE 鍵用來區分當前輸入的模式是拼音還是數字字母,ESC 鍵在不同的狀態下有刪除和退出的功能等。舉例說明,用戶想輸入拼音“wang”,在鍵盤上順序按下鍵“9264”,把這4 個鍵上的字母進行排列組合會得到108 種拼音,其中合法的只有3種,分別是“wang”、“yang”和“zang”[6],我們需要篩選出合法的拼音,這里每組合出一種可能的拼音,系統立即將該拼音按首字母的碼段與其對應的拼音集合進行比較,看該拼音是否合法(即與集合中拼音相同或與這些拼音的前幾個字母相同),若合法,則存儲起來,繼續對比,直到把所有情況列舉完,然后顯示到LCD上。最后使用按鍵“UP”和“DOWN”來選擇目標拼音,并記錄下該拼音在其對應的拼音集合中的位置,留待到EEPROM 中讀取漢字內碼時使用。鍵盤相應流程如圖2所示。
依據上述思路,得到鍵盤碼后,應立即從所有排列組合中篩選出合法的拼音。從圖1中可以看到,每個字母/數字鍵上都不只1 個字母,所以在整個篩選過程中,將組合出(假設輸入5 個鍵,每個鍵上的字母數分別為a,b,c,d,e)種情況,為加快備選拼音與拼音集合的比對速率,程序把拼音集合按首字母分成5段,并以常量數組的形式保存在FLASH中。
拼音與其對應的漢字內碼在存儲中具有很好的對應關系。拼音集合按首字母分為五段,以數組的形式存放在FLASH 中,目標拼音可以迅速地在數組中找到自己在集合中的序號(數組下標)N,而漢字內碼在EEPROM中的存儲順序跟拼音集合的拼音順序是一致的,所以內碼表中第N個空格(空格的內碼是0x20 0x20)和第N+1個空格位置之間的內容就是目標拼音對應的漢字內碼。如表1所示。
ST7920控制器系列中文圖像液晶模塊由ST7920控制驅動器和128*64 點陣的液晶顯示器組成。該控制器提供8 位并行接口、4位串行接口可供選擇,可以顯示數字、字母、中文字型及自定義圖形[7],具有64*16位字符顯示緩存和15*16位總共240 點的ICON 緩存,2M 位的中文字型ROM(CGROM),可提供8192個16*16點陣的中文字型,16K位半寬字型ROM(HCGROM),提供126 個16*8 點陣的西文字型[8]。這些特點大大彌補了低端單片機在存儲空間和控制上的不足。由于LCD自帶漢字字模,所以主控芯片無須執行內碼到字模的轉換,只要將LCD設置為顯示漢字模式,直接發送內碼到顯示控制器,即能看到漢字顯示在屏幕上了。
本文設計的精簡化拼音輸入法方案,同以往的設計相比,解決了小容量FLASH 的主控芯片較難實現拼音輸入法的問題,充分解放了主控的存儲壓力和內碼到字模轉換時的運算壓力。同時,拼音按照首字母分成5個碼段,大大提高了查找內碼的效率。目前,該輸入法已在筆者設計的指紋打卡機中成功應用。

表1 拼音碼與內碼轉換關系