隨著電子技術(shù)的飛速發(fā)展,,越來越多的領(lǐng)域應(yīng)用到以單片機為控制核心、用液晶作為顯示終端的數(shù)字化設(shè)備,。彩色液晶顯示器作為當(dāng)代高新技術(shù)的結(jié)晶產(chǎn)品,,不但具有超薄平面、顯示信息豐富,、色彩逼真的特點,,而且還具有體積小、耗電省,、壽命長,、無輻射、抗震,、防爆等其他類型顯示器無可比擬的優(yōu)點,,因而是工控儀表、機電設(shè)備等行業(yè)更新?lián)Q代的理想顯示器件,。因此基于單片機系統(tǒng)的彩色液晶顯示模塊的使用也越來越廣泛,。本文介紹一種基于AVR單片機和硬件漢字庫的彩色液晶顯示模塊,該模塊實現(xiàn)了在彩色液晶顯示器上顯示不同顏色的中文,、英文,、數(shù)字及簡單的畫圖功能。
2 液晶顯示器顯示原理
本模塊采用的液晶顯示器是河南友利華高科技有限公司生產(chǎn)的YD2502彩色液晶VRAM型顯示器,。它的點陣數(shù)是320×240,,VRAM容量是64k×8 位,由于屏幕上的任何一點都是由R(紅) ,、G(綠) ,、B(藍)3種顏色組成,且灰度不可調(diào)節(jié),,因此顯示顏色為8色,。基本原理框圖如圖1所示,。DC/DC轉(zhuǎn)換器產(chǎn)生液晶所用各種驅(qū)動電壓,,DC/AC逆變器則用來點亮冷陰極背光燈,顯示驅(qū)動邏輯電路采用了優(yōu)化邏輯電路,,利用分時技術(shù)讓顯示與寫入數(shù)據(jù)同時進行,,實現(xiàn)了畫面的高速更新,且互不干擾,。其顯示原理是:在顯示器內(nèi)部含有一個顯示緩沖區(qū)與屏幕顯示一一對應(yīng),,使用時只需向緩沖區(qū)里寫入相應(yīng)的數(shù)據(jù),屏幕上即可顯示出對應(yīng)的彩色圖形或文字,,也就是說該顯示器可作為單片機系統(tǒng)的一個外部存儲器就可以實現(xiàn)彩色信息的顯示,。
圖1 YD2502原理框圖
3 硬件系統(tǒng)設(shè)計
3.1 硬件總體設(shè)計
本模塊中使用的單片機是AVR系列單片機中功能最強的ATmega128 。該單片機具有豐富的片上資源如具有128kB在線可重復(fù)編程Flash,、4kB的E2 PROM,、4kB的內(nèi)部SRAM、48個I/O端口,、34個不同的中斷源,、可尋址64kB的地址空間、ISP下載以及JTAG仿真等功能,。詳細介紹請參考其數(shù)據(jù)手冊,。
圖2是該模塊硬件系統(tǒng)總體設(shè)計框圖。由于YD2502的顯示緩沖區(qū)里的內(nèi)容是不能讀出的,,為了保存寫入內(nèi)容,,在該模塊中還外擴了一片存儲器芯片61LV5128,其存儲容量為512kB,,除了保存YD2502顯示緩沖區(qū)里的數(shù)據(jù)外,,還為使用本模塊的嵌入式系統(tǒng)提供了擴展應(yīng)用,。由于ATmega128的尋址范圍只達到64KB,因此采用了分頁管理技術(shù)來操作512kB的存儲空間,。在具體電路設(shè)計時,,將ATmega128的PB3~PB0連接到61LV5128的高4位地址線上,將512kB的存儲空間分成16頁,,每頁32kB,。硬件漢字庫芯片AT29C040A的存儲容量也是512kB,與CPU的接口設(shè)計與61LV5128是類似的,,只需將片選信號和高4位地址線接在不同的I/O口上就可以了,。
圖2 硬件設(shè)計圖
3.2 YD2502的接口設(shè)計
YD2502的接口方式采用總線方式,外部引線包括數(shù)據(jù)總線(DB7~DB0) ,、片選信號(/CS) ,、讀寫輸入(/RD、/WR)和寄存器選擇信號(RS),,可以直接掛接到單片機的總線上,,作為單片機的某部分內(nèi)存來使用。接口采用16針插座,,引腳定義請參閱其說明書,。
根據(jù)YD2502可以作為單片機的外部存儲器使用的接口特性,將ATmega128的讀寫信號線與YD2502的讀寫信號線直接連接,,具體接口設(shè)計原理如圖3所示,。
圖3 AT128與YD2502的接口
3.3 硬件漢字庫的制作
本模塊使用了硬件漢字庫,省去了利用漢字取模軟件獲取點陣數(shù)據(jù)的麻煩,,而且還避免了為保存這些數(shù)據(jù)而開辟的大量程序存儲空間,。
漢字庫中要燒寫的點陣文件是UCDOS軟件中的文件HZK16,該文件是16×16的國際漢字點陣文件,,文件中按漢字區(qū)位碼從小到大依次存放國標區(qū)位碼表中的所有漢字,,每個漢字占用32字節(jié),每個區(qū)為94個漢字,。漢字庫芯片采用的是AT29C040A,,該芯片是ATMEL公司生產(chǎn)的512kB的Flash ROM。在制作時,,燒寫過程和普通的程序存儲器的編程基本相同,,只要注意選擇正確的型號和在選擇打開HZK16的方式時用二進制方式就可以了,編程校驗成功后,,取下備用,,硬件漢字庫芯片就制作好了。
實際上若顯示HZK16的文件屬性,,其大小為262kB,,而AT29C040A的存儲容量為512kB,,超出部分可以存儲用戶固定的漢字、字母和數(shù)字的代碼,,從而使顯示內(nèi)容更加靈活豐富,。
4 軟件系統(tǒng)設(shè)計及實現(xiàn)
4.1 操作YD2502的程序設(shè)計
YD2502的指令碼格式如下:
其中:CA1,CA0組合功能為內(nèi)部寄存器通道的選擇,,功能如下:
DISP:顯示控制位。
當(dāng)DISP設(shè)置為“1”時,,液晶顯示模塊為開顯示狀態(tài),。
當(dāng)DISP設(shè)置為“0”時,液晶顯示模塊為關(guān)顯示狀態(tài),。
X:表示未用位,,可設(shè)為“0”。
ATmega128訪問外部存儲器的軟件設(shè)計步驟是:先用extern聲明一個外部變量,,再用map2ping_init函數(shù)(外部存儲地址分配函數(shù))分配給此變量一個外部存儲地址(因ATmega128內(nèi)部有4kB的SRAM所以外部存儲地址范圍為1000H~0FFFFH),,那么對該變量的操作就實現(xiàn)了CPU對相應(yīng)地址的外部存儲空間的訪問。
根據(jù)此步驟,,對YD2502寫指令和寫數(shù)據(jù)的具體函數(shù)如下:
寫指令函數(shù)如下:
寫數(shù)據(jù)函數(shù)如下:
除了上面兩個基本的函數(shù)外,,對YD2502最基本的操作是往VRAM 里寫數(shù)據(jù),根據(jù)上面給出的指令碼,,具體函數(shù)如下:
4.2 畫點函數(shù)的實現(xiàn)
要在液晶上實現(xiàn)顯示字符和畫圖等功能,,在屏幕上顯示一個點是實現(xiàn)這些功能的基礎(chǔ)。畫點函數(shù)實現(xiàn)的步驟是:首先確定該點對應(yīng)的VRAM中的內(nèi)存位置,,找到該點具體對應(yīng)的數(shù)據(jù)位,,填充顯示顏色的數(shù)據(jù),該點就按對應(yīng)的顏色顯示出來了,。
4.2.1 顯示內(nèi)存與屏幕點陣的對應(yīng)關(guān)系
YD2502屏幕點陣為320×240,,每一個點對應(yīng)3個像素(RGB),屏幕上8個點對應(yīng)內(nèi)存3個字節(jié),,一行對應(yīng)320/8×3=120個字節(jié),,其對應(yīng)關(guān)系如下:
其中R,G,,B表示紅,、綠、藍三原色,,D7~D0表示對應(yīng)的數(shù)據(jù)位,。
對于屏幕上坐標為(X,Y)的點,,其對應(yīng)內(nèi)存地址的計算方法為:
當(dāng)Y=0時 SRAM=0EFH×100H+[INT(X/8)]×3
當(dāng)Y>0時 SRAM=(Y-1)×100H+[INT(X/8)]×3
通過(X/8)的余數(shù)得出具體的內(nèi)存位置:
當(dāng)余數(shù)為0 則 RAM=SRAM [1110,,0000]
當(dāng)余數(shù)為1 則 RAM=SRAM [0001,,1100]
當(dāng)余數(shù)為2 則 RAM1=SRAM [0000,0011]
RAM2 = SRAM + 1[1000 ,,0000 ]
當(dāng)余數(shù)為3 則 RAM = SRAM + 1[0111 ,,0000 ]
當(dāng)余數(shù)為4 則 RAM = SRAM + 1[0000 ,1110 ]
當(dāng)余數(shù)為5 則 RAM1 = SRAM + 1[0000 ,,0001 ]
RAM2 = SRAM + 2[1100 ,,0000 ]
當(dāng)余數(shù)為6 則 RAM = SRAM + 2[0011 ,1000 ]
當(dāng)余數(shù)為7 則 RAM = SRAM + 2[0000 ,,0111 ]
其中[ ]內(nèi)為“1”的位表示應(yīng)該填充顏色的位置,,SRAM表示該點對應(yīng)的基礎(chǔ)地址,RAM,、RAM1和RAM2表示該點對應(yīng)的實際內(nèi)存地址,。
當(dāng)數(shù)據(jù)位為“1”時,對應(yīng)色點為亮,;為“0”時,,對應(yīng)色點為暗。通過RGB三原色組合而得到的8種顏色代碼如下:
例1:若X ,、Y坐標為(7,,0)
SRAM = 0EFH ×100H + 0 = 0EF00H
余數(shù)為7 ,則 RAM = 0EF00H + 2 = 0EF02H
若此點為紅色,,則送入0EF02H 內(nèi)存單元里的數(shù)據(jù)為[ 0EF02H] &11111000B + 00000100B
例2 :若X ,、Y坐標為(15,5)
SRAM = (5 - 1) ×100H + 1 ×3 = 403H
余數(shù)為5 ,,則 RAM1 = 403H + 1 = 404H
RAM2 = 403H + 2 = 405H
若此點為白色,,則送入這兩個單元的數(shù)據(jù)為
[ 404H] &11111110B + 00000001B
[ 405H] &00111111B + 11000000B
4.2.2 畫點函數(shù)的具體實現(xiàn)
從例1和例2可以看出,要只顯示一個色點,,就必須知道該點對應(yīng)的內(nèi)存中的數(shù)據(jù),,而前面提到過內(nèi)存中的數(shù)據(jù)是不能讀出的,所以要將寫入內(nèi)存中的數(shù)據(jù)先保存起來,,即在向YD2502的顯示緩沖區(qū)里寫數(shù)據(jù)之前,,應(yīng)先將此數(shù)據(jù)寫入61LV5128 。若在坐標(X,,Y)處畫顏色為color的點,,其具體函數(shù)如下:
以上只給出了余數(shù)是0的情況,其他的情況可依此類推,。計算內(nèi)存地址的LCD_pixeladdr函數(shù)可根據(jù)給出的內(nèi)存地址計算方法編寫,,讀寫61LV5128的read_exram函數(shù)和write_exram函數(shù)可根據(jù)具體的硬件設(shè)計編寫,這里不再給出,。
4.3 顯示漢字和其他功能的實現(xiàn)
在屏幕上顯示16×16點陣漢字的基本步驟是:首先取得該漢字的32個字節(jié)的點陣數(shù)據(jù),,再確定屏幕上顯示的位置,,利用畫點函數(shù)即可顯示該漢字。因本模塊使用了硬件漢字庫技術(shù),,所以漢字的點陣數(shù)據(jù)是從漢字庫中獲取的,。
在計算機漢字系統(tǒng)中,漢字是用機內(nèi)碼的形式存儲的,,將漢字機內(nèi)碼減去0A0A0H就得到該漢字的區(qū)位碼,,通過區(qū)位碼就可以找到該漢字點陣數(shù)據(jù)在漢字庫中的位置。例如:漢字“中”的機內(nèi)碼是十六進制的“D6D0”,,其中前兩位“D6”表示機內(nèi)碼的區(qū)碼,,后兩位“D0”表示機內(nèi)碼的位碼。所以“中”的區(qū)位碼為0D6D0H - 0A0A0H =3630H,,將區(qū)碼和位碼分別轉(zhuǎn)換為十進制,得漢字“中”的區(qū)位碼為“5448”,。即“中”的點陣位于第54區(qū)的第48個字的位置,,在文件HZK16中的位置為第32×[(54 - 1)×94 + (48 - 1)] = 160928D以后的32個字節(jié)為“中”的點陣數(shù)據(jù),用SUPER2PRO25編程器讀入文件HZK16后利用其編輯功能中的緩沖區(qū)編輯查找到274A0H(160928D的十六進制表示)開始的32個字節(jié):01H,,00H,,01H,00H,,01H,,04H,7FH,,F(xiàn)EH,,41H,04H,,41H,,04H,41H,,04H,,41H,04H,,7FH,,F(xiàn)CH,41H,,04H,,01H,00H,,01H,,00H,,01H,00H,,01H,,00H,01H,,00H,,01H,00H,。這些數(shù)據(jù)與其點陣圖形的對應(yīng)關(guān)系如圖4所示,,圖中黑色方格表示二進制位“1”,即對應(yīng)該顯示的點,,白色方格表示二進制位“0”,,即不該顯示的點。因此要在液晶屏幕上顯示16×16點陣的漢字,,首先應(yīng)找到該漢字在硬件漢字庫中的位置,,取出其后的32個字節(jié)數(shù)據(jù)。取這32個字節(jié)數(shù)據(jù)的函數(shù)如下:
圖4 漢字“中”的點陣圖形
讀AT29C040A的read_exrom函數(shù)可根據(jù)硬件設(shè)計編寫,,這里不再給出,。
取得這32個字節(jié)數(shù)據(jù)后,下面的程序設(shè)計就比較容易了,,這里只給出程序流程(如圖5所示),,具體函數(shù)可根據(jù)此流程編寫。其中(X,,Y)是該漢字顯示的起始點,,color是該漢字的顯示顏色,number是該漢字在chinese數(shù)組中的位置,。顯示英文和數(shù)字的函數(shù)可根據(jù)顯示漢字的函數(shù)稍加改造后即可得到,,這里不再詳細分析。
圖5 顯示一個漢字程序流程圖
在本模塊中也實現(xiàn)了在屏幕上畫斜線,、圓等功能,,其具體實現(xiàn)過程就是在畫點函數(shù)的基礎(chǔ)上通過相應(yīng)的算法來編寫這些函數(shù)。畫線和畫圓算法比較多,,在這里畫線算法采用的是整數(shù)數(shù)字微分分析法,,畫圓算法采用的是貝森海姆算法。
鑒于篇幅所限,,這里不再具體分析,。由于YD2502是點陣式液晶顯示器,還可以通過移植嵌入式GUI(如μC/GUI)軟件,使其顯示多種曲線,,各種窗口對象,,如按鈕、編輯框,、滑動條等更加豐富靈活的圖形界面,。
5 結(jié)語
以上程序均在ICCAVR編譯器里調(diào)試通過,實現(xiàn)了在液晶屏幕上正常顯示各種顏色的漢字,、英文,、數(shù)字及簡單的圖形功能。在筆者參與開發(fā)的油田探測爆炸機設(shè)備中,,采用了本液晶模塊,,達到了顯示穩(wěn)定,顯示色彩豐富,,人機界面友好的較理想的顯示效果,。