基于單片機的VRAM型彩色液晶顯示模塊設計(二)
4. 2. 2 畫點函數的具體實現
從例1 和例2 可以看出,要只顯示一個色點,就必須知道該點對應的內存中的數據,而前面提到過內存中的數據是不能讀出的,所以要將寫入內存中的數據先保存起來,即在向YD2502 的顯示緩沖區里寫數據之前, 應先將此數據寫入61LV5128 。若在坐標( X , Y) 處畫顏色為color 的點,其具體函數如下:
void LCD_ disppixel ( unsigned int X , unsigned int Y ,unsigned char color) {
unsigned int address ;
unsigned char data ;
address = LCD_pixeladdr ( X , Y) ;
/ / 計算該點對應的內存地址
switch ( X %8) {
case 0 : data = read _ exram ( ad2
dress) ; / / 讀取相應SRAM 中的數據
data = 0x1F; / / [1110 ,
0000]保存其他點的數據
data | = (color 5) ;
/ / 填充相應的顏色
write _ exram ( data , ad2
dress) ; / / 把修改好的數據寫回到SRAM
LCD_filldata (address ,da2
ta) ; / / 把數據寫到液晶顯示緩沖區
break ;
……
case 7 : …; break ;}}
以上只給出了余數是0 的情況,其他的情況可依此類推。計算內存地址的LCD_pixeladdr 函數可根據給出的內存地址計算方法編寫,讀寫61LV5128 的read_exram 函數和write_exram 函數可根據具體的硬件設計編寫,這里不再給出。
4. 3 顯示漢字和其他功能的實現
在屏幕上顯示16 ×16 點陣漢字的基本步驟是:首先取得該漢字的32 個字節的點陣數據,再確定屏幕上顯示的位置,利用畫點函數即可顯示該漢字。因本模塊使用了硬件漢字庫技術,所以漢字的點陣數據是從漢字庫中獲取的。
在計算機漢字系統中,漢字是用機內碼的形式存儲的,將漢字機內碼減去0A0A0H 就得到該漢字的區位碼,通過區位碼就可以找到該漢字點陣數據在漢字庫中的位置。例如:漢字“中”的機內碼是十六進制的“D6D0”,其中前兩位“D6”表示機內碼的區碼,后兩位“D0”表示機內碼的位碼。所以“中”的區位碼為0D6D0H - 0A0A0H =3630H ,將區碼和位碼分別轉換為十進制,得漢字“中”的區位碼為“5448”。即“中”的點陣位于第54區的第48 個字的位置,在文件HZK16 中的位置為第32 ×[(54 - 1)×94 + (48 - 1)] = 160928D以后的32 個字節為“中”的點陣數據,用SUPER2PRO25 編程器讀入文件HZK16 后利用其編輯功能中的緩沖區編輯查找到274A0H (160928D 的十六進制表示) 開始的32 個字節: 01H , 00H ,01H , 00H , 01H , 04H , 7FH , FEH , 41H , 04H ,41H , 04H , 41H , 04H , 41H , 04H , 7FH , FCH ,41H , 04H , 01H , 00H , 01H , 00H , 01H , 00H ,01H ,00H ,01H ,00H ,01H ,00H。這些數據與其點陣圖形的對應關系如圖4 所示,圖中黑色方格表示二進制位“1”,即對應該顯示的點,白色方格表示二進制位“0”,即不該顯示的點。因此要在液晶屏幕上顯示16 ×16 點陣的漢字,首先應找到該漢字在硬件漢字庫中的位置,取出其后的32 個字節數據。取這32 個字節數據的函數如下:

圖4 漢字“中”的點陣圖形
unsigned char chinese[ ] [ 2 ] = {“中”“, 國”} ;
unsigned char buffer [32 ] ;
void LCD_ readdata ( unsigned char num2
ber) {
unsigned char temp1 ,temp2 , k ;
unsigned long address , i ;
temp1 = chinese [ number ] [ 0 ] - 0xA0 ;/ / 把機內碼轉換成區位碼
temp2 = chinese [ number ] [ 1 ] - 0xA0 ;
address = 32 3 ( ( (long) temp1 - 1) 3 94 +( (long) temp2 - 1) ) ; / / 計算該漢字在漢字庫中的首地址
k = 0 ;
for ( i = address ; i address + 32 ; i + + ) {
data = read_exrom( i) ;
buffer [ k ] = data ;
k + + ; }}
讀A T29C040A 的read_exrom 函數可根據硬件設計編寫,這里不再給出。
取得這32 個字節數據后,下面的程序設計就比較容易了,這里只給出程序流程(如圖5 所示) ,具體函數可根據此流程編寫。其中( X , Y) 是該漢字顯示的起始點, color 是該漢字的顯示顏色,number 是該漢字在chinese 數組中的位置。顯示英文和數字的函數可根據顯示漢字的函數稍加改造后即可得到,這里不再詳細分析。

圖5 顯示一個漢字程序流程圖
在本模塊中也實現了在屏幕上畫斜線、圓等功能,其具體實現過程就是在畫點函數的基礎上通過相應的算法來編寫這些函數。畫線和畫圓算法比較多,在這里畫線算法采用的是整數數字微分分析法,畫圓算法采用的是貝森海姆算法。
鑒于篇幅所限,這里不再具體分析。由于YD2502是點陣式液晶顯示器, 還可以通過移植嵌入式GUI(如μC/ GUI) 軟件,使其顯示多種曲線,各種窗口對象,如按鈕、編輯框、滑動條等更加豐富靈活的圖形界面。
5 結語
以上程序均在ICCAVR 編譯器里調試通過,實現了在液晶屏幕上正常顯示各種顏色的漢字、英文、數字及簡單的圖形功能。在筆者參與開發的油田探測爆炸機設備中,采用了本液晶模塊,達到了顯示穩定,顯示色彩豐富,人機界面友好的較理想的顯示效果。
評論