0.jpg (105.6 KB, 下載次數(shù): 50)
下載附件
2020-7-11 15:20 上傳
程序
#include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit lcdrs=P3^7; sbit lcdrw=P3^6; sbit lcden=P3^5; sbit inf=P3^3; sbit SCLK=P0^7; sbit IO=P0^6; sbit RST=P0^5; sbit beep=P0^4; sbit P0_2=P0^2; sbit P0_1=P0^1; sbit P0_0=P0^0; sbit s1=P2^0; sbit s2=P2^1; sbit s3=P2^2; sbit s4=P2^3; uchar code table1[]=" : : : "; uchar code table2[]=" : : : "; uchar code table3[]=" Welcome to "; uchar code table4[]=" Timing Sockets"; uchar code table5[]="20 - - "; uchar code table6[]=" : : "; uchar code table7[]="MON"; uchar code table8[]="TUE" ; uchar code table9[]="WED" ; uchar code table10[]="THR"; uchar code table11[]="FRI"; uchar code table12[]="SAT"; uchar code table13[]="SUN"; uchar code table14[]="Set theCalendar"; uchar code table15[]="Set theMode"; uchar code table16[]="Set theTiming "; uchar code table17[]="ModeChoice"; uchar code table18[]="1 2 3 4 5 6"; uint buf_key_code=0; uint count_T=0,buf_CT=0; uchar key=255; uchar key_bit_count=0; uchar common_code_count=0; uchar inf_status=0; uchar dd[7]; uchar aa[7]={0,0,11,17,4,6,11}; uchar ee[3]={11,0,0}; uchar ff[3]={11,1,0}; uchar kk[2]={11,2}; uchar hh[2]={11,3}; uchar gg[6]; bitflag,flag2,flag3,flag4,flag5,flag6,flag7,flag8,flag9,flag10,flag11,flag12,flag13,flag14; char miao,fen,shi,ri,yue,zhou,nian; uchar sw,gw; uchar s1num,s2num; void display(void); void delay(uint i) { uintj; for(;i>0;i--) for(j=100;j>0;j--); } void write_com(uchar com) //lcd寫指令 { lcdrs=0; lcden=0; P1=com; delay(5); lcden=1; delay(5); lcden=0; } void write_data(uchar dat) //lcd寫數(shù)據(jù) { lcdrs=1; lcden=0; P1=dat; delay(5); lcden=1; delay(5); lcden=0; } void init() //lcd初始化 { uchar num; lcdrw=0; write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01); write_com(0x80); write_com(0x01); write_com(0x80); for(num=0;num<16;num++) { write_data(table3[num]); delay(5); } write_com(0xc0); for(num=0;num<16;num++) { write_data(table4[num]); delay(5); } delay(5);
write_com(0x01); write_com(0x80); for(num=0;num<8;num++) { write_data(table5[num]); delay(1); } write_com(0xc0); for(num=0;num<8;num++) { write_data(table6[num]); delay(1); }
} /*********DS1302程序*********/ void delay1(uint num) { while( --num ); } void DS1302_wbyte(uchar inbyte)//ds1302寫數(shù)據(jù) { uchar i; for(i=8;i>0;i--) { SCLK=0; if(inbyte&0x01) IO=1; else IO=0; SCLK=1; delay1(1); inbyte=inbyte>>1; } } uchar DS1302_rbyte() //ds1302讀數(shù)據(jù) { uchar i,temp=0; IO=1; for(i=7;i>0;i--) { SCLK=0; if(IO==1) temp=temp|0x80; else temp=temp&0x7f; SCLK=1; temp=temp>>1; } return (temp); } //----------往ds1302的某個地址寫入數(shù)據(jù)------------- void Write_DS1302(uchar cmd,uchar indata) { RST=1; DS1302_wbyte(cmd); DS1302_wbyte(indata); RST=0; SCLK=0; } //----------讀ds1302某地址的的數(shù)據(jù)----------------- uchar Read_DS1302(uchar addr) { uchar backdata; RST=1; DS1302_wbyte(addr); backdata=DS1302_rbyte();//先寫地址,然后讀數(shù)據(jù) RST=0; SCLK=0; return (backdata); } //------------設(shè)置初始時間------------------- void Set_DS1302(uchar addr,uchar *p,ucharn)//寫入n個數(shù)據(jù) {uchar bb; Write_DS1302(0x8e,0x00);//寫控制字,允許寫操作 for(;n>0;n--) {sw=(*p)/10; gw=(*p)%10; bb=(sw<<4)|gw; Write_DS1302(addr,bb); p++; addr=addr+2; } Write_DS1302(0x8e,0x80);//寫保護,不允許寫 } //----------- 讀取當前時間------------------- void Read_nowtime(uchar addr,uchar *p,ucharn) { for(;n>0;n--) { *p=Read_DS1302(addr); p++; addr=addr+2; } } void init_DS1302() //ds1302初始化 { RST=0; SCLK=0; Write_DS1302(0x80,0x00);//寫控制字,允許寫 Write_DS1302(0x90,0x00);//禁止渦流充電 } void write_sfm(uchar add,uchar date) { sw=date/10; gw=date%10; write_com(0x80+0x40+add); write_data(0x30+sw); write_data(0x30+gw); } void write_nyr(uchar add,uchar date) { sw=date/10; gw=date%10; write_com(0x80+add); write_data(0x30+sw); write_data(0x30+gw); } void write_zhou() //星期處理 { uchar num; write_com(0x80+11); switch(zhou) {case 1: for(num=0;num<3;num++) { write_data(table7[num]); delay(1); };break; case 2: for(num=0;num<3;num++) { write_data(table8[num]); delay(1); };break; case 3: for(num=0;num<3;num++) { write_data(table9[num]); delay(1); };break; case 4: for(num=0;num<3;num++) { write_data(table10[num]); delay(1); };break; case 5: for(num=0;num<3;num++) { write_data(table11[num]); delay(1); };break; case 6: for(num=0;num<3;num++) { write_data(table12[num]); delay(1); };break; case 7: for(num=0;num<3;num++) { write_data(table13[num]); delay(1); };break; default:break; } } void lcall() { ucharnum1; write_com(0x01); write_com(0x80); for(num1=0;num1<8;num1++) { write_data(table5[num1]); delay(1); } write_com(0xc0); for(num1=0;num1<8;num1++) { write_data(table6[num1]); delay(1); } display(); } voidlcall5() //寫入定時開關(guān)時間 { uchar num2; write_com(0x01); write_com(0x80); for(num2=0;num2<15;num2++) { write_data(table1[num2]); delay(1);} write_com(0xc0); for(num2=0;num2<15;num2++) { write_data(table2[num2]); delay(1);} write_nyr(0,ee[0]); write_nyr(3,ee[1]); write_nyr(6,ee[2]); write_nyr(0x09,kk[0]); write_nyr(0x0c,kk[1]); write_sfm(0,ff[0]); write_sfm(3,ff[1]); write_sfm(6,ff[2]); write_sfm(0x09,hh[0]); write_sfm(0x0c,hh[1]);
} void lcall3() { uchar num3; write_com(0x01); write_com(0x80); for(num3=0;num3<11;num3++) { write_data(table17[num3]); delay(10); } write_com(0xc0); for(num3=0;num3<16;num3++) { write_data(table18[num3]); delay(10); } } /***************按鍵處理程序*************/ voidkeyscan() { uchar num; if(s1==0) {delay(5); if(s1==0) { s1num++; flag=1; write_com(0x01); write_com(0x80); while(!s1); switch (s1num) { case 1: for(num=0;num<16;num++) {write_data(table14[num]);write_com(0x0c); delay(1);}; break; case 2: write_com(0x0c);s2num=0; flag3=0; for(num=0;num<16;num++) {write_data(table16[num]);write_com(0x0c); delay(1);}; break; case 3: for(num=0;num<12;num++) {write_data(table15[num]);write_com(0x0c); delay(1);}; break; case 4: s2num=0;flag6=0;s1num=0;flag=0;flag5=0;write_com(0x0c); for(num=0;num<8;num++) { write_data(table5[num]); delay(1); } write_com(0xc0); for(num=0;num<8;num++) { write_data(table6[num]); delay(1); } break; default:break; } } } if(s1num!=0) { if(s1num==1) { //1 if(s2==0) {delay(5); if(s2==0) {s2num++; if(flag3==0) {lcall();} while(!s2); switch(s2num) { case 1: flag3=1;write_com(0x80+3);write_com(0x0f);break; case 2: write_com(0x80+6);break; case 3: write_com(0x80+9);break; case 4: write_com(0x80+13);break; case 5: write_com(0xc0+1);break; case 6: write_com(0xc0+4);break; case 7: write_com(0xc0+7);break; case 8: flag3=0;s2num=0;write_com(0x0c);Set_DS1302(0x80,aa, 7);break; default:break; } } } if(s2num!=0) {if(s3==0) {delay(5); if(s3==0) {while(!s3); switch(s2num) { case 1:nian++; if(nian==100) nian=0; write_nyr(2,nian);write_com(0x82);aa[6]=nian;Set_DS1302(0x80,aa, 7);break; case 2:yue++; if(yue==13) yue=0; write_nyr(5,yue);write_com(0x85);aa[4]=yue;Set_DS1302(0x80,aa, 7);break; case 3:ri++; if(ri==31) ri=0; write_nyr(8,ri);write_com(0x88);aa[3]=ri;Set_DS1302(0x80,aa,7); break; case 4:zhou++; if(zhou==8) zhou=1; aa[5]=zhou; write_zhou(); write_com(0x80+13);Set_DS1302(0x80,aa,7);break; case 5:shi++; if(shi==24) shi=0; write_sfm(0,shi);write_com(0xc0);aa[2]=shi;Set_DS1302(0x80,aa, 7);break; case 6:fen++; if(fen==60) fen=0; write_sfm(3,fen);write_com(0xc3);aa[1]=fen;Set_DS1302(0x80,aa,7);break; case 7:miao++; if(miao==60) miao=0; write_sfm(6,miao);write_com(0xc6);aa[0]=miao;Set_DS1302(0x80,aa,7);break; default:break; } } } if(s4==0) {delay(5); if(s4==0) {while(!s4); switch(s2num) { case 1:nian--; if(nian==-1) nian=99; write_nyr(2,nian);write_com(0x82);aa[6]=nian;Set_DS1302(0x80,aa,7); break; case 2:yue--; if(yue==-1) yue=12; write_nyr(5,yue);write_com(0x85);aa[4]=yue; Set_DS1302(0x80,aa,7);break; case 3:ri--; if(ri==0) ri=31; write_nyr(8,ri);write_com(0x88);aa[3]=ri;Set_DS1302(0x80,aa, 7); break; case 4:zhou--; if(zhou==0) zhou=7; aa[5]=zhou; write_zhou();write_com(0x80+13);Set_DS1302(0x80,aa,7);break; case 5:shi--; if(shi==-1) shi=23; write_sfm(0,shi);write_com(0xc0);aa[2]=shi;Set_DS1302(0x80,aa, 7);break; case 6:fen--; if(fen==-1) fen=59; write_sfm(3,fen);write_com(0xc3);aa[1]=fen;Set_DS1302(0x80,aa,7);break; case 7:miao--; if(miao==-1) miao=59; write_sfm(6,miao);write_com(0xc6);aa[0]=miao;Set_DS1302(0x80,aa,7);break; default:break; } } } }//s2num } //1 if(s1num==2) { if(s2==0) {delay(5); if(s2==0) {s2num++; if(flag6==0) lcall5(); while(!s2); switch(s2num) { case 1: flag6=1;write_com(0x81);write_com(0x0f);break; case 2: write_com(0x84);break; case 3: flag2=1;write_com(0x87);break; case 4: write_com(0xc1);break; case 5: write_com(0xc4);break; case 6: flag4=1;write_com(0xc7);break; case 7: write_com(0x8a);break; case 8: flag13=1;write_com(0x8d);break; case 9: write_com(0xca);break; case 10: flag14=1;write_com(0xcd);break; case 11: flag6=0;s2num=0;write_com(0x0c);break; default: break; } } }
if(s2num!=0) { if(s3==0) {delay(5); if(s3==0) {while(!s3); switch(s2num) { case 1:ee[0]+=1; if(ee[0]==24) ee[0]=0; write_nyr(0,ee[0]);write_com(0x80);break; case 2:ee[1]+=1; if(ee[1]==60) ee[1]=0; write_nyr(3,ee[1]);write_com(0x83); break; case 3:ee[2]+=1; if(ee[2]==60) ee[2]=0; write_nyr(6,ee[2]);write_com(0x86); break; case 4:ff[0]+=1; if(ff[0]==24) ff[0]=0; write_sfm(0,ff[0]);write_com(0xc0); break; case 5:ff[1]+=1; if(ff[1]==60) ff[1]=0; write_sfm(3,ff[1]);write_com(0xc3);break; case 6:ff[2]+=1; if(ff[2]==60) ff[2]=0; write_sfm(6,ff[2]);write_com(0xc6); break; case 7:kk[0]+=1; if(kk[0]==24) kk[0]=0; write_nyr(0x09,kk[0]);write_com(0x89);break; case 8:kk[1]+=1; if(kk[1]==60) kk[1]=0; write_nyr(0x0c,kk[1]);write_com(0x8c); break; case 9:hh[0]+=1; if(hh[0]==24) hh[0]=0; write_sfm(0x09,hh[0]);write_com(0xc9);break; case 10:hh[1]+=1; if(hh[1]==60) hh[1]=0; write_sfm(0x0c,hh[1]);write_com(0xcc); break; default:break; } } } if(s4==0) {delay(5); if(s4==0) {while(!s4); switch(s2num) {case 1:ee[0]-=1; if(ee[0]==-1) ee[0]=23; write_nyr(0,ee[0]);write_com(0x80); break; case 2:ee[1]-=1; if(ee[1]==-1) ee[1]=59; write_nyr(3,ee[1]);write_com(0x83); break; case 3:ee[2]-=1; if(ee[2]==-1) ee[2]=59; write_nyr(6,ee[2]);write_com(0x86); break; case 4:ff[0]-=1; if(ff[0]==-1) ff[0]=23; write_sfm(0,ff[0]);write_com(0xc0);break; case 5:ff[1]-=1; if(ff[1]==-1) ff[1]=59; write_sfm(3,ff[1]);write_com(0xc3); break; case 6:ff[2]-=1; if(ff[2]==-1) ff[2]=59; write_sfm(6,ff[2]);write_com(0xc6); break; case 7:kk[0]-=1; if(kk[0]==-1) kk[0]=23; write_nyr(0x09,kk[0]);write_com(0x89); break; case 8:kk[1]-=1; if(kk[1]==-1) kk[1]=59; write_nyr(0x0c,kk[1]);write_com(0x8c); break; case 9:hh[0]-=1; if(hh[0]==-1) hh[0]=23; write_sfm(0x09,hh[0]);write_com(0xc9); break; case 10:hh[1]-=1; if(hh[1]==-1) hh[1]=59; write_sfm(0x0c,hh[1]);write_com(0xcc); break; default:break; } } }
}//s2num }//s1num if(s1num==3) { if(s2==0) {delay(5); if(s2==0) {s2num++; if(flag5==0) lcall3(); while(!s2); switch(s2num) { case 1: flag5=1;write_com(0xc0);write_com(0x0f);break; case 2: write_com(0xc3);break; case 3: write_com(0xc6);break; case 4: write_com(0xc9);break; case 5: write_com(0xcc);break; case 6: write_com(0xcf);break; case 7: s2num=0;flag5=0;write_com(0x0c);break; default: break; } } }
if(s2num!=0) { if(s3==0) {delay(5); if(s3==0) {while(!s3); switch(s2num) { case 1:gg[0]=fen+10;flag7=1;P0_1=0;P0_2=0;write_com(0x0c); break;
case 2:gg[1]=fen+20;flag8=1;P0_1=0; P0_2=0;write_com(0x0c); break;
case 3:gg[2]=fen+30;flag9=1;P0_1=0; P0_2=0;write_com(0x0c); break;
case 4:gg[3]=fen+40;flag10=1;P0_1=0;P0_2=0;write_com(0x0c); break;
case 5:gg[4]=fen+50;flag11=1;P0_1=0; P0_2=0;write_com(0x0c); break;
case 6:gg[5]=fen+60;flag11=1;P0_1=0; P0_2=0;write_com(0x0c); break; default:break; } } } } } } }
void dingshi(void) //定時處理 { if((shi==ee[0])&&(fen==ee[1])&&(miao==ee[2])&&(flag2==1)) { flag2=0;P0_1=0;beep=0;delay(1000);beep=1; P0_2=0; } if((shi==ff[0])&&(fen==ff[1])&&(miao==ff[2])&&(flag4==1)) { flag4=0;P0_1=1; beep=0;delay(1000);beep=1;P0_2=1; } if((shi==kk[0])&&(fen==kk[1])&&(flag2==0)&&(flag13==1)) { flag13=0;P0_1=0;beep=0;delay(1000);beep=1;P0_2=0; } if((shi==hh[0])&&(fen==hh[1])&&(flag4==0)&&(flag14==1)) { flag14=0;P0_1=1; beep=0;delay(1000);beep=1;P0_2=1; }
if((fen==gg[0])&&(flag7==1)) { flag7=0;P0_1=1;P0_2=1;beep=0;delay(1000);beep=1; } if((fen==gg[1])&&(flag8==1)) { flag8=0;P0_1=1;P0_2=1;beep=0;delay(1000);beep=1; } if((fen==gg[2])&&(flag9==1)) { flag9=0;P0_1=1;P0_2=1;beep=0;delay(1000);beep=1; } if((fen==gg[3])&&(flag10==1)) { flag10=0;P0_1=1;P0_2=1;beep=0;delay(1000);beep=1; } if((fen==gg[4])&&(flag11==1)) { flag11=0;P0_1=1;P0_2=1;beep=0;delay(1000);beep=1; } if((fen==gg[5])&&(flag12==1)) { flag12=0;P0_1=1;P0_2=1;beep=0;delay(1000);beep=1; } } void display(void) //顯示時間 { Read_nowtime(0x81,dd,7); miao=dd[0]-(dd[0]>>4)*6; fen=dd[1]-(dd[1]>>4)*6; shi=dd[2]-(dd[2]>>4)*6; ri=dd[3]-(dd[3]>>4)*6; yue=dd[4]-(dd[4]>>4)*6; zhou=dd[5]-(dd[5]>>4)*6; nian=dd[6]-(dd[6]>>4)*6; write_sfm(6,miao); write_sfm(3,fen); write_sfm(0,shi); write_nyr(2,nian); write_nyr(5,yue); write_nyr(8,ri); write_zhou(); } //紅外處理部分 voiddelay10us(unsigned int t) { while(t--); } /********************************************************/ void Time0(void) interrupt 1 { count_T++; if(inf_status==0&& count_T<160) { EX1=0; } elseif((inf_status==1||inf_status==2)&&count_T<12) { EX1=0; } else { EX1=1; } if(count_T>500) { inf_status=0; count_T=600; } } /**************************************************/ void int_1(void) interrupt 2 { beep=0; TR0=1; if(count_T>15&&count_T<250) { buf_CT=count_T; count_T=0; } delay10us(10); if(inf==0) { count_T=2; } if(buf_CT>15&&buf_CT<250) { if(inf_status==0) { if(buf_CT>210&&buf_CT<250) { inf_status=1; buf_key_code=0; key_bit_count=0; buf_CT=0; } } elseif(inf_status==1) { if((buf_CT>15&&buf_CT<25)||(buf_CT>32&&buf_CT<45)) { common_code_count++; if(common_code_count>=26) { inf_status=2; common_code_count=0; key_bit_count=0; buf_key_code=0; } } } elseif(inf_status==2) { if(buf_CT>15&&buf_CT<25) { buf_key_code>>=1; key_bit_count++; } elseif(buf_CT>32&&buf_CT<45) { buf_key_code>>=1; buf_key_code|=0x80; key_bit_count++; } if(key_bit_count>=8) { //led1=!led1; inf_status=0; key_bit_count=0; key=buf_key_code; buf_key_code=0; TR0=0; count_T=600; } } buf_CT=0; } beep=1; EX1=1; } void Red_Init(void) //紅外初始化 {
ET0=1; TMOD=0x02; TH0=0xCA; TL0=0xCA; IT1=1; EX1=1; TR0=0; EA=1; } // void Key_Handle(void) //紅外按鍵處理 {
switch(key) { case0x12: P0_1=~P0_1;P0_2=~P0_2;key=255;break; case 0x01: P0_1=0;P0_2=0;flag7=1;gg[0]=fen+10;key=255;break; case0x02: P0_1=0;P0_2=0;flag8=1;gg[1]=fen+20;key=255;break; case0x03: P0_1=0;P0_2=0;flag9=1;gg[2]=fen+30;key=255;break; case0x04: P0_1=0;P0_2=0;flag10=1;gg[3]=fen+40;key=255;break; case0x05: P0_1=0;P0_2=0;flag11=1;gg[4]=fen+50;key=255;break; case0x06: P0_1=0;P0_2=0;flag12=1;gg[5]=fen+60;key=255;break; default: key=255;break;
}key=255; } void sysinit() //系統(tǒng)初始化 { init(); Red_Init(); init_DS1302();
flag2=0; flag4=0; flag7=0; flag8=0; flag9=0; flag10=0; flag11=0; flag12=0; flag13=0; flag14=0; } void main() //主函數(shù) { sysinit(); //系統(tǒng)初始化 while(1) { EA=0; keyscan(); //按鍵掃描 if(flag==0) { display(); //顯示時間 } dingshi(); //定時處理 EA=1; Key_Handle(); //紅外處理 delay(50); } }
|