某單片機+ds1302+MAX7219組成的16位數碼管萬年歷,其按鍵程序如下:
uc code dxy[]={0,1,2,1,0,1,0,1,1,0,1,0,1};//定義大小月的數組
/*****按鍵函數*****/
void key()
{
ui out_set=0,clear_0=0;
out_clear=0;
if(s1==0) //設置鍵
{
delay(5);
if(s1==0)
{
while((s1==0)&&(set!=0))
{
display();
out_set++;
if(out_set==300)
{
set=0;
out_set=0;
tt=0;
fmq=0;
delay(20);
fmq=1;
delay(100);
fmq=0;
delay(20);
fmq=1;
goto x;
}
}
set++;
if(set<8)
{
out_set=0;
fmq=0;
delay(10);
fmq=1;
}
else
{
set=0;
tt=1;
fmq=0;
delay(200);
fmq=1;
}
x: while(!s1)
{
display();
sec_led();
}
}
}
if(set!=0)
{
if(s2==0)
{
delay(5);
if(s2==0)
{
fmq=0;
delay(10);
fmq=1;
if(set==1)
{
year++;
if(year==100)
year=0;
if((dxy[mon]==2)&&(year%4!=0)&&(day>28)==1)//當平年二月day大于28時 此句何用?
day=28;//此句何用?
}
if(set==2)
{
mon++;
if(mon==13)
mon=1;
if((dxy[mon]==0)&&(day>30)==1) //當小月day大于30時//此句何用?
day=30;//此句何用?
if((dxy[mon]==2)&&(year%4==0)&&(day>28)==1)//當平年二月day大于28時//此句何用?
day=28;//此句何用?
if((dxy[mon]==2)&&(year%4!=0)&&(day>29)==1)//當閏年二月day大于29時//此句何用?
day=29;//此句何用?
}
if(set==3)
{
day++;
if((dxy[mon]==0)&&(day==31)==1) //當小月day被加到了31時
day=1;
if((dxy[mon]==1)&&(day==32)==1) //當大月day被加到32時
day=1;
if((dxy[mon]==2)&&(year%4==0)&&(day==29)==1) //當平年二月day被加到29時//year%4==0不是平年 一錯
day=1;//二錯
if((dxy[mon]==2)&&(year%4!=0)&&(day==30)==1) //當閏年二月day被加到30時//year%4!=0不是閏年 三錯
day=1;//四錯
}
if(set==4)
{
hour++;
if(hour==24)
hour=0;
}
if(set==5)
{
min++;
if(min==60)
min=0;
}
if(set==6)
{
xq++;
if(xq==8)
xq=1;
}
if(set==7)
{
bs=~bs;
}
while(!s2)
{display();}
}
}
if(s3==0)
{
delay(5);
if(s3==0)
{
fmq=0;
delay(10);
fmq=1;
if(set==1)
{
year--;
if(year==(-1))
year=99;
if((dxy[mon]==2)&&(year%4==0)&&(day>28)==1)//無用
day=28;//無用
}
if(set==2)
{
mon--;
if(mon==0)
mon=12;
if((dxy[mon]==0)&&(day>30)==1)//何用?
day=30;//
if((dxy[mon]==2)&&(year%4==0)&&(day>28)==1)//判斷錯誤且無用
day=28;//
if((dxy[mon]==2)&&(year%4!=0)&&(day>29)==1)//判斷錯誤且無用
day=29;//
}
if(set==3)
{
day--;
if((dxy[mon]==0)&&(day==0)==1)
day=30;
if((dxy[mon]==1)&&(day==0)==1)
day=31;
if((dxy[mon]==2)&&(year%4==0)&&(day==0)==1)//判斷錯誤
day=28;
if((dxy[mon]==2)&&(year%4!=0)&&(day==0)==1)//判斷錯誤
day=29;
}
if(set==4)
{
hour--;
if(hour==(-1))
hour=23;
}
if(set==5)
{
min--;
if(min==(-1))
min=59;
}
if(set==6)
{
xq--;
if(xq==0)
xq=7;
}
if(set==7)
{
write_1302(0x8e,0x00);
write_1302(0x80,0x00);
write_1302(0x8e,0x80);
}
while(s3==0)
{display();}
}
}
}
}
*******************************************************************************************
請大家預判,此程序能否正確運行?加入討論
|