液晶模塊顯示漢字方法
1
使用圖形液晶模塊以點陣形式來顯示漢字和圖形。每8個點組成1個字節,每個點用一個2進制位表示,存1的點顯示時在屏上顯示1個亮點;存0的點則在屏上不顯示,蕞常用的16×16的漢字點陣由32個字節組成。以在我國應用較為普及的液晶顯示驅動控制器T6963C為例,在液晶屏上橫向8個點為1個字節數據,則“國”字的16×16點陣字模如圖1所示,通過字模提取軟件按照先左后右,先上后下的方式對“國”字進行字模提取,則可獲得圖1右邊的字模對應的32個字節值。將這些字節按一定順序寫入液晶控制器的顯示緩沖區,就可在液晶屏上顯示16×16的“國”字。同理一個24×24的漢字則需72個字節,存放方式如表1所示。其他規格的漢字存放方式以此類推。
液晶控制器典型接口電路
2
通過單片機將已提取的漢字的字模輸入液晶控制器,即可按設定在液晶模塊顯示屏上顯示需要的漢字。圖2是典型的液晶模塊與單片機的接口電路。在圖中選用在我國應用非常廣泛的8051單片機作為MCU,采用12864(128×64)液晶模塊,其內置的液晶顯示驅動控制器為日本東芝公司的T6963C。在電路中,地址線A12-A15和WR、RD信號通過GAL16V8譯碼出外擴芯片的片選信號,其中液晶的譯碼地址為0xE000,將地址線A0與液晶控制口的C/D相連。當A0為低時液晶控制器接收數據,A0為高時液晶控制器接收命令碼。因此液晶數據端口地址為0xE000,液晶命令端口為0xE001。采用KeilC51進行程序設計,在程序中可進行如下定義:
#define XBYTE ((unsigned charvolatile xdata *) 0)
#define Lcd_Data XBYTE[0×E000] //液晶數據端口
#define Lcd_Code XBYTE[0×E001] //液晶命令端口
單片機的數據線通過74HC245雙向緩沖器與液晶控制器的數據口相連,用液晶控制器的片選信號/LCD_CS作為74HC245的使能信號,單片機的寫信號/WR控制數據傳送方向。/WR為低時,單片機數據寫入液晶控制器;/WR為高時,CPU讀取液晶控制器的數據和狀態。
漢字字模存儲及提取方法
3
在單片機系統中對字模的存儲,根據單片機的程序存儲容量和其尋址空間情況,可采取以下3種方式。
①將提取的漢字字模數據作為常量數組存放在程序存儲區內。這種方法較為常用,針對程序不大或單片機無外部擴展數據存儲區功能的情況。
如下面程序所示,將提取的要顯示漢字的字模數據定義成常量數組。如要顯示“合肥”兩字。
const char Hz_Dot[]={ // 漢字16×16點陣
0×01,0×01,0×02,0×04,0×08,0×10,0×2F,0×C0,//合 0
0×00,0×1F,0×10,0×10,0×10,0×10,0×1F,0×10,
0×00,0×00,0×80,0×40,0×20,0×10,0×EE,0×04,
0×10,0×F8,0×10,0×10,0×10,0×10,0×F0,0×10,
0×04,0×7F,0×45,0×45,0×45,0×7D,0×45,0×45,//肥 0×20
0×45,0×7D,0×45,0×45,0×45,0×45,0×54,0×88,
0×04,0×FE,0×24,0×24,0×24,0×24,0×24,0×FC,
0×04,0×00,0×00,0×02,0×02,0×02,0×FE,0×00};
再編制漢字顯示子函數Write_Hz,其中要調用另外2個子函數Lcd_Wait和Disp_address。Lcd_Wait為讀取液晶控制器是否忙函數,而Disp_address為液晶控制器顯示緩沖區地址設置函數,可根據液晶控制器資料編制。
void Write_Hz(Uchar x,Uchary,Uint p) //寫漢字
//x,y為漢字在液晶屏的顯示位置坐標,p為要顯示的漢字在//數組中的下標。
{
Uchar i,low_ad,high_ad;
Uint address,tp;
address=(Uint)x*Wide+y; //**
tp=address;
for(i=0;i<16;i++) //寫左半部
{
low_ad=(Uchar)(tp &&0xff);
high_ad=(Uchar)(tp >>8);
Disp_address(low_ad,high_ad);
Lcd_Wait( );
Lcd_Data=Hz_Dot[p+i]; //***
Lcd_Wait( );
Lcd_Code=0×C4;
tp=tp+Wide;
}
address++;
tp=address;
for(i=0;i<16;i++) //寫右半部
{
low_ad=(Uchar)(tp &&0×ff);
high_ad=(Uchar)(tp >>8);
Disp_address(low_ad,high_ad);
Lcd_Wait( );
Lcd_Data=Hz_Dot[p+16+i]; //****
Lcd_Wait( );
Lcd_Code=0xC4; //寫數據命令
tp=tp+Wide;
}
}
函數Write_Hz的參數x和y對應液晶屏幕的顯示位置,其與液晶控制器顯示緩沖區中的地址通過行**可計算出,該行中Wide為事先定義的液晶屏每行字節數,對于DG12864液晶而言,Wide為16。函數函數Write_Hz根據16×16點陣漢字在液晶控制器顯示緩沖區的存放形式,依次改變顯示地址,先將左半部1~16個字節寫入顯示緩沖區,再寫入右半部17~32個字節。若要液晶顯示“合肥”兩字,只要在程序中帶顯示地址參數調用該函數即可。如:
Write_Hz(0,4,0); //合
Write_Hz(0,10,0x20); //肥
②將提取的漢字字模數據存放在EPROM或EEPROM內,作為擴展的數據存儲器供單片機調用。采用哈佛結構的單片機,如8051單片機及其派生產品,程序存儲器(ROM)和數據存儲器(RAM)可分別尋址,51單片機ROM和RAM蕞大的尋址空間均為64K。通常來說,對于中型的嵌入式系統,尤其是帶液晶的單片機系統,64K的程序空間并不富裕,而將漢字字模作為常量數組會大大占用ROM的空間。而相對來說,數據存儲器只需幾K就夠用了,剩下很多空間可用于功能芯片的擴展。將提取的漢字字模數據存放在EPROM或EEPROM內,并設定該芯片的片選地址,則只要知道某個漢字字模數據在該芯片的存儲位置,通過程序計算出偏移地址,即可實現顯示功能。例如:設存放漢字字模數據的EEPROM的片選地址為0x9000,則通過程序定義:
#defineHz_Dot 0×9000
#define VBYTE (unsignedchar volatile xdata *)
若要編制漢字顯示子函數Write_Hz,只要將上面Write_Hz函數中:
***行換成Lcd_Data=*(VBYTE(Hz_Dot+p+i));
****行換成Lcd_Data=*(VBYTE(Hz_Dot+p+16+i))。
③將整個漢字字庫存放在EPROM或EEPROM內,程序根據要顯示漢字的機內碼來調用漢字字模。某些高端單片機,如MOTOROLA的M68300系列32位單片機,尋址范圍可達8M。液晶顯示常用的16×16漢字庫二進制數據文件為200K,將漢字字庫存入大容量的EEPROM,通過地址線可尋址到漢字庫中的每一個漢字。在計算機中對漢字的識別是通過機內碼來實現的,漢字標準機內碼為2字節代碼。漢字在漢字庫中是按照區位來排列的,每一區中有94個漢字,每個漢字都對應**的區號和在本區的位號,漢字輸入法中就有區位碼方法。實際上,漢字機內碼和區位碼有標準的對應關系,某個漢字在字庫中的區號加上0×a0等于其機內碼的高字節,位號加上0×a0等于其機內碼的低字節。因此很容易通過程序計算出要顯示的漢字在漢字庫中的區位號,即得到了其在漢字庫中的偏移地址。由于EEPROM中存儲了整個漢字庫,只須在硬件上設定存放漢字庫的存儲器片選地址,直接將漢字作為字符數組附給漢字顯示函數,通過機內碼計算出區號和位號,即可方便的對漢字字模進行調用了。與前2種方法相比,無須事先提取字模和設定其地址用于程序調用,因此在進行程序升級,涉及到漢字顯示時,不用更改漢字字模數據。
結 語
4
本文介紹了圖形液晶的漢字顯示方法,并以8051單片機為基礎,結合液晶模塊與單片機的典型接口電路,介紹了3種存放漢字字模的方法,并給出C51程序例子,具有很強的使用指導性。