#include
#define uchar unsigned char
#define uint unsigned int
int as[8]={0,0,10,0,0,10,1,0}; //默认时间
int aa[8]={0,0,10,0,0,10,0,0}; //闹钟
int ad[8]={0,0,10,0,0,10,0,0}; //秒表
int af[8]={3,2,2,1,1,1,0,2,}; //日期
int ss[8]={0,0,10,0,0,10,0,0};//设置
int a=0,b=0,c=0,s=0;
uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};
uchar cho[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
sbit k1=P1^0; //加
sbit k2=P1^1; // 减
sbit k3=P1^2; //设置时间
sbit k4=P1^3; //设置闹钟
sbit k5=P1^4; //左
sbit k6=P1^5; //右
sbit k7=P1^6; //确定/开启
sbit k8=P1^7; //暂停
sbit q1=P3^0; //喇叭
sbit q2=P3^1; //喇叭
sbit q3=P3^2; //退出日期显示
sbit q4=P3^3; //日期显示
sbit q7=P3^6; //秒表
sbit q8=P3^7; //退出秒表
void delay(uint x)
{
while(x--) ; //延时 2x+4us
}
void xian()//正常显示时间
{
uint i;
for(i=0;i<8;i++)
{
P2=cho[i];
P0=table[as[i]];
delay(100);
}
}
void she()//设置
{
int i=7,j,k=0;
while(1)
{
for(j=0;j<8;j++)
{
P2=cho[j];
if(j==i) P0=table[11]; //控制闪烁(暗)
else P0=table[ss[j]];
delay(200);
}
delay(400);
if(k5==0)//左
{i++;if(i==8)i=0;if(i==2)i=3;if(i==5)i=6;while(k5==0);}
if(k6==0)//右
{i--;if(i==-1)i=7;if(i==2)i=1;if(i==5)i=4;while(k6==0);}
if(k1==0)//加
{k++;if((i==0||i==3||i==6)&&k==10) k=0;if(i==7&&k==3) k=0; if((i==1||i==4)&&k>5)
k=0;ss[i]=k;while(k1==0);}
if(k2==0)//减
{k--;if((i==0||i==3||i==6)&&k==-1) k=9;if(i==7&&k==-1)k=2;
if((i==1||i==4)&&k==-1) k=5;ss[i]=k;while(k2==0);}
P2=cho[i];
P0=table[ss[i]]; //控制闪烁(亮)
if(ss[7]==2&&ss[6]>4) { ss[6]=ss[6]-4;ss[7]=0;}
if(ss[6]==0&&ss[7]==0) {ss[6]=1;ss[7]=0;}
if(k7==0)break;//确定
delay(40);
}
}
void riqi() //日期显示
{
int i1,i=7,j,k=0;
ss[0]=3;ss[1]=2;ss[2]=2;ss[3]=1;
ss[4]=1;ss[5]=1;ss[6]=0;ss[7]=2;//默认日期为 2011 12 23
while(1)
{
if(c==2)
{ af[0]=10;af[1]=10;af[6]=10;af[7]=10;
af[5]=ss[7]; af[4]=ss[6]; af[3]=ss[5]; af[2]=ss[4]; }
if(c==1)
{ af[4]=10;af[5]=ss[2];af[6]=ss[3];af[7]=10;
af[0]=10; af[1]=10; af[2]=ss[0]; af[3]=ss[1]; }
if(q4==0) {c++;if(c==3) c=1;while(q4==0);}//选择显示
for(i1=0;i1<8;i1++) //显示
{
P2=cho[i1];
P0=table[af[i1]];
delay(100);
}
if(q3==0) {c=0;break;}//退出
if(k4==0) //设置日期
{
while(1)
{
for(j=0;j<8;j++)
{
P2=cho[j];
if(j==i) P0=table[11]; //控制闪烁(暗)
else P0=table[ss[j]];
delay(200);
}
delay(400);
if(k5==0)//左
{i++;if(i==8)i=0;while(k5==0);}
if(k6==0)//右
{i--;if(i==-1)i=7;while(k6==0);}
if(k1==0)//加
{k++;if(k==10) k=1;ss[i]=k;while(k1==0);}
if(k2==0)//减
{k--;if(k==-1) k=9;ss[i]=k;while(k2==0);}
P2=cho[i];
P0=table[ss[i]]; //控制闪烁(亮)
if(k7==0)break;//确定
delay(40);
}
}
}
}
void miao()//秒表
{
uint i;
while(1)
{
for(i=0;i<8;i++)//显示秒表
{
P2=cho[i];
P0=table[ad[i]];
delay(80);
}
delay(100);
if(k8==0)//暂停/开启
{TR1=!TR1;while(k8==0);}
if(q8==0)//退出秒表
{TR1=0;ad[0]=0;ad[1]=0;ad[3]=0;ad[4]=0;ad[6]=0;ad[7]=0;break;}
}
}
void main()
{
TMOD=0x01;
TH0=0x3c;TH1=0xd8;
TL0=0xb0;TL1=0xef;
EA=1; ET0=1;ET1=1;
TR0=1;TR1=0;
while(1)
{
xian();
if(k3==0)//设置时间
{TR0=0;
she();
as[0]=ss[0];as[1]=ss[1];as[3]=ss[3];as[4]=ss[4];as[6]=ss[6];as[7]=ss[7];
TR0=1;}
if(k4==0)//设置闹钟
{TR0=0;
she();
aa[0]=ss[0];aa[1]=ss[1];aa[3]=ss[3];aa[4]=ss[4];aa[6]=ss[6];aa[7]=ss[7];
TR0=1;}
if(k8==0)//暂停/开启
{TR0=!TR0;while(k8==0);}
if(as[0]==aa[0]&&as[1]==aa[1]&&as[3]==aa[3]&&as[4]==aa[4]&&as[6]==aa[6]&&as[7]=
=aa[7])
{s=1;aa[0]=aa[0]+5;if(aa[0]>9)aa[0]=aa[0]-10;} //定时闹钟,铃声响
if(s) {q1=!q1;q2=!q2;if(as[0]==aa[0]) s=0;}
if(q7==0)//开启秒表
miao();
if(q4==0) c=1;//开启日期显示
if(c) riqi();
}
}
void time0_int(void) interrupt 1 //正常时间
{
TH0=0x3c;TL0=0xb0;
a++;
if(a==20) {a=0;as[0]++;} //1秒
if(as[0]==10) {as[0]=0;as[1]++;}
if(as[1]==6) {as[1]=0;as[3]++;}
if(as[3]==10) {as[3]=0;as[4]++;}
if(as[4]==6) {as[4]=0;as[6]++;}
if(as[6]==10) {as[6]=0;as[7]++;}
if(as[7]==2&&as[6]==5) {as[6]=1;as[7]=0;af[0]++;}
if(af[0]==10) {af[0]=0;af[1]++;}
if(af[1]==3&&af[0]==2) {af[1]=0;af[0]=1;af[2]++;}
if(af[2]==10) {af[2]=0;af[3]++;}
if(af[3]==1&&af[2]==3) {af[2]=1;af[3]=0;af[4]++;}
}
void time1_int(void) interrupt 3 //秒表时间
{
TH1=0xd8;TL1=0xef;
b++;
if(b==10) {b=0;ad[0]++;} //1/100秒
if(ad[0]==10) {ad[0]=0;ad[1]++;}
if(ad[1]==10) {ad[1]=0;ad[3]++;}
if(ad[3]==10) {ad[3]=0;ad[4]++;}
if(ad[4]==6) {ad[4]=0;ad[6]++;}
if(ad[6]==10) {ad[6]=0;ad[7]++;}
if(ad[7]==6) {ad[7]=0;}
}