仿真及程序都在壓縮包里- #include<reg52.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit RS=P1^3;
- sbit R_W=P1^4;
- sbit E=P1^5;
- sbit wx=P2^6;
- sbit dx=P2^7;
- sbit O=P3^4;
- sbit L=P3^5;
- sbit R=P3^6;
- sbit S=P3^7;
- sbit beep=P2^2;
- uint n=2015;
- uchar num,w,s=6,f=0,m=0,q,p,y=5,d=5,cs,cf,t=0x58;
- char r=0;
- bit a;
- uchar code table[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
- uchar code table1[]={"Mon"};
- uchar code table2[]={"Tue"};
- uchar code table3[]={"Wed"};
- uchar code table4[]={"Thu"};
- uchar code table5[]={"Fri"};
- uchar code table6[]={"Sat"};
- uchar code table7[]={"Sun"};
- void lcdshow();
- void delay(uchar s)
- {
- uchar j,k;
- for(j=s;j>0;j--)
- for(k=114;k>0;k--);
- }
- void R_busy()
- {
- P0=0x00;
- RS=0;
- R_W=1;
- E=1;
- while(P0&0x80);
- E=0;
- }
- void W_cmd(uchar com)
- {
- R_busy();
- RS=0;
- R_W=0;
- P0=com;
- delay(2);
- E=1;
- delay(2);
- E=0;
- }
- void W_data(uchar date)
- {
- R_busy();
- RS=1;
- R_W=0;
- P0=date;
- delay(2);
- E=1;
- delay(2);
- E=0;
- }
- void init()
- {
- wx=0;
- dx=0;
- E=0;
- EA=1;
- ET0=1;
- TR0=1;
- TMOD=0x01;
- TH0=(65536-46080)/256;
- TL0=(65536-46080)%256;
- W_cmd(0x38);
- W_cmd(0x0c);
- W_cmd(0x06);
- W_cmd(0x01);
- }
- void week()
- {
- uchar m;
- w=((n/100)/4)-2*(n/100)+(n%100)+((n%100)/4)+((13*(y+1))/5)+d-1;
- W_cmd(0x80+0x0c);
- switch(w%7)
- {
- case 0:
- for(m=0;m<3;m++)
- {
- W_data(table7[m]);
- }
- break;
- case 1:
- for(m=0;m<3;m++)
- {
- W_data(table1[m]);
- }
- break;
- case 2:
- for(m=0;m<3;m++)
- {
- W_data(table2[m]);
- }
- break;
- case 3:
- for(m=0;m<3;m++)
- {
- W_data(table3[m]);
- }
- break;
- case 4:
- for(m=0;m<3;m++)
- {
- W_data(table4[m]);
- }
- break;
- case 5:
- for(m=0;m<3;m++)
- {
- W_data(table5[m]);
- }
- break;
- case 6:
- for(m=0;m<3;m++)
- {
- W_data(table6[m]);
- }
- break;
- default:
- break;
- }
- }
- void control_move()
- {
- switch(r)
- {
- case 0:
- W_cmd(0x80+0x01);
- break;
- case 1:
- W_cmd(0x80+0x02);
- break;
- case 2:
- W_cmd(0x80+0x03);
- break;
- case 3:
- W_cmd(0x80+0x04);
- break;
- case 4:
- W_cmd(0x80+0x06);
- break;
- case 5:
- W_cmd(0x80+0x07);
- break;
- case 6:
- W_cmd(0x80+0x09);
- break;
- case 7:
- W_cmd(0x80+0x0a);
- break;
- case 8:
- W_cmd(0x80+0x44);
- break;
- case 9:
- W_cmd(0x80+0x45);
- break;
- case 10:
- W_cmd(0x80+0x47);
- break;
- case 11:
- W_cmd(0x80+0x48);
- break;
- case 12:
- W_cmd(0x80+0x4a);
- break;
- case 13:
- W_cmd(0x80+0x4b);
- break;
- case 14:
- W_cmd(0x80+0x4e);
- break;
- case 16:
- W_cmd(0x80+0x11);
- W_data(table[cs/10]);
- W_cmd(0x80+0x11);
- break;
- case 17:
- W_cmd(0x80+0x12);
- W_data(table[cs%10]);
- W_cmd(0x80+0x12);
- break;
- case 18:
- W_cmd(0x80+0x14);
- W_data(table[cf/10]);
- W_cmd(0x80+0x14);
- break;
- case 19:
- W_cmd(0x80+0x15);
- W_data(table[cf%10]);
- W_cmd(0x80+0x15);
- break;
- case 20:
- W_cmd(0x80+0x17);
- break;
- case 21:
- W_cmd(0x80+0x19);
- break;
- default:
- if(r>20)
- W_cmd(0x80+0x11);
- if(r<16)
- W_cmd(0x80+0x01);
- break;
- }
- }
- void leap()
- {
- switch(y)
- {
- case 2:
- if(n%4==0&&n%100!=0||n%400==0)
- {
- if(d>29)
- d=1;
- y++;
- }
- else
- {
- if(d>28)
- d=1;
- y++;
- }
- break;
- case 4:
- if(d>30)
- {
- d=1;
- y++;
- }
- break;
- case 6:
- if(d>30)
- {
- d=1;
- y++;
- }
- break;
- case 9:
- if(d>30)
- {
- d=1;
- y++;
- }
- break;
- case 11:
- if(d>30)
- {
- d=1;
- y++;
- }
- break;
- default:
- if(d>31)
- {
- d=1;
- y++;
- }
- break;
- }
- }
- void lcdshow()
- {
- W_cmd(0x80);
- W_data(0x20);
- W_data(table[n/1000]);
- W_data(table[(n/100)%10]);
- W_data(table[(n/10)%10]);
- W_data(table[n%10]);
- W_data(0x2f);
- W_data(table[y/10]);
- W_data(table[y%10]);
- W_data(0x2f);
- W_data(table[d/10]);
- W_data(table[d%10]);
- W_cmd(0x80+0x44);
- W_data(table[s/10]);
- W_data(table[s%10]);
- W_data(0x3a);
- W_data(table[f/10]);
- W_data(table[f%10]);
- W_data(0x3a);
- W_data(table[m/10]);
- W_data(table[m%10]);
- W_cmd(0x80+0x11);
- W_data(table[cs/10]);
- W_data(table[cs%10]);
- W_data(0x3a);
- W_data(table[cf/10]);
- W_data(table[cf%10]);
- W_cmd(0x80+0x17);
- W_data(t);
- W_cmd(0x80+0x19);
- W_data(0x3c);
- week();
- beep=1;
- }
- void control_set()
- {
- uchar c;
- switch(r)
- {
- case 0:
- n=n+1000;
- if(n>9999)
- n=0;
- lcdshow();
- W_cmd(0x80+0x01);
- break;
- case 1:
- n=n+100;
- if(n>9999)
- n=0;
- lcdshow();
- W_cmd(0x80+0x02);
- break;
- case 2:
- n=n+10;
- if(n>9999)
- n=0;
- lcdshow();
- W_cmd(0x80+0x03);
- break;
- case 3:
- n=n+1;
- if(n>9999)
- n=0;
- lcdshow();
- W_cmd(0x80+0x04);
- break;
- case 4:
- y=y+10;
- if(y>12)
- {
- y=1;
- }
- lcdshow();
- W_cmd(0x80+0x06);
- break;
- case 5:
- y=y+1;
- if(y>12)
- {
- y=1;
- }
- lcdshow();
- W_cmd(0x80+0x07);
- break;
- case 6:
- d=d+10;
- leap();
- lcdshow();
- W_cmd(0x80+0x09);
- break;
- case 7:
- d=d+1;
- leap();
- lcdshow();
- W_cmd(0x80+0x0a);
- break;
- case 8:
- s=s+10;
- if(s>23)
- s=0;
- lcdshow();
- W_cmd(0x80+0x44);
- break;
- case 9:
- s=s+1;
- if(s>23)
- s=0;
- lcdshow();
- W_cmd(0x80+0x45);
- break;
- case 10:
- f=f+10;
- if(f>59)
- f=0;
- lcdshow();
- W_cmd(0x80+0x47);
- break;
- case 11:
- f=f+1;
- if(f>59)
- f=0;
- lcdshow();
- W_cmd(0x80+0x48);
- break;
- case 12:
- m=m+10;
- if(m>59)
- m=0;
- lcdshow();
- W_cmd(0x80+0x4a);
- break;
- case 13:
- m=m+1;
- if(m>59)
- m=0;
- lcdshow();
- W_cmd(0x80+0x4b);
- break;
- case 14:
- for(c=0;c<16;c++)
- {
- W_cmd(0x18);
- delay(150);
- }
- r=16;
- W_cmd(0x80+0x11);
- break;
- case 16:
- cs=cs+10;
- if(cs>23)
- cs=0;
- W_cmd(0x80+0x11);
- W_data(table[cs/10]);
- W_data(table[cs%10]);
- W_cmd(0x80+0x11);
- break;
- case 17:
- cs=cs+1;
- if(cs>23)
- cs=0;
- W_cmd(0x80+0x11);
- W_data(table[cs/10]);
- W_data(table[cs%10]);
- W_cmd(0x80+0x12);
- break;
- case 18:
- cf=cf+10;
- if(cf>59)
- cf=0;
- W_data(table[cf/10]);
- W_data(table[cf%10]);
- W_cmd(0x80+0x14);
- break;
- case 19:
- cf=cf+1;
- if(cf>59)
- cf=0;
- W_cmd(0x80+0x14);
- W_data(table[cf/10]);
- W_data(table[cf%10]);
- W_cmd(0x80+0x15);
- break;
- case 20:
- a=~a;
- if(a==1)
- t=0x4f;
- else
- t=0x58;
- W_cmd(0x80+0x17);
- W_data(t);
- W_cmd(0x80+0x17);
- break;
- case 21:
- for(c=0;c<16;c++)
- {
- W_cmd(0x1c);
- delay(150);
- }
- W_cmd(0x80+0x01);
- r=0;
- break;
- }
- }
- void control()
- {
- if(O==0)
- {
- delay(10);
- if(O==0)
- {
- while(!O);
- TR0=0;
- W_cmd(0x0f);
- W_cmd(0x80+0x4e);
- W_data(0x43);
- W_cmd(0x80+0x01);
- while(1)
- {
- if(O==0)
- {
- delay(10);
- if(O==0)
- {
- while(!O);
- TR0=1;
- r=0;
- init();
- break;
- }
- }
- if(L==0)
- {
- delay(10);
- if(L==0)
- {
- while(!L);
- r--;
- if(r<0)
- {
- r=14;
- W_cmd(0x80+0x4b);
- }
- if(r>14&&r<16)
- {
- r=21;
- W_cmd(0x80+0x15);
- }
- control_move();
- }
- }
- if(R==0)
- {
- delay(10);
- if(R==0)
- {
- while(!R);
- r++;
- if(r>14)
- {
- if(r<16)
- {
- r=0;
- W_cmd(0x80+0x01);
- }
- if(r>21)
- {
- r=16;
- W_cmd(0x80+0x11);
- }
- }
- control_move();
- }
- }
- if(S==0)
- {
- delay(10);
- if(S==0)
- {
- while(!S);
- control_set();
- }
- }
- }
- lcdshow();
- }
- }
- }
- void count()
- {
- if(num==20)
- {
- m++;
- if(a==1)
- {
- if(cs==s)
- {
- if(cf==f)
- {
- beep=~beep;
- }
- }
- }
- num=0;
- if(m==60)
- {
- f++;
- m=0;
- if(f==60)
- {
- beep=0;
- s++;
- f=0;
- if(s==24)
- {
- s=0;
- d++;
- leap();
- if(y>12)
- {
- y=1;
- n++;
- if(n>9999)
- n=0;
- }
- }
- }
- }
- lcdshow();
- }
- }
- void main()
- {
- init();
- lcdshow();
- while(1)
- {
- count();
- control();
- }
- }
- void Timer()interrupt 1
- {
- TH0=(65536-46080)/256;
- TL0=(65536-46080)%256;
- num++;
- }
復制代碼
|