#include<reg52.h> #include<stddef.h> #defineuchar unsigned char #defineuint unsigned int #defineLCD1602_FLAG #defineLCD1602_PORT P0 sbitlcd1602_rs=P2^0; sbitlcd1602_e=P2^2; sbit lcd1602_rw=P2^1; sbitlcd1602_busy=P0^7; sbitkey_ch=P3^5; sbitkey_add=P3^6; sbitkey_minus=P3^7; uchari,sec,min,h,date,month,flag; uintyear; uchar*chgstr[7]={" ","sec","min","hour","date","min","year"}; ucharj,k,m,n,o,p; ucharcode table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; uchartimestr[10],datestr[10]; voidinit(); voiddelay(uint); voidtime_display(); voiddate_display(); voidcontrol(); voidtime(); /* ************************************ * 函數名稱:lcd1602_CheckBusy() * 函數功能:狀態查詢 ************************************ */ voidlcd1602_CheckBusy() { do { lcd1602_busy=1; lcd1602_rs=0; lcd1602_rw=1; lcd1602_e=0; lcd1602_e=1; } while(lcd1602_busy); } /* *************************************** * 函數名稱: lcd1602_WriteCmd() * 函數功能:寫命令 * 入口參數:命令字 * 出口參數:無 *************************************** */ voidlcd1602_WriteCmd(const uchar cmd) { lcd1602_CheckBusy(); lcd1602_rs=0; lcd1602_rw=0; lcd1602_e=1; LCD1602_PORT=cmd; lcd1602_e=0; } /* ******************************************* * 函數名稱:lcd1602_WriteData() * 函數功能:寫數據 * 入口參數:c--待寫數據 * 出口參數:無 ********************************************* */ voidlcd1602_WriteData(const uchar c) { lcd1602_CheckBusy(); lcd1602_rs=1; lcd1602_rw=0; lcd1602_e=1; LCD1602_PORT=c; lcd1602_e=0; } /* *********************************************** * 函數名稱:lcd1602_Init() * 函數功能:初始化LCD * 入口參數:無 * 出口參數:無 *********************************************** */ voidlcd1602_Init() { lcd1602_WriteCmd(0x38);//顯示模式為8位2行5*7點陣 lcd1602_WriteCmd(0x0c);//display enable,flag enable,flash enable, lcd1602_WriteCmd(0x06);//flag move to right,screen don't move lcd1602_WriteCmd(0x01);//clear screen } /* ************************************************ * 函數名稱:lcd1602_Display() * 函數功能: 字符顯示 * 入口參數:ptr--字符或字符串指針 * 出口參數:無 * 說 明:用戶可通過以下方式來調用: * 1)lcd1602_Display("Hello,world!"); * 2) INT8U 存儲類型txt[]="要顯示的字符串"; * 或者 INT8U 存儲類型 txt[]={'t','x','t',..,'\0'}; * INT8U *ptr; * ptr=&txt; * lcd1602_Display(ptr); * 或lcd1602_Display(txt); * 或lcd1602_Display(&txt); ************************************************ */ voidlcd1602_Display(const uchar *ptr,uchar line,uchar xaddr) { uchardata i=0; uchar*data q; q=ptr; switch(line) { case 0: lcd1602_WriteCmd(0x80+xaddr); while(q!=NULL&& (*q!='\0') && i<16) { lcd1602_WriteData(*q); q++; i++; } break; case 1: lcd1602_WriteCmd(0xc0+xaddr); while(q!=NULL&& (*q!='\0') && i<16) { lcd1602_WriteData(*q); q++; i++; } break; } } voidmain() { lcd1602_Init(); init(); while(1) { time_display(); date_display(); control(); } } voidinit() { i=0; sec=0; min=30; h=7; date=17; month=10; year=2017; flag=0; EA=1; ET0=1; TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; TR0=1; } voiddelay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } voidtime_display() { timestr[7]=0x30+sec%10; timestr[6]=0x30+sec/10; timestr[5]=':'; timestr[4]=0x30+min%10; timestr[3]=0x30+min/10; timestr[2]=':'; timestr[1]=0x30+h%10; timestr[0]=0x30+h/10; timestr[8]=0; lcd1602_Display(timestr,1,3); } voiddate_display() { datestr[9]=0x30+date%10; datestr[8]=0x30+date/10; datestr[7]=':'; datestr[6]=0x30+month%10; datestr[5]=0x30+month/10; datestr[4]=':'; datestr[3]=0x30+year%10; datestr[2]=0x30+year/10%10; datestr[1]=0x30+year/100%10; datestr[0]=0x30+year/1000; lcd1602_Display(datestr,0,2); } voidcontrol() { if(!key_ch) { delay(5); if(!key_ch) { flag++; TR0=0; if(flag==7) {flag=0;TR0=1;lcd1602_Init();} lcd1602_Display(chgstr[flag],1,12); } } while(!key_ch); if(flag==1&&key_add==0) { while(!key_add); sec++; if(sec==60) sec=0; } if(flag==1&&key_minus==0) { while(!key_minus); sec--; if(sec==-1) sec=59; } if(flag==2&&key_add==0) { while(!key_add); min++; if(min==60) min=0; } if(flag==2&&key_minus==0) { while(!key_minus); min--; if(min==-1) min=59; } if(flag==3&&key_add==0) { while(!key_add); h++; if(h==24) h=0; } if(flag==3&&key_minus==0) { while(!key_minus); h--; if(h==-1) h=23; } if(flag==4&&key_add==0) { while(!key_add); date++; if(date==29) if((year%4!=0)&&(month==2)) date=1; if(date==30) if((year%4==0)&&(month==2)) date=1; if(date==31) if((month==4)||(month==6)||(month==9)||(month==11)) date=1; if(date==32) if((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10)||(month==12)) date=1; } if(flag==4&&key_minus==0) { while(!key_minus); if(date>1)date--; } if(flag==5&&key_add==0) { while(!key_add); month++; if(month==13) month=1; } if(flag==5&&key_minus==0) { while(!key_minus); month--; if(month==0) month=12; } if(flag==6&&key_add==0) { while(!key_add); year++; if(year==99) year=1; } if(flag==6&&key_minus==0) { while(!key_minus); year--; if(year==0) year=99; } } voidT0_rpt() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; i++; time(); } voidtime() { if(i==20) { i=0; sec++; if(sec==60) { sec=0; min++; if(min==60) { min=0; h++; if(h==24) { h=0; min=0; sec=0; date++; if(date==29) if((year%4!=0)&&(month==2)) { date=1; month++; if(month==13) { month=1; year++; } } if(date==30) if((year%4==0)&&(month==2)) { date=1; month++; if(month==13) { month=1; year++; } } if(date==31) if((month==4)||(month==6)||(month==9)||(month==11)) { date=1; month++; if(month==13) { month=1; year++; } } if(date==32) if((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10)||(month==12)) { date=1; month++; if(month==13) { month=1; year++; } (我也是用得別人的)
|