 
#include 'reg51.h'
#define uint unsigned int #define uchar unsigned char #define port P0 uchar table[]='I love you!'; uchar table1[]='Shang Hong Rui!'; uchar table2[]='LI ZHEN WEI!' ; uchar table3[]='> > > > > > > > '; uchar num; sbit rs=P2^0; sbit rw=P2^1; sbit e=P2^2; /******************************************** 1ms 為基本單位的延時函數(shù) ********************************************/ void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } /******************************************** 讀取lcd1602狀態(tài) ********************************************/ read() { uchar temp ; port=0xff; rs=0; rw=1; e=1; temp=port; e=0; return temp; } /******************************************** 檢測lcd是否忙碌 小卒整天沒事 ********************************************/ void busy() { uchar temp; do { temp=read(); } while((temp&0x80)==0x80); } /******************************************** 向 lcd 里寫命令 ********************************************/ void write_com(uchar com) { busy(); //delay(2); port=com; //busy(); rs=0; rw=0; e=1; e=0; }/******************************************** 向 lcd 里寫數(shù)據(jù) ********************************************/ void write_data(uchar dat) { busy(); //delay(2); port=dat; //busy(); rs=1; rw=0; e=1; e=0; } /******************************************** 初始化lcd ********************************************/ void init() { write_com(0x06) ;//顯示地址遞增,即寫一個數(shù)據(jù)后,顯示位置右移一位 write_com(0x0e) ;//開顯示,有光標(biāo),光標(biāo)不閃 write_com(0x38) ;//8位數(shù)據(jù),雙列,5*7字形 write_com(0x01) ;//清屏 } /********************************************** 主程序 實現(xiàn)顯示 ***********************************************/ main() { init(); write_com(0x80+0x02); for(num=0;num<11;num++) { write_data(table[num]); delay(150); } //busy(); write_com(0x80+0x40); for(num=0;num<15;num++) { write_data(table1[num]); delay(150); }
write_com(0x01); //清屏 write_com(0x80+0x15); for(num=0;num<12;num++) { write_data(table2[num]); delay(5); }
for(num=0;num<20;num++) { //write_com(0x1c) ; //顯示地址遞增,即寫一個數(shù)據(jù)后,顯示位置右移一位 整屏向左移動 write_com(0x18) ; //顯示地址遞增,即寫一個數(shù)據(jù)后,顯示位置右移一位 整屏向右移動 delay(120); } //busy(); delay(50); write_com(0x01); //清屏 write_com(0x80+0x54); for(num=0;num<16;num++) { write_data(table3[num]); delay(5); } for(num=0;num<20;num++) { //write_com(0x1c) ; //顯示地址遞增,即寫一個數(shù)據(jù)后,顯示位置右移一位 整屏向左移動 write_com(0x18) ; //顯示地址遞增,即寫一個數(shù)據(jù)后,顯示位置右移一位 整屏向右移動 delay(120); } delay(50); write_com(0x01); //清屏 write_com(0x80+0x15); for(num=0;num<12;num++) { write_data(table2[num]); delay(5); } write_com(0x80+0x54); for(num=0;num<16;num++) { write_data(table3[num]); delay(5); } for(num=0;num<19;num++) { write_com(0x1c) ; //顯示地址遞增,即寫一個數(shù)據(jù)后,顯示位置右移一位 整屏向左移動 //write_com(0x18) ; //顯示地址遞增,即寫一個數(shù)據(jù)后,顯示位置右移一位 整屏向右移動 delay(120); } while(1); }
/*0000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000*/ #include 'reg51.h' #define uchar unsigned char #define uint unsigend int #define port P0 uchar table[]='0123456789'; uchar miaog=0,miaos=1,feng=1,fens=1,shig=1,shis=1; sbit rs=P2^0; sbit rw=P2^1; sbit e=P2^2; /*********************************** ***00000 5*7 -> 0xff *****0** /5*8 0x40 *****0** 0x40 ----> I *****0** 0x40 ----> *****0** 0x40 *****0** 0x40 ***00000 0x1f 添加自己的自定義字符 ***********************************/ code uchar ziku[]= { 0x0f,0x09,0x09,0x0f,0x09,0x09,0x0f,0x00, //漢字“日” 0x0F,0x09,0x0F,0x09,0x0F,0x09,0x11,0x00, //漢字“月” 0x01,0x02,0x03,0x05,0x09,0x03,0x00,0x00, //漢字“年”左半部 0x00,0x00,0x1e,0x08,0x08,0x1e,0x08,0x08 //漢字“年”右半部 }; /******************************* 讀取lcd1602狀態(tài) *******************************/ uchar lcd_readcom() { uchar temp; e=0; port=0xff; rs=0; rw=1; e=1; temp=port; e=0; return temp; } /*************************************** 檢測 lcd 是否忙碌 小卒整天沒事 ***************************************/ check_busy() { uchar temp; do{ temp=lcd_readcom(); }while((temp&0x80)==0x80); } /***************************************** 向lcd里寫命令 *****************************************/ void lcd_writecom(uchar dat) { check_busy(); e=0; port=dat; rs=0; rw=0; e=1; e=0; } /*************************************** 讀取lcd對應(yīng)地址數(shù)據(jù) *****************************************/ uchar lcd_readdat() { uchar temp; check_busy(); e=0; port=0xff; rs=1; rw=1; e=1; temp=port; e=0; return temp; } /**************************************** 向lcd里寫數(shù)據(jù) ****************************************/ void lcd_writedat(uchar dat) { check_busy(); e=0; port=dat; rs=1; rw=0; e=1; e=0; } /**************************************** 向lcd寫字符串 *****************************************/ void lcd_gets(char *dat) { while(*dat!=0) { lcd_writedat(*dat); dat++; } } /***************************************** 確定要寫的位子即x y 坐標(biāo) ******************************************/ void lcd_xy(uchar x,uchar y) { switch(y) { case 0:lcd_writecom(0x80+x);break;//第一行第X個位置 case 1:lcd_writecom(0xc0+x);break;//0xc0==0x80+0x50 第二行第X個位置 case 2:lcd_writecom(0x94+x);break;// case 3:lcd_writecom(0xd4+x);break;//4*20 } } /**************************************************** 單行顯示才有5*10 其他5*8 MODE=1 5*8 MODE=0 5*10 ****************************************************/ add_custom_word(uchar *dat,uchar len,uchar mode) { uchar n,m; for(n=0;n<len;n++) { if(mode) { lcd_writecom(0x40+8*n); for(m=0;m<8;m++) { lcd_writedat(*dat); dat++; } } else { lcd_writecom(0x40+10*n); for(m=0;m<10;m++) { lcd_writedat(*dat); dat++; } } } } /******************************************** 初始化lcd ********************************************/ void lcd_init() { lcd_writecom(0x01) ;//清屏 lcd_writecom(0x03) ; lcd_writecom(0x3c) ; lcd_writecom(0x40) ; lcd_writecom(0x0c) ; add_custom_word(ziku,4,1); //初始化自定義字符 } /******************************************** 1ms 為基本單位的延時函數(shù) ********************************************/ void delay(uchar z) { uchar x,y,a; for(x=z;x>0;x--) for(y=110;y>0;y--) for(a=1;a>0;a--) ; } /********************************************** 主程序 實現(xiàn)顯示 ***********************************************/ main() { lcd_init(); //lcd_xy(0,0); //lcd_gets(' I LOVE YOU'); //lcd_xy(0,1); //lcd_gets('Shang Hong Rui'); lcd_xy(2,0) ; lcd_gets('2011'); lcd_xy(6,0) ; lcd_writedat(2); lcd_xy(7,0); lcd_writedat(3); lcd_xy(8,0) ; lcd_gets('03'); lcd_xy(10,0); lcd_writedat(1); lcd_xy(11,0) ; lcd_gets('06'); lcd_xy(13,0); lcd_writedat(0); lcd_xy(3,1) ; lcd_gets('0'); lcd_xy(4,1) ; lcd_gets('0'); lcd_xy(5,1) ; lcd_gets(':'); lcd_xy(6,1) ; lcd_gets('0'); lcd_xy(7,1) ; lcd_gets('0'); lcd_xy(8,1) ; lcd_gets(':'); lcd_xy(9,1) ; lcd_gets('0'); lcd_xy(10,1) ; lcd_gets('0'); while(1) { //for(m=0;m<10;m++) lcd_xy(10,1); lcd_writedat(table[miaog]); //秒個位 delay(1000); miaog++; if(miaog==10) { miaog=0; lcd_xy(9,1); lcd_writedat(table[miaos]); //秒十位 miaos++; if(miaos==6) { miaos=0; lcd_xy(7,1); lcd_writedat(table[feng]); //分個位 feng++; if(feng==10) { feng=0; lcd_xy(6,1); lcd_writedat(table[fens]); //分十位 fens++; if(fens==6) { fens=0; lcd_xy(4,1); lcd_writedat(table[shig]); //時個位 shig++; if(shig==10) { shig=0; lcd_xy(3,1); lcd_writedat(table[shis]); //時十位 shis++; if(shis==6) { shis=0; } } } } } } } //lcd_xy(0,0); //lcd_writedat(0);//自定義字符使用,0表示第一個字 ,1表示第二個字,依此類推 //lcd_xy(15,0); //lcd_writedat(3); //自定義字符使用 } 第二段程序為借用別人的,呵呵
限時干貨下載:關(guān)注我們“單片機(jī)”,回復(fù)“教程”獲取單片機(jī)電子書,回復(fù)“仿真”獲取Proteus仿真資料。
|