基于嵌入式系統(tǒng)的LCD漢字顯示
引言
本文引用地址:http://www.ex-cimer.com/article/169543.htm隨著嵌入式技術(shù)的迅猛發(fā)展,人機(jī)交互界面也越來越顯示出它的重要性。實(shí)際的LCD應(yīng)用中要顯示的漢字一般很有限,并不需要完整的漢字庫,再加上完整字庫在程序中要占用大量空間,因而非完整漢字庫的研究就有了其自身的現(xiàn)實(shí)必要性。本文以AT91SAM7S256處理器的LCD顯示模塊為例,介紹了非完整漢字庫的建立方法及其具體實(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 漢字信息的編碼知識
2.1 漢字的編碼標(biāo)準(zhǔn)
漢字系統(tǒng)對每個(gè)漢字預(yù)先規(guī)定輸入計(jì)算機(jī)中的代碼,即漢字的外部碼。計(jì)算機(jī)為了識別漢字,要把漢字的外部碼轉(zhuǎn)換成內(nèi)部碼進(jìn)行存儲(chǔ)和處理。輸出時(shí),還將漢字的內(nèi)部碼轉(zhuǎn)換成漢字的字形碼。主要的漢字編碼有以下幾種:
1) 國標(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è)漢字(圖形符號)用兩個(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ī)對漢字進(jìn)行存儲(chǔ)、運(yùn)算的實(shí)際代碼。一般用連續(xù)兩個(gè)字節(jié)表示漢字的內(nèi)碼且每個(gè)字節(jié)最高位為 1。
2.2 區(qū)位碼、國標(biāo)碼和機(jī)內(nèi)碼之間的轉(zhuǎn)換關(guān)系
(區(qū)位碼的十六進(jìn)制表示)+A0A0H=機(jī)內(nèi)碼。國標(biāo)碼+8080H =(區(qū)位碼的十六進(jìn)制表示)+A0A0H。國標(biāo)碼=(區(qū)位碼的十六進(jìn)制表示)+2020H。
3 完整漢字庫下的漢字顯示以及漢字英文混合顯示
3.1 完整漢字庫下的漢字顯示原理
漢字的輸出是將漢字的筆劃離散化,用點(diǎn)陣來表示。點(diǎn)陣的中每個(gè)點(diǎn)位只有兩種狀態(tài):有筆畫(1)、無筆畫(0)。描述漢字點(diǎn)陣信息的二進(jìn)制代碼集稱為漢字的字模。所有漢字和符號的點(diǎn)陣信息就組成了漢字庫。
點(diǎn)陣字庫文件已經(jīng)給使用者提供好了,關(guān)鍵在于如何取得漢字的圖形,即漢字的點(diǎn)陣字模。首先看一下如何取得漢字的區(qū)位碼。計(jì)算機(jī)在處理漢字和 ASCII 字符時(shí) ,使每個(gè) ASCII字符占用一個(gè)字節(jié),而一個(gè)漢字占用兩個(gè)字節(jié),其值稱為漢字的內(nèi)碼。其中第一個(gè)字節(jié)的值為區(qū)號加上 32(20H),第二個(gè)字節(jié)的值為位號加上 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ū)號和位號,c1、c2 為漢字的第一字節(jié)和第二字節(jié)。
根據(jù)區(qū)號和位號可以得到漢字字模在文件中的位置:
location=(94*(qh-1)+(wh-1))*一個(gè)點(diǎn)陣字模的字節(jié)數(shù)。
字模的表示順序?yàn)椋合葟淖蟮接遥購纳系较?,依此類推,畫滿 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 模塊對應(yīng)的地址中,就可以顯示出該漢字。
3.2 漢字英文混合顯示
在應(yīng)用中,常需要漢字和英文字符混合顯示,在軟件處理時(shí)需要判斷顯示的內(nèi)容是漢字的編碼還是英文字符的編碼,如果是漢字編碼則根據(jù)其機(jī)內(nèi)碼計(jì)算區(qū)位碼,并根據(jù)區(qū)位碼計(jì)算出該漢字在字模中的起始地址。顯示16×16 點(diǎn)陣漢字的混合顯示軟件流程圖如圖1所示:
圖1混合顯示軟件流程圖
按照以上的顯示原理可以編寫出在完整漢字庫下的漢字英文混合顯示程序,具體程序代碼在很多資料中都有,這里就不再贅述。
4 非完整漢字庫的建立及漢字英文混合顯示
4.1 非完整漢字庫的建立
在很多的人機(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 面板的接口信號包括: 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):
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
評論