#include<reg52.h>
sbit a0=P1^0;
sbit a1=P1^1;
sbit a2=P1^2;
sbit a3=P1^3;
sbit a4=P3^6;
sbit a5=P3^1;
static char JP[10]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb};
static char Lie[4]={0xef,0xdf,0xbf,0x7f};
char LEDXS[8];
static char LEDWEI[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
static char LED[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char hour,minute,second;
unsigned int C100us; //100us計數單元
unsigned int M,H,key,J=1,K=1,KK=1,MO,DA,YE,M1=61,H1=25,M2=61,H2=25;
//////////////////////////////////////////////////////////////////////////
void wait(unsigned int i) //延時函數
{unsigned int j;
for(j=0;j<i;j++);
}
////////////////////////////////////////////////////
anniu() //按鈕函數
{key++;
wait(2000);
}
////////////////////////////////////////////////////
void displayled(void) //顯示函數
{unsigned char i;
for(i=0;i<8;i++)
{P0=LEDXS[ i];
P2=LEDWEI[ i];
wait(100);
}
}
////////////////////////////////////////////////////
void date(void) //日期函數
{unsigned int s;
LEDXS[0]=LED[2];
LEDXS[1]=LED[0];
LEDXS[2]=LED[0];
LEDXS[3]=(LED[YE]-0x80);
LEDXS[4]=LED[MO/10];
LEDXS[5]=(LED[MO%10]-0x80);
LEDXS[6]=LED[DA/10];
LEDXS[7]=LED[DA%10];
s=10;
while(s)
{s--;
displayled();
}
}
////////////////////////////////////////////////////
void LEDTS(void) //調時函數
{unsigned int q=0,a,b,c,w,s,x,y;
if((a1==0)&&(key==1)){q=1;}
if((q==1)&&(key!=3))
{M++;
if(M==60){M=0;H++;}
if(H==24){H=0;}
}
if((a2==0)&&(key==1)){x=1;}
if((x==1)&&(key!=3))
{M--;
if(M==0){M=59;}
}
if((a1==0)&&(key==2)){w=1;}
if((w==1)&&(key!=3))
{H++;
if(H==24){H=0;}
}
if((a2==0)&&(key==2)){y=1;}
if((y==1)&&(key!=3))
{H--;
if(H==0){H=23;}
if(a4==0){key=1;}
}
if(a1==1){q=0;w=0;}
if(a2==1){x=0;y=0;}
LEDXS[0]=LED[H/10];
LEDXS[1]=LED[H%10];
LEDXS[2]=0xbf;
LEDXS[3]=LED[M/10];
LEDXS[4]=LED[M%10];
LEDXS[5]=0xbf;
LEDXS[6]=LED[0];
LEDXS[7]=LED[0];
if(key==5){a=1;}
while(a)
{date();
if(a1==0){DA++;if(DA==32){DA=0;}}
if(a2==0){DA--;if(DA==0){DA=31;}}
if(key!=5){a=0;}
if(a0==0){anniu();}
}
if(key==6){b=1;}
while(b)
{date();
if(a1==0){MO++;if(MO==13){MO=0;}}
if(a2==0){MO--;if(MO==0){MO=12;}}
if(key!=6){b=0;}
if(a0==0){anniu();}}
if(key==7){c=1;}
while(c)
{date();
if(a1==0){YE++;if(YE==10){YE=0;}}
if(a2==0){YE--;if(YE==0){YE=9;}}
if(key!=7){c=0;}
if(a0==0){anniu();}}
s=10;
while(s)
{s--;
displayled();
}
K=1;
J=1;
}
////////////////////////////////////////////////////////////
void T0Int(void) interrupt 1 using 0 //T0中斷服務函數
{C100us--;
if(C100us==0) //100us計數器為0,重置計數器
{C100us=20000;
wait(140);
second++;
if(second==60){second=0;minute++;}
if(minute==60){minute=0;hour++;}
if(hour==24){hour=0;DA++;}
if(DA==30){MO++;DA=0;}
if(MO==12){YE++;MO=0;}}}
//////////////////////////////////////////////////////////////
void main(void) //主函數
{unsigned int p,q,w;
TMOD=0X02; //設置T0工作方式與初值
TH0=0xd2;
TL0=0x00;
IE=0X82; //開中斷
hour=0;
minute=0;
second=0;
w=0;
YE=6;
MO=5;
DA=7;
C100us=20000;
TR0=1; //啟動定時器
P3=0xff;
while(1)
{LEDXS[0]=LED[hour/10];
LEDXS[1]=LED[hour%10];
LEDXS[2]=0xbf;
LEDXS[3]=LED[minute/10];
LEDXS[4]=LED[minute%10];
LEDXS[5]=0xbf;
LEDXS[6]=LED[second/10];
LEDXS[7]=LED[second%10];
displayled();
if(a0==0){p=1;}
while(p)
{LEDTS(); //調入調時函數
if(a0==0){anniu();}
if(key==3)
{if(a1==0){minute=M;hour=H;second=0;K=0;KK=0;} //調節時鐘時間
{if(a3==0){M2=M;H2=H;J=0;}
if(J==1)
{if(a3==1){M1=M;H1=H;}}} //調節鬧鐘時間
if(minute==M){M1=0;H1=0;M2=0;H2=0;}
if(a2==0){p=0;key=0;goto hat;}
}
hat: if(key==4){q=1;} //顯示年月日
while(q)
{date();
if(a0==0){anniu();}
if(key>4){q=0;}
}
if(key>7){p=0;}
}
w++;
if(w==100){key=0;w=0;}
if(K==1)
{if((minute==M1)&&(hour==H1))
{a5=0;a4=1;}} //達到鬧鈴時間響鈴
if(KK==1){if((minute==M2)&&(hour==H2))
{a5=0;a4=1;}}
if(a1==0){a5=1;a4=0;if(minute==M1){K=0;}if(minute==M2){KK=0;}}
if((minute>=(M1+1))&&(minute!=M2))
{a5=1;a4=0;K=1;if(a5==1){M=minute;H=hour;}} //過一分鐘后停
if((minute>=(M2+1))&&(minute!=M1))
{a5=1;a4=0;KK=1;if(a5==1){M=minute;H=hour;}}
if(a3==0) //顯示鬧鐘時間
{anniu();if(key==1)
{
LEDXS[0]=LED[H1/10];
LEDXS[1]=LED[H1%10];
LEDXS[2]=0xbf;
LEDXS[3]=LED[M1/10];
LEDXS[4]=LED[M1%10];
LEDXS[5]=0xbf;
LEDXS[6]=LED[0];
LEDXS[7]=LED[0];
while(1)
{if(a3==1){key=2;goto aa;}
displayled();}}
aa: if(key==2)
{
LEDXS[0]=LED[H2/10];
LEDXS[1]=LED[H2%10];
LEDXS[2]=0xbf;
LEDXS[3]=LED[M2/10];
LEDXS[4]=LED[M2%10];
LEDXS[5]=0xbf;
LEDXS[6]=LED[0];
LEDXS[7]=LED[0];
while(1)
{if(a3==0){key=3;goto aa;}
displayled();}key=0;}
}
}
} |