|
摘要:本文論述了硬件漢字庫的基本原理和具體制作步驟并利用P89C51RD2 作為主控CPU 240x128點陣的液晶和硬件漢字庫將一部科幻小說嵌入其中開機后即可閱讀文章中給出了具體的電路和相應的軟件 關鍵詞:硬件漢字庫 液晶顯示 P89C51RD2 _______________________ 隨著液晶顯示技術的發展和應用 , 越來越多的開發人員希望在自己開發的儀器設備中使用液晶屏幕來顯示漢字,通常的漢字顯示方式是先根據所需要的漢字提取漢字點陣如16x16 點陣,將點陣文件存入ROM 形成新的漢字編碼,而在使用時則需要先根據新的漢字編碼組成語句再由MCU 根據新編碼提取相應的點陣進行漢字顯示,在這種顯示方式中如果使用的漢字數量較大或語句較多時,利用漢字的新編碼組成語句將是一件繁瑣而枯燥的工作。 如果有新的漢字加入那么漢字庫的維護也成問題,而我們日常生活的一些手持工具上如手機快譯通等等它們可以任意輸入漢字不僅靈活性大而且檢索速度快,這其中的主要原因就是在這些設備中固化了硬件漢字庫。而半導體技術的發展使得大容量FLASH ROM 的價格大大下降從而使用硬件漢字庫的儀器設備的成本大大下降,因此越來越多的技術開發人員開始關注起硬件漢字庫希望能在自己開發的設備中設計并使用硬件漢字庫,達到加快產品開發速度降低軟件成本的目的。 一硬件漢字庫相關知識 1 漢字機內碼國標碼和區位碼 在PC 機的文本文件中,漢字是以機內碼的形式存儲的。每個漢字占用兩個字節長度為了和ASCII碼區別,范圍從十六進制的0A1H 開始小于80H 的為ASCII 碼,將機內碼每個字節的最高位屏蔽掉,再以十六進制的形式顯示出來則為國標碼。將機內碼的每個字節各減去0A0H 再以十進制顯示出來,即為該漢字的區位碼。例如"國"字的機內碼國標碼和區位碼如表1 所示 表1 國字的機內碼國標碼和區位碼 類別數值高位字節低位字節 機內碼B9FAH 1 0 1 1 1 0 0 1 1 1 1 1 1 0 1 0 國標碼397AH 0 0 1 1 1 0 0 1 0 1 1 1 1 0 1 0 區位碼195AH 0 0 0 1 1 0 0 1 0 1 0 1 1 0 1 0 即區位碼機內碼0A0AOH 就國字而言其區位碼和機內碼的關系為 195AH 區位碼0B9FAH 機內碼0A0A0H 記住這個關系是我們理解下面有關程序的關鍵 2 國標漢字字符集與區位碼 根據對漢字使用頻率程度的研究可把漢字分成高頻字約100 個常用字約3000 個次常用 字約4000 字罕見字約8000 個和死字約45000 個即正常使用的漢字達15000 個。我國1981 年公布了通訊用漢字字符集基本集及其交換碼標準GB2312-80 方案,把高頻字常用字和次常用字集合成漢字基本字符集共6763 個,在該字符集中按漢字使用的頻度又將其分為一級漢字3755 個,按拼音排序二級漢字3008 個,按部首排序再加上西文字母數字圖形符號等700 個,國家標準的漢字字符集GB2312-80 在漢字操作系統中是以漢字庫的形式提供的漢字庫結構作了統一規定如圖1 所示
此主題相關圖片如下:
即將字庫分成94 個區每個區有94 個漢字,以位作區別每一個漢字在漢字庫中有確定的區和位。編號用兩個字節這就是所謂的區位碼。區位碼的第一個字節表示區號,第二個字節表示位號,因而只要知道了區位碼就可知道該漢字在字庫中的地址。每個漢字在字庫中是以點陣字模形式存儲的,如一般采用16x16 點陣形式,每個點用一個二進制位表示,存1 的點當顯示時可以在屏上顯示一個亮點,存0 的點則在屏上不顯示,這樣就把存某字的16 16 點陣信息直接用來在顯示器上按上述原則顯示,則將出現對應的漢字如一個國字的16 16 點陣字模如圖2 所示。當用存儲單元存儲該字模信息時將需32 個字節地址在圖2 的右邊寫出了該字模對應的字節值
此主題相關圖片如下:
3 液晶顯示模塊特性與字模數據 漢字顯示是國內應用圖形液晶顯示模塊的目的之一,目前對硬件漢字庫比較關心的技術人員大多是想將其應用到圖形點陣液晶顯示器中,但目前有關液晶顯示的資料大多數是介紹通過字模軟件取出的點陣數據是如何送往液晶顯示器的,因此作者在此作一下比較要在液晶屏幕上顯示出這個點陣圖形需要將相應的點陣數據送入液晶顯示驅動器,但對于不同的液晶顯示驅動器要顯示同一圖形所需要送入的數據排列順序可能不同,作者曾經使用過內置D61202U 液晶顯示驅動控制器和內置T6963C 液晶顯示驅動控制器的液晶顯示模塊,同樣是顯示16 16 點陣的國 字則需要的點陣數據如下 HD61202U DB 000H,0FEH,002H,00AH,08AH,08AH,08AH,0FAH DB 08AH,08AH,08AH,00AH,002H,0FEH,000H,000H DB 000H,0FFH,040H,048H,048H,048H,048H,04FH DB 048H,049H,04EH,048H,040H,0FFH,000H,000H 由于HD61202U 顯示存儲器的特性不能將計算機內的漢字庫提出直接使用,需要將其旋轉90 度后再寫入,也就是有些字模軟件如zimo22.exe 可到www.c51bbs.com上免費下載設置為豎向倒序取模后所得的數據其生成字庫的格式是前16 個字節為上半部16 8 點陣字模數據后16 個字節為下半部16x8 點陣字模數據,讀者如果與圖2 中的相應數據作比較可以看出如果僅僅從數據上是看不出兩者的聯系的,如果在這種液晶顯示器上要使用硬件漢字庫則讀出的點陣信息必須經過處理方可送出顯示增加了使用難度 T6963C DB 000H,000H,07FH,0FCH,040H,004H,05FH,0F4H DB 041H,004H,041H,004H,041H,004H,04FH,0E4H DB 041H,044H,041H,024H,041H,024H,05FH,0F4H DB 040H,004H,040H,004H,07FH,0FCH,040H,004H 這些數據也是通過字模軟件得出的讀者再與圖2 中的32 個數據相比較可以看出兩者在數值和排列順序上都是一致的,正是這種特性使得筆者選擇了內置T6963C 的液晶顯示模塊作為論述開發硬件漢字庫的例子 二漢字庫的制作 在本節中筆者將論述將16 16 點陣的宋體漢字庫燒錄到256KB 的存儲器中的具體方法,這也是讀者比較關心的問題。本例中使用了AT29C020 該產品是ATMEL 公司生產的高達256KB 的FLASH ROM ,讀者也可以使用其它容量不小于256KB 的產品,但在具體電路設計時應注意引腳定義和邏輯關系,并在燒錄時選擇相應的型號UCDOS 軟件有一個名字為HZK16 的文件,這就是16 16 的國標漢字點陣文件,在該文件中按漢字區位碼從小到大依次存有:國標區位碼中的所有漢字,每個漢字占用32 格字節,每個區為94 個漢字,如果顯示其屬性可以看出其大小為262KB 。當寫入AT29C020A 時可以將多于256KB 的部分截去,實際上在國標漢字點陣字庫中二級漢字排到第87 區,從第88 區開始就是空白,所以將多余部分截去不會影響實際使用。在實際操作中硬件漢字庫的制作和普通的程序存儲器的編程沒什么不同,注意將HZK16 文件調入時要使用二進制方式打開編程并校驗成功后,即可將存儲器取下備用,這樣一個硬件漢字庫就制作好了。針對不同的應用讀者也可以選用其它大容量甚至是串行數據存儲器從而可以擴展硬件漢字庫的使用范圍。在此也一并向大家推薦容量為512KB 甚至更大的存儲器除了可以存儲全部的國標漢字外還可以存儲8 16 的ASCII 碼點陣數據以及漢字語句編碼數據,使用起來更加方便。串行數據存儲器如AT45DB041B 等特點是占用口線少體積小和成本低如果對于速度要求不是很高的場合非常適宜 三硬件漢字庫使用電路 在本節中筆者使用PHILIPS 公司的產品P89C51RD2 作為主控CPU ,使用內置T6963 控制器的240x128 點陣圖形液晶顯示器并結合硬件漢字庫的使用,將一部3 萬多字的小說嵌入其中,開機后就可以閱讀小說。P89C51RD2 是PHILIPS 公司于2001 年發布的一款非常優秀的單片機,該單片機是基于8 位80C51單片機的派生產品,它在完全保留80C51 指令系統和硬件結構的大框架外發生了多方面的加強擴展翻新和創新,P89C51RD2 將原有的對外數據和程序存儲器的16 位尋址機制加以利用,把片上的RAM 擴展到1K 字節,片上的FLASH EPROM 擴展到64K 字節,由于一個漢字的內碼占用兩個字節,所以1024 字節可以存儲512 個漢字所以64KB 的閃存可以存儲3 萬多漢字。 本系統使用了Microtips Technology Inc.公司生產的內置Toshiba 公司生產的T6963C 的液晶顯示器型號為MTG-F24128CMNHSCW 具有CCFL 背光相關接口信息如下
此主題相關圖片如下:
此主題相關圖片如下:
硬件設計說明 由于AT29C020 的容量為256KB 而80C51 系列微控制器只能管理64KB 的數據空間所以可以將 AT29C020 分成8 頁每頁32KB 占單片機系統數據空間的0000 7FFFH 剩余32KB 空間為單片機系統的 其它存儲器和外設 A15 反相后作為液晶顯示器的片選LCD/CS P1.5 是控制液晶顯示器正顯和反顯的該液晶顯示器的 復位電平為低電平與P89C51RD2 正好相反 四顯示原理與軟件編制 在第一節中我們已經得出國字的區位碼為195AH 換算成十進制為2590 ,即國字的點陣位 于第25 區的第90 個字的位置,相當于在文件HZK16 中的位置為32 [(25-1) 94 (90-1)] 75040B 以后的32 個字節為國的顯示點陣。 在本系統中AT29C020 的A15 A17 分別連接到P1 口的P1.0 P1.1 和P1.2 作為頁選擇控制A0 A14 直接連接單片機的A0 A14 利用MOVX 指令連續取32 個字節送LCD 的相應位置就能實現正確的漢字顯示。 由于240 128 點陣的LCD 顯示器每行只能顯示15 個漢字16 16 點陣漢字所以可以將需要顯示的語句按15 個漢字為1 行進行編寫標點符號要用全角不足15 個漢字的則補空格這就是下面軟件中的MENG.ASM 中的內容 為方便讀者將已經通過匯編的有關程序列出有關LCD 的具體使用方法請見文獻[2] 主程序 C_ADD EQU 8001H 液晶命令地址 D_ADD EQU 8000H 液晶數據地址 DAT1 EQU 30H DAT2 EQU 31H COM EQU 32H CODE1 EQU 33H COUNT EQU 34H O_Y EQU 35H O_X EQU 36H COUNT_X EQU 37H ORG 0000H SJMP START ORG 0030H START: MOV SP, #60H ORL AUXR, #02H EXTRAM 位1 訪問外部數據存儲器 ANL AUXR1, #0FH ENBOOT=0 訪問到FLASH CLR P1.5 正顯 LCALL INT 初始化設置子程序 LCALL CLEAR 清屏 MOV DPTR, #TABLE 科幻小說的開頭 MOV O_Y, #00H PUSH DPH PUSH DPL LOOP: POP DPL POP DPH MOV R0, #0E0H 字模數據暫存區 MOV R7, #30 每個漢字為2 字節每行15 個漢字需30 字節 PRHZ3: CLR A MOVC A, @A+DPTR MOV @R0,A INC R0 INC DPTR DJNZ R7, PRHZ3 PUSH DPH PUSH DPL MOV O_X, #00H MOV R0, #0E0H MOV COUNT_X, #15 LCD112: MOV 24H, @R0 24H 和25H 為暫存緩沖存內碼 INC R0 MOV 25H, @R0 INC R0 MOV A, 24H CLR C SUBB A, #0A1H 轉換為區位碼 MOV 24H, A MOV A, 25H CLR C SUBB A, #0A1H MOV 25H, A MOV A, R0 PUSH ACC LCALL DPONHZ 取字模數據并存入0C0H 開始的寄存器 LCALL WRI_CC 送出顯示 POP ACC MOV R0, A INC O_X INC O_X DJNZ COUNT_X,LCD112 1 行漢字送完跳轉 MOV A, O_Y ADD A, #10H MOV O_Y, A MOV A, O_Y CJNE A, #80H,LOOP MOV O_Y, #00H LCALL DELAY 送完1 屏后延長時間以便于閱讀 LCALL DELAY LCALL DELAY LCALL DELAY LCALL DELAY LCALL DELAY POP DPL POP DPH PUSH DPH PUSH DPL MOV A, DPH SUBB A, #0DFH 小說結尾地址如果是結尾則復位重新開始 JNC RST1 JMP LOOP RST1: MOV A, DPL SUBB A, #2AH JNC RST JMP LOOP RST: JMP START DPONHZ: MOV A, 24H 取字模數據至0C0H 開始的內部存儲區 MOV B, #94 MUL AB ADD A, 25H MOV 25H, A CLR A ADDC A, B MOV 24H, A CLR C RRC A CLR C RRC A MOV P1, A LCALL RL245 CLR 24H.7 MOV DPH, 24H MOV DPL, 25H MOV R2, #32 MOV R1, #0C0H DPHZ2: MOVX A, @DPTR INC DPTR MOV @R1, A INC R1 DJNZ R2, DPHZ2 RET RL245: MOV R7, #05 24H25H 左移5 位 RLL1: CLR C MOV A, 25H RLC A MOV 25H,A MOV A, 24H RLC A MOV 24H, A DJNZ R7, RLL1 RET R_ST: MOV DPTR, #C_ADD 讀狀態 MOVX A, @DPTR RET ST01: LCALL R_ST 讀寫一數據前 JNB ACC.0, ST01 JNB ACC.1, ST01 RET ST2: LCALL R_ST 連續讀前 JNB ACC.2, ST2 RET ST3: LCALL R_ST 連續寫前 JNB ACC.3, ST3 RET ST6: LCALL R_ST JB ACC.6, ERR RET ERR: LJMP ST6 PR1: LCALL ST01 MOV A, DAT1 LCALL PR13 PR11: LCALL ST01 MOV A, DAT2 LCALL PR13 PR12: LCALL ST01 MOV A, COM LJMP PR14 PR13: MOV DPTR, #D_ADD PR14: MOVX @DPTR, A RET PR2: LCALL ST01 MOV DPTR, #D_ADD MOVX A, @DPTR MOV DAT2, A RET INT: MOV DAT1, #00H 初始化設置子程序 MOV DAT2, #00H MOV COM, #40H LCALL PR1 MOV DAT1, #20H MOV DAT2, #00H MOV COM, #41H LCALL PR1 MOV DAT1, #00H MOV DAT2, #08H MOV COM, #42H LCALL PR1 MOV DAT1, #20H MOV DAT2, #00H MOV COM, #43H LCALL PR1 MOV COM, #0A7H LCALL PR12 MOV COM, #80H LCALL PR12 MOV COM, #9CH LCALL PR12 RET CLEAR: MOV DAT1, #00H 設置顯示存儲器首地址 MOV DAT2, #00H MOV COM, #24H LCALL PR1 MOV R3, #00H 設置循環量8K 字節 MOV R4, #20H MOV COM, #0B0H 設置自動寫方式 LCALL PR12 CLEAR1: LCALL ST3 判狀態位S2 MOV A, #00H 置數據0 LCALL PR13 寫入數據 DJNZ R3, CLEAR1 循環 DJNZ R4, CLEAR1 MOV COM, #0B2H 設置自動寫結束指令 LCALL PR12 RET WRI_CC: PUSH O_X 將字模數據送出顯示 PUSH O_Y MOV A, O_Y MOV B, #20H MUL AB ADD A, O_X MOV O_X, A MOV A, B ADDC A, #08H MOV O_Y, A MOV R0, #0C0H MOV COUNT, #10H WRI_CC1:MOV DAT1, O_X MOV DAT2, O_Y MOV COM, #24H LCALL PR1 MOV A, @R0 MOV DAT2,A INC R0 MOV A, @R0 INC R0 MOV DAT1, A MOV COM, #0C0H LCALL PR11 MOV DAT2, DAT1 LCALL PR11 MOV A, #20H ADD A, O_X MOV O_X, A CLR A ADDC A, O_Y MOV O_Y, A DJNZ COUNT, WRI_CC1 POP O_Y POP O_X RET DL1MS: MOV R4,#0C0H DLY1: NOP DJNZ R4,DLY1 RET DL10MS: CALL DL1MS CALL DL1MS CALL DL1MS CALL DL1MS CALL DL1MS CALL DL1MS CALL DL1MS CALL DL1MS CALL DL1MS CALL DL1MS RET DELAY: MOV R5,#0C8H ;延時1 秒 DL5MS: MOV R4,#0FAH DLY: NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP DJNZ R4,DLY DJNZ R5,DL5MS RET INCLUDE 'MENG.ASM' END MENG.ASM 的開頭部分如下所示由于該篇科幻小說太長故只列出了開頭每行為15 個漢字標點 符號全部采用全角 TABLE: DB ' 第一章單杰圣士' DB ' 邦托烏是矗立大地的最偉' DB '大的都會地球上歷史最悠久的城' DB '市自三千二百五十年前地球上' DB '所有的民族由經濟共同體發展至政' DB '治大統一的國家代表中央權力核' DB '心的聯邦政府便在這從未有過的' DB '宏偉都會里成立' DB ' 邦托烏的存在代表了舊' DB '有文明的消失再沒有國界宗教' DB ' 民族這類使人世紛爭永無休止的' DB '因素存在著' DB ' 經過毀滅性的戰爭后聯邦國' DB '象浴火后的鳳凰獲得新的生命' DB '在聯邦政府強有力的統治下這飽' DB '經劫難的星球終于出現了前所未' DB '有的長治久安' DB ' 邦托烏外還有四十八個大' DB '城市全球二十多億人便聚居在這' DB '些城市里城市外是受到核污染和' DB '宇宙射線侵襲的廢墟據聯邦政府' DB '的宣告它們已不適合任何生命的' DB '繁衍邦托烏里最著名的建筑物' DB '是聯邦政府元首和部長們辦公的' DB '三角大樓這與眾不同的建筑物' DB ' 是世界上最高的建筑物亦是人' DB '類建筑技術的頂尖杰作聯邦政府' DB '的建筑法令內明文規定不準' DB '建造比她更高的建筑物使她永背' DB '著最偉大的美譽' DB ' 人們都喚她作金字塔' DB ' 她代表一個偉大時代的產生' DB '象征古老智慧變成被嘲弄和訕笑對' DB '象的年代君臨大地' 只要遵守該格式將全部內容錄入經匯編無誤后,將生成的BIN 文件寫入P89C51RD2 并保證整個硬件 電路正確那么上電復位后就請欣賞您的科幻小說吧 參考文獻 [1]徐卓農,張永忠.單片機系統中的漢字顯示.單片機與嵌入式系統應用.2001(7):31 34 [2]李維提,郭強.液晶顯示應用技術.第1 版.北京:電子工業出版社.2000.3 [3]王士元.C 高級實用程序設計.第1 版.北京清華大學出版社.1996.6 [4]P89C51RX2 DATA SHEET. Philips Semiconductors. 2001. [5]MTG-F24128CMNHSCW, LCD MODULE SPECIFICATION FOR CUSTOMER S APPROVAL. Microtips Technology Inc. 1999. |