for(y=0;y<110;y++);
}
/*******************蜂鸣器子程序****************************/
voidbeng()
{
bear=~bear;
delay(10);
bear=1;
}
/**********************显示时钟子函数***************************/
voiddisplay(ucharw[32])
{unsignedinti,j,c=0;
if(a==0)//正常时间显示
{for(i=0;i<8;i++)//依次将数组w中八个数取出,并显示
{P2=weikong_code[i];//位选
j=w[i];//取出要显示的数码
P0=tab[j];//取出段选编码
delay
(1);//显示延时
P0=0xff;
}}
if(a==1)//闹钟调整显示
{for(i=8;i<16;i++)
{if(c==8)c=0;
P2=weikong_code[c];
c++;
j=w[i];
P0=tab[j];
delay
(1);
P0=0xff;
}}
if(a==2)//日期调整显示
{for(i=16;i<24;i++)//取w内容显示
{if(c==8)c=0;//控制位选1
P2=weikong_code[c];//控制位选2
c++;//控制位选3
j=w[i];//取w内容
P0=tab[j];//取w内容查表
delay
(1);
P0=0xff;
}}
if(a==3)//星期调整显示
{for(i=24;i<32;i++)
{if(c==8)c=0;
P2=weikong_code[c];
c++;
j=w[i];
P0=tab[j];
delay
(1);
P0=0xff;
}}
}
/***********************显示时钟数组子程序***********************/
voidxianshishuzu()
{StrTab[1]=second/10;//秒十位
StrTab[0]=second%10;//秒个位
StrTab[2]=10;//间隔符-
StrTab[4]=minute/10;//分十位
StrTab[3]=minute%10;//分个位
StrTab[5]=10;//间隔符-
StrTab[7]=hour/10;//时十位
StrTab[6]=hour%10;//时个位
}
/********************************定时闹钟****************/
voidalarm()
{chark;
if((hour==hour1)&(minute==minute1)&(k))
{if(P3!
=0XFF)
{k=0;}
beng();
display(StrTab);
}
if((hour==hour1)&(minute!
=minute1))
{k=1;}
StrTab[9]=10;//闹钟秒个位
StrTab[8]=10;//秒十位
StrTab[10]=10;//间隔符-
StrTab[12]=minute1/10;//分个位
StrTab[11]=minute1%10;//分十位
StrTab[13]=10;//间隔符-
StrTab[15]=hour1/10;//时个位
StrTab[14]=hour1%10;//时十位
display(StrTab);
}
voiddata1()//年日期显示
{
StrTab[17]=day/10;//闹钟秒个位
StrTab[16]=day%10;//秒十位9
StrTab[18]=month%10;//间隔符-
StrTab[20]=year%10;//分个位
StrTab[19]=month/10;//分十位
StrTab[21]=(year/10)%10;//间隔符-
StrTab[23]=year/1000;//时个位
StrTab[22]=(year/100)%10;//时十位
display(StrTab);
}
voidweek1()//星期显示
{
StrTab[25]=10;//闹钟秒个位
StrTab[24]=10;//秒十位9
StrTab[26]=10;//间隔符-
StrTab[28]=week/10;//分个位
StrTab[27]=week%10;//分十位
StrTab[29]=10;//间隔符-
StrTab[31]=10;//时个位
StrTab[30]=10;//时十位
display(StrTab);
}
voidgodata()
{
if((hour==0)&(minute==0)&(second==0))
{day++;//日期格式走
if((month==2)|(month==4)|(month==6)|(month==9)|(month==11))//2,4,6,9,11数月30天)//其他偶数月
{if(month==2)//对二月的特殊判断
{if((year%4==0)&(year/100!
=0)|(year/400==0))//判断是闰年
{if(day==30);//闰年29天
{day=1;month++;
if(month==13)
{month=1;year++;
if(year==10000)
year=0;}}}
elseif(day==29)//平年28天
{day=1;month++;
if(month==13)
{month=1;year++;
if(year==10000)
year=0;}}
}
elseif(day==31)//其他月30天
{day=1;month++;
if(month==13)
{month=1;year++;
if(year==10000)
year=0;}}
}
else
if(day==32)//其他其他月31天
{day=1;month++;
if(month==13)
{month=1;year++;
if(year==10000)
year=0;}}
week++;//星期走
if(week==8)
week=1;
data1();
week1();
while(second==0);
}
}
/**********************键盘扫描子程序*************************/
voidkeycan()
{
if(KEY1==0)//按一次,正常显示,按第二次,时调整,按第三次,分调这整,
{delay(10);//按键1去抖以及动作
if(KEY1==0)//确认按键是否按下
{flag++;}//切换标志
if(flag==10)
flag=0;
a=0;
if((flag==4)|(flag==5))
a=1;
if((flag==6)|(flag==7)|(flag==8))
a=2;
if(flag==9)
a=3;
while(!
KEY1);}//释放按键
}
voidtiao()
{
while(flag==1)
{if(KEY2==0)
{delay(10);
if(KEY2==0)
{hour++;if(hour==24)hour=0;}//正常时间小时加1
while(!
KEY2)display(StrTab);}
if(KEY3==0)
{delay(10);
if(KEY3==0)
{hour--;if(hour==-1)hour=23;}//正常时间小时减1
while(!
KEY3)display(StrTab);
}display(StrTab);keycan();}
while(flag==2)
{if(KEY2==0)//按键去抖以及动作
{delay(10);
if(KEY2==0)
{minute++;if(minute==60)minute=0;}//分加1
while(!
KEY2)display(StrTab);}
if(KEY3==0)
{delay(10);
if(KEY3==0)
{minute--;if(minute==-1)minute=59;}
while(!
KEY3)display(StrTab);
}display(StrTab);keycan();
}
while(flag==3)//秒表的加1
{if(KEY3==0)
{delay(10);
if(KEY3==0)
second=0;
while(!
KEY3)display(StrTab);}
if(KEY2==0)
{delay(10);
if(KEY2==0)
second=0;
while(!
KEY2)display(StrTab);
}display(StrTab);keycan();
}
while(flag==4)//闹钟
{if(KEY2==0)
{delay(10);
if(KEY2==0)
{hour1++;if(hour1==25)hour1=0;}//闹钟时间小时加1
while(!
KEY2)alarm();}
if(KEY3==0)
{delay(10);
if(KEY3==0)
{hour1--;if(hour1==-1)hour1=24;}//闹钟时间小时减
while(!
KEY3)alarm();
}alarm();keycan();}
while(flag==5)
{if(KEY2==0)//按键去抖以及动作
{delay(10);
if(KEY2==0)
{minute1++;if(minute1==60)minute1=0;}//闹钟分加1
while(!
KEY2)alarm();}
if(KEY3==0)//按键去抖以及动作
{delay(10);
if(KEY3==0)
{minute1--;if(minute1==-1)minute1=59;}//闹钟分减1
while(!
KEY3)alarm();}alarm();keycan();}
while(flag==6)//调整年
{if(KEY2==0)//按键去抖以及动作
{delay(10);
if(KEY2==0)
{year++;if(year==10000)year=0;}//闹钟分加1
while(!
KEY2)data1();}
if(KEY3==0)//按键去抖以及动作
{delay(10);
if(KEY3==0)
{year--;if(year==-1)year=9999;}//闹钟分减1
while(!
KEY3)data1();}data1();keycan();}
while(flag==7)//调整月只加
{if(KEY2==0)//按键去抖以及动作
{delay(10);
if(KEY2==0)
{month++;if(month==13)month=1;}//闹钟分加1
while(!
KEY2)data1();}
data1();keycan();}
while(flag==8)//调整日只加
{
if(KEY2==0)//按键去抖以及动作
{delay(10);
if(KEY2==0)
{day++;
if((month==2)|(month==4)|(month==6)|(month==9)|(month==11))//2,4,6,9,11数月30天)//其他偶数月
{if(month==2)//对二月的特殊判断
{if((year%4==0)&(year%100!
=0)|(year%400==0))//判断是闰年
{if(day==30)//闰年29天
day=1;}
elseif(day==29)//平年28天
day=1;}
elseif(day==31)//其他月30天
day=1;}
elseif(day==32)//其他其他月31天
day=1;
}
while(!
KEY2)data1();}//日期加加
data1();keycan();}
while(flag==9)//调整星期只加
{if(KEY2==0)//按键去抖以及动作
{delay(10);
if(KEY2==0)
{week++;if(week==8)week=1;}
while(!
KEY2)week1();}
week1();keycan();}
}
/*****************整点报警子程序***************************/
voidzhengdian(void)
{chari;
if((minute==0)&(second==0))//整点报时
{if((hour<=23)&(hour>=7))
{for(i=0;i{beng();
delay(1000);
display(StrTab);}
}
else
{beng();
godata();
delay(3000);}
}
}
/**************************中断子程序*********************************/
voidtime_()interrupt1//中断程序
{count++;
TH0=(65536-50000)/256;//0.5ms重新送初值
TL0=(65536-50000)%256;
if(count==20)//定时器计数,定时50ms,count满20,秒加1
{second++;
count=0;
if(second==60)//秒值等于60,秒清零,分加1
{second=0;minute++;
if(minute==60)//分值等于60,分清零,时加1
{minute=0;
hour++;
if(hour==24)//时值等于24,时清零,返回,全部归零
{hour=0;}}}}
xianshishuzu();
}
/***********************主函数***************************/
voidmain()
{P3=0XFF;TMOD=0x01;//time0为定时器,方式1
TH0=(65536-50000)/256;//预置计数初值,50ms
TL0=(65536-50000)%256;
EA=1;//总中断开
ET0=1;//允许定时器0中断
TR0=1;//开启定时器0
bear=1;
while
(1)//主循环
{
display(StrTab);
zhengdian();
alarm();
keycan();
tiao();
if((second%8==1)&(flag==0))
{w++;
if(w==36)
w=0;
while((second%8==1)&(flag==0))
{display(StrTab);alarm();keycan();tiao();}
}
P1=pp[w];
if(flag==0)
{if(second==11)
a=2;
if(second==15)
a=3;
if(second==19)
a=0;
}
}}