隨著電子技術(shù)的飛速發(fā)展,越來越多的領(lǐng)域應(yīng)用到以單片機為控制核心、用液晶作為顯示終端的數(shù)字化設(shè)備。彩色液晶顯示器作為當代高新技術(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色?;驹砜驁D如圖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:顯示控制位。
當DISP設(shè)置為“1”時,液晶顯示模塊為開顯示狀態(tài)。
當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)存地址的計算方法為:
當Y=0時 SRAM=0EFH×100H+[INT(X/8)]×3
當Y>0時 SRAM=(Y-1)×100H+[INT(X/8)]×3
通過(X/8)的余數(shù)得出具體的內(nèi)存位置:
當余數(shù)為0 則 RAM=SRAM [1110,0000]
當余數(shù)為1 則 RAM=SRAM [0001,1100]
當余數(shù)為2 則 RAM1=SRAM [0000,0011]
RAM2 = SRAM + 1[1000 ,0000 ]
當余數(shù)為3 則 RAM = SRAM + 1[0111 ,0000 ]
當余數(shù)為4 則 RAM = SRAM + 1[0000 ,1110 ]
當余數(shù)為5 則 RAM1 = SRAM + 1[0000 ,0001 ]
RAM2 = SRAM + 2[1100 ,0000 ]
當余數(shù)為6 則 RAM = SRAM + 2[0011 ,1000 ]
當余數(shù)為7 則 RAM = SRAM + 2[0000 ,0111 ]
其中[ ]內(nèi)為“1”的位表示應(yīng)該填充顏色的位置,SRAM表示該點對應(yīng)的基礎(chǔ)地址,RAM、RAM1和RAM2表示該點對應(yīng)的實際內(nèi)存地址。
當數(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)定,顯示色彩豐富,人機界面友好的較理想的顯示效果。