液晶顯示1602與遙控程序演示! //遙控帶液晶顯示程序,已經調試完畢2002/10/30 //並可顯示時鐘 //若遙控接收不到,修改脈寬值即可 // //----------------------------------------------- //作者:Mingtree //----------------------------------------------- #include <reg51.h> #include<intrins.h> #include<absacc.h> //變數類型標識的宏定義, #define uchar unsigned char #define uint unsigned int #define DEDA 20 unsigned char deda=0; // 1602 控制引腳定義, sbit RS = P0^0; sbit RW = P0^1; sbit Elcm =P0^2; #define DATAPORT P1 // 數據埠 #define busy 0x80 //用於檢查寫忙信號 //外鍵控制(本程序未用,現在用遙控控制) sbit act=P2^1; /*加鍵*/ sbit deb=P2^0; /*減鍵*/ sbit cong=P2^2; /*功能鍵*/ char data led6[8];/*六位顯示緩衝區*/ code char love[]="I LOVE YOU "; code char time[]="0123456789ABCDEF:MinHour "; unsigned char hour=0,min=0,sec=0; bit menu=0; bit up=0; bit dw=0; #define temp1 DBYTE[0x50] #define temp2 DBYTE[0x51] #define temp3 DBYTE[0x52] #define temp4 DBYTE[0x53] #define temp5 DBYTE[0x54] //遙控 unsigned char yt; //中斷次數 bit start=0; //起碼標誌 bit h=0; //解碼標誌 unsigned char da=0; //暫存數據 unsigned char gt=0,gv=0; // // void delay400ms(void); void delay5ms(void); void lcdreset( void ); //LCD RESET void WaitForEnable( void ); //忙信號檢測 void lcdwrite_c( uchar CMD,uchar AttribC );// void DispOneChar(uchar x,uchar y,uchar Wdata);//顯示一個字元 void LocateXY( char posx,char posy); void LcdWrite_D( char dataW ) ; //寫一個數據 void yk(void); /*鍵盤檢測*/ void acct_1(void); unsigned char conh=0; /*功能鍵鍵值*/ void key_hit(unsigned char add3); void delay(void); /*定時初始化------------*/ void init_timer() { TMOD=0x11; TH0=0x4c; TL0=0x00; IP=0x10; IE=0X82; TR0=1; IT0=1; //邊沿觸發方式 EX0=1; //INT0 } /*------------------------*/ /*----------顯示緩衝區放數子程序--------------*/ void gift_in(void){ if(conh==0){ led6[0]=hour/10; led6[1]=hour%10; led6[2]=16; led6[3]=min/10; led6[4]=min%10; led6[5]=16; led6[6]=sec/10; led6[7]=sec%10; } else if(conh==1){ led6[0]=17; led6[1]=18; led6[2]=19; led6[3]=16; led6[4]=min/10; led6[5]=min%10; led6[6]=24; led6[7]=24; } else{ led6[0]=20; led6[1]=21; led6[2]=22; led6[3]=23; led6[4]=16; led6[5]=hour/10; led6[6]=hour%10; led6[7]=24; } } /*----------時間判斷子程序--------------*/ conv() { if(sec==60){min++;sec=0;} if(min==60){hour++;min=0;} if(hour==24) hour=0; gift_in(); } /*-----------中斷服務程序-------------*/ void time8()interrupt 1 using 3 { TH0=0x4c; TL0=0x00; deda++; if(deda==DEDA) { sec++;deda=0; } conv(); } /*-----------送顯子程序-------------*/ void disp1(uchar x,uchar y) { unsigned char *pd; unsigned char*kt; unsigned char b; kt=&led6[0]; /*送led的首地址給指針KT*/ for(b=0;b<8;b++){ /* 顯示六位*/ pd=&time[*kt]; /*查表---送要顯示的碼給指針pd*/ kt++; /*緩衝區加1*/ DispOneChar(x,y,*pd); x++; //顯示位置X } } /*------------------------*/ /*======================================================= 顯示字元串 =======================================================*/ void disp(uchar x,uchar y,char *ptr) { uchar i,l=0; while (ptr[l] >31){l++;}; for (i=0;i<l;i++) { DispOneChar(x++,y,ptr[i]); if ( x == 16 ){ x = 0; y ^= 1; } } } /*======================================================= 按指定位置顯示數出一個字元 =======================================================*/ void DispOneChar(uchar x,uchar y,uchar Wdata) { LocateXY( x, y ); // 定位顯示地址 LcdWrite_D( Wdata ); // 寫字元 } /*======================================================= 顯示游標定位 =======================================================*/ void LocateXY( char posx,char posy) { uchar temp; temp = posx & 0xf; posy &= 0x1; if ( posy )temp |= 0x40; temp |= 0x80; lcdwrite_c(temp,0); } //初始化 void lcdreset(void){ lcdwrite_c(0x38, 0); //顯示模式設置(不測試忙信號)共三次 delay5ms(); lcdwrite_c(0x38, 0); delay5ms(); lcdwrite_c(0x38, 0); |