1 引 言
常用的液晶顯示模塊分為數顯液晶模塊、點陣字符液晶模塊和點陣圖形液晶模塊。圖形液晶模塊在我國應用較為普及, 因為中文不能像西文字符那樣用字符模塊即可顯示, 要想顯示中文必須用圖形模塊。
??????? 研究了圖形液晶模塊的漢字顯示方法, 以8051 單片機為基礎, 介紹了液晶模塊與單片機的典型接口電路, 描述了通過外擴的EEPROM 存儲漢字字模數據, 將其作為外部數據存儲器進行尋址, 通過C51 程序詳細介紹了使用方法。對于程序存儲器和數據存儲器分開尋址的單片機, 該方式能起到節省程序存儲器, 擴大程序容量的作用。
2 液晶模塊顯示漢字方法
使用圖形液晶模塊可以顯示漢字和圖形。以DG12864( 128×64) 液晶模塊為例, 其內置的液晶顯示驅動控制器為日本東芝公司的T6963C, 在液晶屏上橫向8 個點為1 個字節數據, 每個字節在顯示緩沖區內有對應的地址, 液晶屏幕的左上角橫向8 個點對應液晶模塊顯示緩沖區的首地址。采用圖形顯示方式, 在液晶顯示器上漢字用點陣來顯示, 最常用的是16×16 的漢字, 一個16×16 的漢字用32 個字節表示, 這32 個字節存放方式如下所示:
?
而一個24 ×24 的漢字則需72 個字節, 存放方式如下:
?
其他規格的漢字存放方式依此類推。在液晶顯示器上需顯示漢字時, 只要將要顯示的漢字的點陣按其存放方式依次寫入液晶控制器的顯示緩沖區即可。
通過單片機將已提取的漢字的字模輸入液晶控制器, 即可按設定在液晶模塊顯示屏上顯示漢字。常見的做法是事先通過字模提取軟件提取要顯示的漢字的字模, 將其作為常量數組存放在單片機的程序存儲區內。以C 語言格式建立包含"合"和"肥"兩字的漢字字模常量數組, 如下:
Code const char Hz-Dot [ ] = {0x01, 0x01, 0x02, 0x04, 0x08, 0x 10, 0x 2F,0xC0, / / 合0
0x00, 0x1F, 0x 10, 0x10, 0x10, 0x 10, 0x1F, 0x10,0x00, 0x00, 0x 80, 0x40, 0x 20, 0x10, 0xEE, 0x 04,0x10, 0xF8, 0x 10, 0x10, 0x10, 0x 10, 0xF0, 0x10,0x04, 0x 7F, 0x 45, 0x45, 0x45, 0x7D, 0x 45,0x45, / / 肥0x 20
0x45, 0x7D, 0x 45, 0x45, 0x 45, 0x45, 0x 54, 0x 88,0x04, 0xFE, 0x 24, 0x24, 0x 24, 0x24, 0x 24, 0xFC,0x04, 0x 00, 0x 00, 0x02, 0x02, 0x02, 0xFE,0x00} ;
每個漢字字模由32 個字節組成, 單片機通過接口電路, 根據規定的時序, 將要顯示的漢字字模的所有字節按液晶控制器規定的方式, 按預定位置寫入液晶控制器顯示緩沖區即可。這種方式適用于程序不大或單片機無外部擴展數據存儲區功能的情況。
采用哈佛結構的單片機, 如8051 單片機及其派生產品, 程序存儲器( ROM) 和數據存儲器( RAM) 可分別尋址, 8051 單片機ROM 和RAM最大的尋址空間均為64 K.通常來說, 對于中型的嵌入式系統, 尤其是帶液晶模塊的單片機系統,64 K 的程序空間并不富裕, 而將漢字字模作為常量數組會大大占用ROM 的空間。而相對來說,數據存儲器只需幾K 就夠用了, 剩下很多空間可用于功能芯片的擴展。將提取的漢字字模數據存放在EPROM 或EEPROM 內作為擴展的數據存儲器供CPU 調用, 則只要設定該芯片的片選地址, 并知道每個漢字字模數據在該芯片的存儲位置, 通過程序計算出偏移地址, 即可實現同樣的顯示功能。
3 單片機通過EEPROM 調用漢字字模的方法
圖1 是DG12864 液晶模塊與8051 單片機的接口電路。在電路中, 地址線A13??A15 通過GAL16V8 譯碼得到外擴芯片的片選信號, 其中液晶模塊的譯碼地址為0xE000, 將地址線A0 與液晶模塊控制口的C/ D 相連。當A0 為低時液晶控制器接收數據, A0 為高時液晶控制器接收命令碼。因此液晶模塊數據端口地址為0xE000, 液晶模塊命令端口為0xE001.采用Keil C51 進行程序設計, 在程序中可進行如下定義:
# define XBYTE ( ( unsigned char volat ile x data* ) 0)
# def ine LCD-Data XBYT E[ 0xE000]/ / 液晶模塊數據端口
# def ine Lcd-Code XBYT E[ 0xE001]/ / 液晶模塊命令端口
存放漢字字模數據的EEPROM 芯片2864的片選地址為0x 9000, 則通過程序定義:
# def ine Hz-Dot 0x 9000
# define VBYTE ( unsigned char volatile x data* )
?
圖1 51 單片機與液晶模塊接口電路
編制16 ×16 漢字顯示子函數Wr ite-Hz.其中要調用另外兩個子函數Lcd-Wait 和Disp-address.Lcd-Wait 為讀取液晶控制器是否忙函數, 而Disp-address 為液晶控制器顯示緩沖區地址設置函數, 可根據液晶控制器資料編制。根據液晶控制器T 6963 的操作方法, 每次對液晶控制器進行讀寫時, 應執行Lcd-Wait 函數判斷液晶控制器是否忙, 在將漢字字模數據寫入液晶控制器顯示緩沖區前, 應根據漢字在液晶屏上的顯示位置設定寫入數據的液晶控制器顯示緩沖區地址, 具體Write-Hz 如下:
void Write-Hz( Uchar x ,U char y, Uint p) // 寫漢字
// x , y 為漢字在液晶屏的顯示位置坐標,
// p 為要顯示的漢字在數組中的下標。
{
Uchar i, low-ad, hig h??ad;
Uint addr ess, tp;
address= ( Uint) x * Wide+ y ; / / * *
// 根據要顯示漢字在液晶屏幕的橫坐標和縱坐標
// 設定液晶控制器的顯示緩沖區的偏移地址
tp= address;
for ( i= 0; i< 16; i+ + ) / / 寫左半部
{
low-ad= ( Uchar) ( tp & 0x f f) ;
hig h-ad= ( Uchar) ( tp 8) ;
Disp-address( low-ad, high-ad) ;
/ / 設定寫入地址
Lcd-Wait ( ) ;
Lcd-Data = * ( VBYT E( Hz-Dot+ p+ i ) ) ;
/ / 從EEPROM 中提取漢字字模
Lcd-Wait ( ) ;
Lcd-Code= 0xC4; / / 寫數據命令
tp= tp+ Wide;
}
address+ + ;
tp= address;
fo r( i= 0; i< 16; i+ + ) / / 寫右半部
{
low-ad= ( U char) ( tp & 0xf f ) ;
hig h-ad= ( Uchar) ( tp 8) ;
Disp-address( low??ad, high??ad) ;
Lcd-Wait ( ) ;
Lcd-Data = * ( VBYTE ( Hz-Dot+ p+16+ i) ) ;
Lcd-Wait ( ) ;
Lcd-Code= 0xC4;
tp= tp+ Wide;
}
}
函數Wr ite??Hz 的參數x 和y 對應液晶屏幕的顯示位置, 以屏幕左上角為原點, x 為縱坐標, y為橫坐標, 其在液晶控制器顯示緩沖區中的地址通過行* * 計算出, 該行中Wide 為事先定義的液晶屏每行字節數, 對于DG12864 液晶模塊而言,Wide 為16。
函數Write-Hz 根據16×16 點陣漢字在液晶控制器顯示緩沖區的存放形式, 依次改變顯示地址, 先將左半部1~ 16 個字節寫入顯示緩沖區, 再寫入右半部17~ 32 個字節。設"合肥"兩字存放在2864 中最前列, 則"合"字模首字節在2864 中的偏移地址為0, 共32 個字節, 緊跟在后面的肥!字模的首地址為0x20, 若要液晶模塊顯示合肥!兩字, 只要在程序中帶顯示地址參數調用該函數即可。如:
Write-Hz( 0, 4, 0) ; / / 合
Write-Hz( 0, 10, 0x20) ; / / 肥
4 結 語
本文介紹了圖形液晶的漢字顯示方法, 并以8051 單片機為基礎, 結合液晶模塊與單片機的典型接口電路, 敘述了使用EEPROM 或EPROM存放漢字字模的方法, 并給出C51 程序例子, 具有很強的使用指導性。
評論
查看更多