引言
隨著嵌入式技術(shù)的迅猛發(fā)展,人機(jī)交互界面也越來越顯示出它的重要性。實(shí)際的LCD應(yīng)用中要顯示的漢字一般很有限,并不需要完整的漢字庫(kù),再加上完整字庫(kù)在程序中要占用大量空間,因而非完整漢字庫(kù)的研究就有了其自身的現(xiàn)實(shí)必要性。本文以AT91SAM7S256處理器的LCD顯示模塊為例,介紹了非完整漢字庫(kù)的建立方法及其具體實(shí)現(xiàn)。
1 液晶顯示原理
液晶顯示器LCD (Liquid Crystal Display)主要用于文本、圖形及圖像信息的顯示。液晶顯示屏具有輕薄、體積小、耗電量低、無輻射、平面直角顯示以及影像穩(wěn)定不閃爍等特點(diǎn)。液晶是一種介于固態(tài)和液態(tài)之間的有機(jī)化合物。當(dāng)被加熱時(shí),它會(huì)呈現(xiàn)透明的液態(tài),而冷卻的時(shí)候會(huì)結(jié)晶成混亂的固態(tài)。用于液晶顯示器的是Nematic液晶,當(dāng)向液晶通電時(shí),液晶體分子便排列得井然有序,可以使光線容易通過;而不通電時(shí),液晶分子便排列混亂,阻止光線通過。
從整體來看,TN(扭曲向列型)單色液晶顯示器液晶分子的排列就像螺旋形的扭轉(zhuǎn)排列。光線從上向下照射時(shí),通常只有一個(gè)角度的光線能夠穿透下來,通過上濾光片導(dǎo)入上部夾層的溝槽中,再通過液晶分子扭轉(zhuǎn)排列的通路從下濾光片穿出。一旦通過電極給這些液晶分子加電之后,液晶分子變成豎立的狀態(tài),這樣光線就無法通過,結(jié)果在顯示屏上出現(xiàn)黑色。這樣會(huì)形成透光時(shí)(即不加電時(shí))為白、不透光時(shí)(加電時(shí))為黑,字符就可以顯示在屏幕上了。
2 漢字信息的編碼知識(shí)
2.1 漢字的編碼標(biāo)準(zhǔn)
漢字系統(tǒng)對(duì)每個(gè)漢字預(yù)先規(guī)定輸入計(jì)算機(jī)中的代碼,即漢字的外部碼。計(jì)算機(jī)為了識(shí)別漢字,要把漢字的外部碼轉(zhuǎn)換成內(nèi)部碼進(jìn)行存儲(chǔ)和處理。輸出時(shí),還將漢字的內(nèi)部碼轉(zhuǎn)換成漢字的字形碼。主要的漢字編碼有以下幾種:
1) 國(guó)標(biāo)碼:計(jì)算機(jī)與其他系統(tǒng)或設(shè)備之間進(jìn)行漢字代碼信息交換的標(biāo)準(zhǔn)漢字代碼。它用兩個(gè)字節(jié)代碼來表示一個(gè)漢字。行、列各 94(0-93),用先行后列的兩個(gè) 7 位二進(jìn)制數(shù)表示。
2) 區(qū)位碼:每個(gè)漢字(圖形符號(hào))用兩個(gè)字節(jié)表示,每個(gè)字節(jié)只用低 7 位,即最高位為 0 的二進(jìn)制碼。漢字編碼使用的高字節(jié)稱為區(qū)碼,低字節(jié)稱為位碼。區(qū)位碼共 94 個(gè)區(qū),每個(gè)區(qū)有 94 個(gè)位,組成一個(gè) 94*94 的矩陣。
3) 機(jī)內(nèi)碼:中文或西文信息在計(jì)算機(jī)系統(tǒng)中的代碼表示稱為機(jī)內(nèi)碼。是計(jì)算機(jī)對(duì)漢字進(jìn)行存儲(chǔ)、運(yùn)算的實(shí)際代碼。一般用連續(xù)兩個(gè)字節(jié)表示漢字的內(nèi)碼且每個(gè)字節(jié)最高位為 1。
2.2 區(qū)位碼、國(guó)標(biāo)碼和機(jī)內(nèi)碼之間的轉(zhuǎn)換關(guān)系
(區(qū)位碼的十六進(jìn)制表示)+A0A0H=機(jī)內(nèi)碼。國(guó)標(biāo)碼+8080H =(區(qū)位碼的十六進(jìn)制表示)+A0A0H。國(guó)標(biāo)碼=(區(qū)位碼的十六進(jìn)制表示)+2020H。
3 完整漢字庫(kù)下的漢字顯示以及漢字英文混合顯示
3.1 完整漢字庫(kù)下的漢字顯示原理
漢字的輸出是將漢字的筆劃離散化,用點(diǎn)陣來表示。點(diǎn)陣的中每個(gè)點(diǎn)位只有兩種狀態(tài):有筆畫(1)、無筆畫(0)。描述漢字點(diǎn)陣信息的二進(jìn)制代碼集稱為漢字的字模。所有漢字和符號(hào)的點(diǎn)陣信息就組成了漢字庫(kù)。
點(diǎn)陣字庫(kù)文件已經(jīng)給使用者提供好了,關(guān)鍵在于如何取得漢字的圖形,即漢字的點(diǎn)陣字模。首先看一下如何取得漢字的區(qū)位碼。計(jì)算機(jī)在處理漢字和 ASCII 字符時(shí) ,使每個(gè) ASCII字符占用一個(gè)字節(jié),而一個(gè)漢字占用兩個(gè)字節(jié),其值稱為漢字的內(nèi)碼。其中第一個(gè)字節(jié)的值為區(qū)號(hào)加上 32(20H),第二個(gè)字節(jié)的值為位號(hào)加上 32(20H)。為了與 ASCII 字符區(qū)別開,表示漢字的兩個(gè)字節(jié)的最高位都是 1,也就是兩個(gè)字節(jié)的值都又加上了 128(80H)。這樣,通過漢字的內(nèi)碼,就可以計(jì)算出漢字的區(qū)位碼。具體算式如下:
qh=c1-32-128=c1-160, wh=c2-32-128=c2-160 或 qh=c1-0xa0, wh=c2-0xa0
其中 qh 、wh 為漢字的區(qū)號(hào)和位號(hào),c1、c2 為漢字的第一字節(jié)和第二字節(jié)。
根據(jù)區(qū)號(hào)和位號(hào)可以得到漢字字模在文件中的位置:
location=(94*(qh-1)+(wh-1))*一個(gè)點(diǎn)陣字模的字節(jié)數(shù)。
字模的表示順序?yàn)椋合葟淖蟮接遥購(gòu)纳系较?,依此類推,畫滿 16×16 個(gè)點(diǎn)。這樣,一個(gè) 16×16 點(diǎn)陣的漢字總共需要 16*16/8=32 個(gè)字節(jié)表示。因此,當(dāng)顯示16×16 點(diǎn)陣的漢字時(shí),只要根據(jù)區(qū)碼和位碼計(jì)算出該漢字點(diǎn)陣在ROM 中存放的起始地址,然后從此地址連續(xù)地取出 32 個(gè)字節(jié)的漢字點(diǎn)陣,并寫入 LCD 模塊對(duì)應(yīng)的地址中,就可以顯示出該漢字。
3.2 漢字英文混合顯示
在應(yīng)用中,常需要漢字和英文字符混合顯示,在軟件處理時(shí)需要判斷顯示的內(nèi)容是漢字的編碼還是英文字符的編碼,如果是漢字編碼則根據(jù)其機(jī)內(nèi)碼計(jì)算區(qū)位碼,并根據(jù)區(qū)位碼計(jì)算出該漢字在字模中的起始地址。顯示16×16 點(diǎn)陣漢字的混合顯示軟件流程圖如圖1所示:
圖1混合顯示軟件流程圖
按照以上的顯示原理可以編寫出在完整漢字庫(kù)下的漢字英文混合顯示程序,具體程序代碼在很多資料中都有,這里就不再贅述。
4 非完整漢字庫(kù)的建立及漢字英文混合顯示
4.1 非完整漢字庫(kù)的建立
在很多的人機(jī)界面中,雖然顯示的漢字?jǐn)?shù)量較多,但實(shí)際無重復(fù)的漢字?jǐn)?shù)卻較少,而且不同的應(yīng)用環(huán)境用到的漢字也有其自身的特殊性。如果是提供少量的互不重復(fù)的漢字,較好的做法如下:利用 DM Tool 字模轉(zhuǎn)化工具生成所需要的漢字模,然后利用 123.exe 軟件生成相應(yīng)的機(jī)內(nèi)碼。接下來就可將以上所得到的漢字的機(jī)內(nèi)碼和其字模合在一起組成數(shù)組,如此反復(fù)就可以將所需要的所有漢字都形成數(shù)組,最后將這些漢字組成二維數(shù)組。如下所示:
const UINT16T DDSHZTable[][17] = {
{ //時(shí)
0xCAB1, //機(jī)內(nèi)碼
0x0010, 0x0010, 0x7c10, 0x4410, 0x47fe, 0x4410, 0x7c10, 0x4510,
0x4490, 0x4490, 0x7c10, 0x0010, 0x0010, 0x0010, 0x0050, 0x0020//字模
},
……
}
在定義上面的二維數(shù)組時(shí)不規(guī)定數(shù)組的大小,這樣就可以方便地添加自己需要的漢字。要顯示特定漢字的時(shí)候,只需要從數(shù)組中查找內(nèi)碼與要求漢字內(nèi)碼相同的即可獲得字模。
4.2 軟硬件設(shè)計(jì)
下面結(jié)合AT91SAM7S256處理器介紹LCD 模塊的軟硬件設(shè)計(jì)過程。
4.2.1 硬件電路設(shè)計(jì)
LCD 模塊采用 PM04OX1,LED 背光。320*96 點(diǎn)陣,256 色顯示,亮度控制:6位。背光LED :6支(串聯(lián)),亮度控制 2位,背光電流 2.5mA~20mA。CN7,CN8: 連接LCD面板 PM042OX1; CN6: LCD背光電源;U6: Timing Controller,PVI-2003A; U8: VS_ASIC, MCU-LCD 接口轉(zhuǎn)換邏輯。以下介紹 MCU-VS_ASIC-Timing Controller 硬件接口。連接 LCD 面板的接口信號(hào)包括: LCDCLK, R[5:0],G[5:0],B[5:0], VSHS 和 VSVS。其中 VSHS, VSVS 來源于 MCU 的PIO; LCDCLK來源于 MCU-SPI的 NPCS3; R[5:0],G[5:0],B[5:0]是 U8 根據(jù) MCU-SPI 的VSCK(SPI-SCK)、VSDO(SPI-MOSI)、LCDCLK (SPI-NPCS3)和 VSVS 產(chǎn)生。
LED 驅(qū)動(dòng) (LED0~LED15) 是 U8 根據(jù) MCU-SPI 的 VSCK(SPI-SCK)、VSDO(SPI-MOSI)、LCDCLK(SPI-NPCS3) 和 VSVS 產(chǎn)生。 LCD掃描方向選擇:RP1、RP2 為 LCD 掃描方向選擇,它們只能焊接其中的 1 只。LCD驅(qū)動(dòng)原理框圖如圖2所示:
圖2 LCD驅(qū)動(dòng)原理框圖
4.2.2 軟件設(shè)計(jì)
通過 SPI-DMA 完成一個(gè)整行的掃描過程。在該過程中,DMA(直接存儲(chǔ)器存取) 向 SPI(串行外設(shè)接口) 傳輸 400 個(gè) 8 位數(shù)據(jù)。一個(gè)完整周期需要有 104 行掃描。其中第 0 行掃描的前 3 個(gè)數(shù)據(jù)為 PMRAM 數(shù)據(jù),其他數(shù)據(jù)無意義(可以是任何數(shù))。第 1 行和第 103 行掃描的全部數(shù)據(jù)均無意義;第 2~102行為數(shù)據(jù)掃描,每一行數(shù)據(jù)中前 64 個(gè)和后 16 個(gè)數(shù)據(jù)無意義,中間 320 個(gè)數(shù)據(jù)為顯示數(shù)據(jù)。
LCD驅(qū)動(dòng)過程是由 SPI-DMA 操作配合 SPI-DMA 中斷服務(wù)程序完成的。應(yīng)當(dāng)指出的是,在MCU相應(yīng)的設(shè)備按要求初始化后,由于沒有啟動(dòng)SPI-DMA,LCD驅(qū)動(dòng)過程不能自動(dòng)開始。因此顯示初始化程序應(yīng)當(dāng):
1) 設(shè)置SPI;