|
/*============================================================ 功能:使用12232液晶顯示圖片演示 ============================================================== 硬件:TG12232B (122*32)模擬口線接線方式 連接線圖: --------------------------------------------------| |DB0-----P0.0 | DB4-----P0.4 | RW-------P1.1 | A0--------P1.0 | |DB1-----P0.1 | DB5-----P0.5 | RS-------P2.1 | V0接1K電阻到GND | |DB2-----P0.2 | DB6-----P0.6 | E1-------P1.3 | |DB3-----P0.3 | DB7-----P0.7 | E2-------P1.2 | --------------------------------------------------- 本程序源碼只供學習參考,如有需要請聯系作者。 [注:AT89x52使用22.1184M或11.0592M晶振,實測使用22.1184M或11.0592都可以] 編譯平臺:Keil uV2 7.08 //可能看起來有點亂,不過效果還是不錯的,顯示圖形總的來說比顯示漢字要簡單,當然顯示漢字也不難。 希望此程序能給你一些幫助。
單片機制作資源網 =============================================================*/
#i nclude <AT89X52.H>
#define uchar unsigned char #define uint unsigned int #define E1 P1_3 //塊1 左邊 #define E2 P1_2 //塊2 右邊 #define RW P1_1 #define A0 P1_0 //A0為1時是數據,0時為指令數據 #define DATA P0 //數據 extern unsigned char code Bmpt1[]; extern unsigned char code Bmpt2[]; extern unsigned char code Bmpt3[]; extern unsigned char code Bmpt4[]; extern unsigned char code Bmpt5[]; extern unsigned char code Bmpt6[]; extern unsigned char code Bmpt7[]; extern unsigned char code Bmptc[]; extern unsigned char code bmp001[]; extern unsigned char code Bmp08[]; extern unsigned char code Bmp07[]; extern unsigned char code Bmp06[]; extern unsigned char code Bmp05[]; extern unsigned char code Bmp04[]; extern unsigned char code Bmp03[]; extern unsigned char code Bmp02[]; extern unsigned char code Bmp01[]; extern unsigned char code Bmp012[]; extern unsigned char code Bmp003[]; extern unsigned char code Bmp002[]; //延時 void delay(unsigned int i) { unsigned char k=200; while(i>0) { i--; } while(k>1)k--; }
//左頁 //發送數據 void OUTMD(unsigned char i) { A0=1; //寫數據 //delay(5); E1=1; //delay(10); DATA=i; //delay(5); E1=0; } //左頁 //發送命令 void OUTMI(unsigned char i) { A0=0; //寫指令 //delay(5); E1=1; //delay(10); DATA=i; //delay(5); E1=0; } //右頁 //發送數據 void OUTSD(unsigned char i) { A0=1; //寫數據 //delay(5); E2=1; //delay(10); DATA=i; //delay(5); E2=0; } //右頁 //發送命令 void OUTSI(unsigned char i) { A0=0; //寫指令 //delay(5); E2=1; //delay(10); DATA=i; //delay(5); E2=0; } //初始化 void lcdini(void) { RW=0; OUTMI(0XE2); OUTSI(0XE2);//復位 OUTMI(0XAE); OUTSI(0XAE);//POWER SAVE OUTMI(0XA4); OUTSI(0XA4);//動態驅動 OUTMI(0XA9); OUTSI(0XA9);//1/32占空比 OUTMI(0XA0); OUTSI(0XA0);//時鐘線輸出 OUTMI(0XEE); OUTSI(0XEE);//寫模式 OUTMI(0X00); OUTMI(0XC0); OUTSI(0X00); OUTSI(0XC0); OUTMI(0XAF); OUTSI(0XAF); } /* 函數說明:同時設置主從顯示頁為0-3頁。(內函數,私有,用戶不直接調用) ------------------------------------------------------------------------ */ void SetPage(uchar page0,uchar page1) { OUTMI(0xB8|page1);OUTSI(0xB8|page0); } /* -------------------------------------------------------------------------------- 函數說明:同時設置主從列地址為0-121。(內函數,私有,用戶不直接調用) -------------------------------------------------------------------------------- */ void SetAddress(uchar address0,uchar address1) { OUTMI(address1);OUTSI(address0); } /* -------------------------------------------------------------------------------- 調用方式:void PutChar0(uchar ch) 函數說明:在右頁當前地址畫一個字節8個點。(內函數,私有,用戶不直接調用) -------------------------------------------------------------------------------- -*/ void PutCharR(uchar ch) { OUTSD(ch); } /* -------------------------------------------------------------------------------- 調用方式:void PutChar1(uchar ch) 函數說明:在左頁當前地址畫一個字節8個點。(內函數,私有,用戶不直接調用) -------------------------------------------------------------------------------- -*/ void PutCharL(uchar ch) { OUTMD(ch); } /* -------------------------------------------------------------------------------- 調用方式:void DrawBmp(bit layer,uchar width,uchar *bmp) 函數說明:畫一個圖,layer表示上下層,width是圖形的寬,高都是16,bmp是 圖形指針 使用zimo3軟件,縱向取模,字節倒序/240字節 -------------------------------------------------------------------------------- -*/ void DrawBmp(bit layer,uchar width,uchar *bmp) { uchar x,address,i=0; //address表示顯存的物理地址 uchar page=0; //page表示上下兩頁 bit window=0; //window表示左右兩頁 //putcharR //右邊 //putcharL //左邊 for (x=width;x>1;x--) { if (i>60) {window=1;address=i%61;} else address=i; if(layer==0) //顯示一行八個字 { SetPage(0,0); SetAddress(address,address); if(window==1)PutCharR(bmp[i]); else PutCharL(bmp[i]); SetPage(1,1); SetAddress(address,address); if(window==1)PutCharR(bmp[i+width]); else PutCharL(bmp[i+width]); } else { //顯示第二行八個漢字 SetPage(2,2); SetAddress(address,address); if(window==1)PutCharR(bmp[i]); else PutCharL(bmp[i]); SetPage(3,3); SetAddress(address,address); if(window==1)PutCharR(bmp[i+width]); else PutCharL(bmp[i+width]); } i++; } } /* --------------------------------------------------------------------------------
調用方式:void clrscr(void) 函數說明:清屏 -------------------------------------------------------------------------------- -*/ void clrscr(void) { uchar i; uchar page; for (page=0;page<4;page++) { SetPage(page,page); SetAddress(0,0); for (i=0;i<61;i++){PutCharR(0);PutCharL(0);} } } //----------------------------------------------------------- //圖片顯示 //采用字模2生成或字模3生成的都可以. //----------------------------------------------------------- void DrawBmp1(uint x_add, uchar width,uchar *bmp) { uchar x,address,i=0; //address表示顯存的物理地址 uchar page=0; //page表示上下兩頁 bit window=0; //window表示左右兩頁 //putcharR //右邊 //putcharL //左邊 for (x=width;x>1;x--) { if (x_add>60) {window=1;address=x_add%61;} else address=x_add; SetPage(0,0); SetAddress(address,address); if(window==1)PutCharR(bmp[i]); else PutCharL(bmp[i]); SetPage(1,1); SetAddress(address,address); if(window==1)PutCharR(bmp[i+width]); else PutCharL(bmp[i+width]);
SetPage(2,2); SetAddress(address,address); if(window==1)PutCharR(bmp[i+width+width]); else PutCharL(bmp[i+width+width]); SetPage(3,3); SetAddress(address,address); if(window==1)PutCharR(bmp[i+width+width+width]); else PutCharL(bmp[i+width+width+width]); i++; x_add++;
} } //--------------------------------------------------------------- //--------------------------------------------------------------- //采用zimo2 顯示漢字,以漢字的顯示方式 //void Draw_word(uchar d_where,uint x_add,bit layer,uchar width) //d_where表示在碼表中第幾個漢字,x_add橫坐標位置,layer顯示的層, width顯示的寬度。 //--------------------------------------------------------------- void Draw_word(uchar d_where,uint x_add,bit layer,uchar width) { uchar x,i=0,address; //address表示顯存的物理地址 uchar page=0; //page表示上下兩頁 bit window=0; //window表示左右兩頁 //putcharR //右邊 //putcharL //左邊 d_where=d_where*32;
for (x=width;x>1;x--) { if (x_add>60) {window=1;address=x_add%61;} else address=x_add; if(layer==0) //顯示一行八個字 { SetPage(0,0); SetAddress(address,address); if(window==1)PutCharR(bmp001[d_where]);//右邊 else PutCharL(bmp001[d_where]);//左邊 SetPage(1,1); SetAddress(address,address); if(window==1)PutCharR(bmp001[d_where+width]); else PutCharL(bmp001[d_where+width]); } else { //顯示第二行八個漢字 SetPage(2,2); SetAddress(address,address); if(window==1)PutCharR(bmp001[d_where]);//右邊 else PutCharL(bmp001[d_where]);//左邊 SetPage(3,3); SetAddress(address,address); if(window==1)PutCharR(bmp001[d_where+width]); else PutCharL(bmp001[d_where+width]); } x_add++; d_where++; } } /* //------------------------------------------------------------------ //字模2顯示一個漢字 //縱向取模,字節倒序 void disp_one(bit top_low,bit widows,uchar address,uchar width,uchar*bmp) { if(top_low==0) { SetPage(0,0); SetAddress(address,address); if(window==1)PutCharR(bmp001[next][i]); else PutCharL(bmp001[next][i]); SetPage(1,1); SetAddress(address,address); if(window==1)PutCharR(bmp001[next][i+width]); else PutCharL(bmp001[next][i+width]); } else { SetPage(0,0); SetAddress(address,address); if(window==1)PutCharR(bmp001[next][i]); else PutCharL(bmp001[next][i]); SetPage(1,1); SetAddress(address,address); if(window==1)PutCharR(bmp001[next][i+width]); else PutCharL(bmp001[next][i+width]); } } */ //液晶顯示規則 // M(左) S(右) // page page // 0 | 0 // 1 | 1 // 2 | 2 // 3 | 3
void delay1s(unsigned char i) { while(i>1) { i--; delay(65530); } } //顯示動態的等待圖標 void wait1(unsigned char i) { for(;i>1;i--) {delay1s(2); clrscr(); // DrawBmp1(0,60,Bmptc); // DrawBmp1(76,19,Bmpt1); // delay1s(2); clrscr(); // DrawBmp1(0,60,Bmptc); // DrawBmp1(76,19,Bmpt2); // delay1s(2); clrscr(); // DrawBmp1(0,60,Bmptc); // DrawBmp1(76,19,Bmpt3); // delay1s(2); clrscr(); // DrawBmp1(0,60,Bmptc); // DrawBmp1(76,19,Bmpt4); // delay1s(2); clrscr(); // DrawBmp1(0,60,Bmptc); // DrawBmp1(76,19,Bmpt5); // delay1s(2); clrscr(); // DrawBmp1(0,60,Bmptc); // DrawBmp1(76,19,Bmpt6); // delay1s(2); clrscr(); // DrawBmp1(0,60,Bmptc); // DrawBmp1(76,19,Bmpt7); // } } //演示程序 void main() {
|