|
#include <reg52.h> #include <absacc.h> #include <intrins.h> #include <hzk.h> #define lcd_data XBYTE[0x0000] /*液晶顯示數(shù)據(jù)入口*/ #define lcd_com XBYTE[0x8000] /*液晶顯示命令入口*/ bdata unsigned char flag; sbit f_bw=flag^0; // /*******************************************************************/ /*檢查是否可以操作液晶*/ void lcd_ready(void) { idata unsigned char l_status=0; while(l_status!=3) { l_status=lcd_com; l_status=l_status&0x03; } } /***********************************************/ /*液晶全屏清除程序*/ void lcd_clr(void) { data unsigned char l_adr,h_adr; data unsigned int i; l_adr=0; h_adr=0; lcd_ready();lcd_com=0x90; /*關(guān)閉顯示*/ lcd_ready();lcd_com=0xc0; /*數(shù)據(jù)寫,地址加1*/ lcd_ready();lcd_com=0xb0; /* 采用自動寫方式 */ lcd_ready();lcd_data=l_adr; lcd_ready();lcd_data=h_adr; lcd_ready();lcd_com=0x24; /*地址設(shè)置*/ for (i=0;i<8192;i++) { lcd_ready(); lcd_data=0x00; lcd_ready(); lcd_com=0xc4 ; /*寫入一個數(shù)據(jù)*/ } lcd_ready();lcd_com=0xb2; /* 不采用自動方式 */ lcd_ready();lcd_com=0xc4; /*數(shù)據(jù)寫,地址不變*/ lcd_ready();lcd_com=0x98; /*打開顯示*/ } /***********************************************/ /*液晶初始化*/ void lcd_init(void) { lcd_ready();lcd_com=0x90; /*關(guān)閉顯示*/ lcd_ready();lcd_data=0; lcd_ready();lcd_data=0; lcd_ready();lcd_com=0x40; /* 文本區(qū)首址為 0000 */
lcd_ready();lcd_data=0; lcd_ready();lcd_data=0; lcd_ready();lcd_com=0x42; /* 圖形區(qū)首址為 0000 */ lcd_ready();lcd_data=30; lcd_ready();lcd_data=0; lcd_ready();lcd_com=0x41; /* 文本區(qū)域設(shè)置 30字節(jié)每行*/ lcd_ready();lcd_data=30; lcd_ready();lcd_data=0; lcd_ready();lcd_com=0x43; /* 圖形區(qū)域設(shè)置 30字節(jié)每行 */ lcd_ready();lcd_com=0x80; /* or顯示方式 */ lcd_clr(); lcd_ready();lcd_com=0xb2; /* 不采用自動方式 */ lcd_ready();lcd_com=0xc4; /*數(shù)據(jù)寫,地址不變*/ lcd_ready();lcd_com=0x98; /*打開顯示*/ } /* 8 x 16 漢字字符顯示程序 */ void lcd_showa(unsigned char x,unsigned char y,unsigned char arr[]) { /*參數(shù)x為顯示漢字的橫向地址 最大值29 (0--29) 參數(shù)y為顯示漢字的縱向地址 最大值127 (0--127) 參數(shù)arr[]為顯示數(shù)據(jù)表名稱 */ data unsigned int adr_pt; /*液晶顯示地址指針,用于確定顯示位置*/ data unsigned char hz_pt; /*漢字短語內(nèi)部尋址指針*/ data unsigned int hzk_pt; /*漢字庫尋址指針,用于在漢字庫中提取數(shù)據(jù)*/ data unsigned char j; data unsigned char l_adr; /* 液晶顯示RAM地址低位 */ data unsigned char h_adr; /* 液晶顯示RAM地址高位 */
hz_pt=0; /*第一個數(shù)據(jù)*/ adr_pt=30*y+x; /*確定顯示首址*/
while (arr[hz_pt]!=0xff) /*短語結(jié)束標志為0xff*/ { l_adr=adr_pt%256; h_adr=(adr_pt-l_adr)/256; /*計算顯示RAM地址*/ hzk_pt=arr[hz_pt]*16; /*計算顯示字符的起始地址*/ for (j=0;j<16;j++) { lcd_ready(); lcd_data=l_adr; lcd_ready(); lcd_data=h_adr; lcd_ready(); lcd_com=0x24; /*地址設(shè)置*/ if (f_bw) /*反向顯示*/ { lcd_ready(); lcd_data=~hzk0816[hzk_pt]; } else { lcd_ready(); lcd_data=hzk0816[hzk_pt]; } lcd_ready(); lcd_com=0xc4; /*寫入一個數(shù)據(jù)*/ hzk_pt++; /*漢字庫尋址指針加1*/ l_adr=l_adr+30; if(l_adr<30) h_adr++; } adr_pt=adr_pt+1; hz_pt++; /*短語內(nèi)部指針加1,顯示下一個字符*/ } f_bw=0; } /* 8 x 16 , 16 x 16漢字字符顯示程序 */ void lcd_showb(unsigned char x,unsigned char y,unsigned char arr[]) { /*參數(shù)x為顯示漢字的橫向地址 最大值29 (0--29) 參數(shù)y為顯示漢字的縱向地址 最大值127 (0--127) 參數(shù)arr[]為顯示數(shù)據(jù)表名稱 */ idata unsigned int adr_pt; /*液晶顯示地址指針,用于確定顯示位置*/ idata unsigned char hz_pt; /*漢字短語內(nèi)部尋址指針*/ idata unsigned int hzk_pt; /*ASCII尋址指針,用于在字庫中提取數(shù)據(jù)*/ /*idata unsigned int hzk2_pt; /*漢字庫尋址指針,用于在字庫中提取數(shù)據(jù)*/ idata unsigned char j; idata unsigned char l_adr; /* 液晶顯示地址低位 */ idata unsigned char h_adr; /* 液晶顯示地址高位 */
hz_pt=0; adr_pt=30*y+x; /*確定顯示首址*/
while (arr[hz_pt]!=0xff) /*短語結(jié)束標志為0xff*/ { l_adr=adr_pt%256; h_adr=(adr_pt-l_adr)/256; /*計算顯示位置的低位,高位地址*/ /* 本次采用8X16 16X16 兩種字庫,一個索引的方法處理*/ /* 短語中,遇到254,則表明下一個字符從16X8字庫中取出*/ /* 短語由0XFF結(jié)束*/ if (arr[hz_pt]==254) { hz_pt++; hzk_pt=arr[hz_pt]*16;/*計算顯示字符的起始地址*/ for (j=0;j<16;j++) { lcd_ready(); lcd_data=l_adr; lcd_ready(); lcd_data=h_adr; lcd_ready(); lcd_com=0x24; /*地址設(shè)置*/ if (f_bw) { lcd_ready(); lcd_data=~hzk0816[hzk_pt]; } else { lcd_ready(); lcd_data=hzk0816[hzk_pt]; } lcd_ready(); lcd_com=0xc4; /*寫入一個數(shù)據(jù)*/ hzk_pt++; /*漢字庫尋址指針加1*/ l_adr=l_adr+30; if(l_adr<30) h_adr++; } adr_pt=adr_pt+1; hz_pt++; /*短語內(nèi)部指針加1,顯示下一個字符*/ } else { hzk_pt=arr[hz_pt]*32; /*計算顯示字符的起始地址*/ for (j=0;j<16;j++) { lcd_ready(); lcd_data=l_adr; lcd_ready(); lcd_data=h_adr; lcd_ready(); lcd_com=0x24; /*地址設(shè)置*/ if (f_bw) { lcd_ready(); lcd_data=~hzk1616[hzk_pt]; } else { lcd_ready(); lcd_data=hzk1616[hzk_pt]; } lcd_ready(); lcd_com=0xc0; /*寫入一個數(shù)據(jù)*/ hzk_pt++; /*漢字庫尋址指針加1*/ if (f_bw) { lcd_ready(); lcd_data=~hzk1616[hzk_pt]; } else { lcd_ready((); lcd_data=hzk1616[hzk_pt]; } lcd_ready(); lcd_com=0xc0; hzk_pt++; /*漢字庫尋址指針加1*/ l_adr=l_adr+30; if(l_adr<30) h_adr++; } adr_pt=adr_pt+2; hz_pt++; /*短語內(nèi)部指針加1,顯示下一個字符*/ } } f_bw=0; } /* 24 x 24漢字字符顯示程序 */ void lcd_showc(unsigned char x,unsigned char y,unsigned char arr[]) { /*參數(shù)x為顯示漢字的橫向地址 最大值29 (0--29) 參數(shù)y為顯示漢字的縱向地址 最大值127 (0--127) 參數(shù)arr[]為顯示數(shù)據(jù)表名稱 */ idata unsigned int adr_pt; /*液晶顯示地址指針,用于確定顯示位置*/ idata unsigned char hz_pt; /*漢字短語內(nèi)部尋址指針*/ idata unsigned int hzk_pt; /*ASCII尋址指針,用于在字庫中提取數(shù)據(jù)*/ /*idata unsigned int hzk2_pt; /*漢字庫尋址指針,用于在字庫中提取數(shù)據(jù)*/ idata unsigned char j; idata unsigned char l_adr; /* 液晶顯示地址低位 */ idata unsigned char h_adr; /* 液晶顯示地址高位 */
hz_pt=0; adr_pt=30*y+x; /*確定顯示首址*/
while (arr[hz_pt]!=0xff) /*短語結(jié)束標志為0xff*/ { l_adr=adr_pt%256; h_adr=(adr_pt-l_adr)/256; /*計算顯示位置的低位,高位地址*/ hzk_pt=arr[hz_pt]*72; /*計算顯示字符的起始地址*/ for (j=0;j<24;j++) { lcd_ready(); lcd_data=l_adr; lcd_ready(); lcd_data=h_adr; lcd_ready(); lcd_com=0x24; /*地址設(shè)置*/ if (f_bw) { lcd_ready(); lcd_data=~hzk2424[hzk_pt]; } else { lcd_ready(); lcd_data=hzk2424[hzk_pt]; } lcd_ready(); lcd_com=0xc0; /*寫入一個數(shù)據(jù)*/ hzk_pt++; /*漢字庫尋址指針加1*/ if (f_bw) { lcd_ready(); lcd_data=~hzk2424[hzk_pt]; } else { lcd_ready((); lcd_data=hzk2424[hzk_pt]; } lcd_ready(); lcd_com=0xc0; hzk_pt++; /*漢字庫尋址指針加1*/ if (f_bw) { lcd_ready(); lcd_data=~hzk2424[hzk_pt]; } else { lcd_ready((); lcd_data=hzk2424[hzk_pt]; } lcd_ready(); lcd_com=0xc0; hzk_pt++; /*漢字庫尋址指針加1*/ l_adr=l_adr+30; if(l_adr<30) h_adr++; adr_pt=adr_pt+2; hz_pt++; /*短語內(nèi)部指針加1,顯示下一個字符*/ } } f_bw=0; } /* 32 x 32漢字字符顯示程序 */ void lcd_showd(unsigned char x,unsigned char y,unsigned char arr[]) { /*參數(shù)x為顯示漢字的橫向地址 最大值29 (0--29) 參數(shù)y為顯示漢字的縱向地址 最大值127 (0--127) 參數(shù)arr[]為顯示數(shù)據(jù)表名稱 */ idata unsigned int adr_pt; /*液晶顯示地址指針,用于確定顯示位置*/ idata unsigned char hz_pt; /*漢字短語內(nèi)部尋址指針*/ idata unsigned int hzk_pt; /*ASCII尋址指針,用于在字庫中提取數(shù)據(jù)*/ /*idata unsigned int hzk2_pt; /*漢字庫尋址指針,用于在字庫中提取數(shù)據(jù)*/ idata unsigned char j; idata unsigned char l_adr; /* 液晶顯示地址低位 */ idata unsigned char h_adr; /* 液晶顯示地址高位 */ hz_pt=0; adr_pt=30*y+x; /*確定顯示首址*/
while (arr[hz_pt]!=0xff) /*短語結(jié)束標志為0xff*/ { l_adr=adr_pt%256; h_adr=(adr_pt-l_adr)/256; /*計算顯示位置的低位,高位地址*/ hzk_pt=arr[hz_pt]*128; /*計算顯示字符的起始地址*/ for (j=0;j<32;j++) { lcd_ready(); lcd_data=l_adr; lcd_ready(); lcd_data=h_adr; lcd_ready(); lcd_com=0x24; /*地址設(shè)置*/ if (f_bw) { lcd_ready(); lcd_data=~hzk3232[hzk_pt]; } else { lcd_ready(); lcd_data=hzk3232[hzk_pt]; } lcd_ready(); lcd_com=0xc0; /*寫入一個數(shù)據(jù)*/ hzk_pt++; /*漢字庫尋址指針加1*/ if (f_bw) { lcd_ready(); lcd_data=~hzk3232[hzk_pt]; } else { lcd_ready((); lcd_data=hzk3232[hzk_pt]; } lcd_ready(); lcd_com=0xc0; hzk_pt++; /*漢字庫尋址指針加1*/ if (f_bw) { lcd_ready(); lcd_data=~hzk3232[hzk_pt]; } else { lcd_ready((); lcd_data=hzk3232[hzk_pt]; } lcd_ready(); lcd_com=0xc0; hzk_pt++; /*漢字庫尋址指針加1*/ if (f_bw) { lcd_ready(); lcd_data=~hzk3232[hzk_pt]; } else { lcd_ready((); lcd_data=hzk3232[hzk_pt]; } lcd_ready(); lcd_com=0xc0; hzk_pt++; /*漢字庫尋址指針加1*/ l_adr=l_adr+30; if(l_adr<30) h_adr++; adr_pt=adr_pt+2; hz_pt++; /*短語內(nèi)部指針加1,顯示下一個字符*/ } } f_bw=0; } main() { unsigned char p[]={0,254,1,2,3,255}; unsigned int i; lcd_init();
while(1) { lcd_showb(1,1,p); } } |