/***************************************定时器2,做数码管的动态扫描,并确定显示的是时间还是年月日******************/
void time1(void) interrupt 3
{
TH1 =(65536-500)/256;
TL1 =(65536-500)%256;
if(++cnt>8) cnt=0;
if(sw5==0) //显示时分秒
{ switch(cnt)
{
case 0: P1 = 0x00;
P0 = duan[sec%10];
P1 = wei[cnt]; break;
case 1: P1 = 0x00;
P0 = duan[sec/10];
P1 = wei[cnt];break;
case 2: P1 = 0x00;
P0 = duan[min%10];
P1 = wei[cnt]; break;
case 3: P1 = 0x00;
P0 = duan[min/10];
P1 = wei[cnt];
scan_key(); break;
case 4: P1 = 0x00;
P0 = duan[hour%10];
P1 = wei[cnt];
scan_key();break;
case 5: P1 = 0x00;
P0 = duan[hour/10];
P1 = wei[cnt];
scan_key();break;
case 6: P1 = 0x00;
P0 = 0x7f;
P1 = wei[cnt];
scan_key(); break;
case 7: P1 = 0x00;
P0 = week1[week];
P1 = wei[cnt];
scan_key();break;
default: break;
}
}
if(sw5==1) //显示年月日
{switch(cnt)
{
case 0: P1 = 0x00;
P0 = duan[day%10];
P1 = wei[cnt]; break;
case 1: P1 = 0x00;
P0 = duan[day/10];
P1 = wei[cnt];break;
case 2: P1 = 0x00;
P0 = duan[month%10];
P1 = wei[cnt]; break;
case 3: P1 = 0x00;
P0 = duan[month/10];
P1 = wei[cnt];
scan_key(); break;
case 4: P1 = 0x00;
P0 = duan[year1%10];
P1 = wei[cnt];
scan_key();break;
case 5: P1 = 0x00;
P0 = duan[year1/10];
P1 = wei[cnt];
scan_key();break;
case 6: P1 = 0x00;
P0 = duan[year2%10];
P1 = wei[cnt];
scan_key(); break;
case 7: P1 = 0x00;
P0 = duan[year2/10];
P1 = wei[cnt];
scan_key();break;
default: break;
}
}
}
/**************************************************时钟控制子函数,自动加分钟,小时等****************************/
void conv(void)
{
if(dataa>=201)
{dataa=0;sec++;}
if(sec>=60)
{sec=0;min++;}
if(sw1==0&&min>=60)
{min=0;hour++;}
if(sw1==0&&hour>=24)
{
if(year%4==0)
{
if(month==2)
{
if(day==29)
{
day = 1;
month++;
}
else day++;
}
else
{
if(month==4||month==6||month==9||month==11)
{
if(day==30)
{
day = 1;
month++;
}
else day++;
}
else
{
if(day==31)
{
day = 1;
month++;
if(month==13)
{
month = 1;
year++;
}
}
else day++;
}
}
}
else
{
if(month==2)
{
if(day==28)
{
day = 1;
month++;
}
else day++;
}
else
{
if(month==4||month==6||month==9||month==11)
{
if(day==30)
{
day = 1;
month++;
}
else day++;
}
else
{
if(day==31)
{
day = 1;
month++;
if(month==13)
{
month = 1;
year1++;
if(year1==100)
{
year2++;
}
}
}
else day++;
}
}
}
hour=0;
week++;
}
if(sw1==0&&week>=7)
week=0;
}
/*************************************************延时子函数**************************************************/
void delay(ms)
{
uchar i, k;
while(ms--)
for(k=0;k<123;k++);
for(i=0;i<123;i++);
}
/***********************************************键盘扫描程序**************************************************/
void scan_key(void)
{
if(cnt==7&&P3_4==0)
{
delay(3);
if(cnt==7&&P3_4==0)
{
key4 = 0;
key1 = 1; //检查是第一个键按下
}
}
if(sw5==0&&key1==1&&cnt==7&&P3_4==1) //按键松手时表示真的按下,sw5判断此时是什么显示状态,时间还是年月日
{
sw1 = 1; //闪烁分针
}
if(sw5==1&&key1==1&&cnt==7&&P3_4==1) //若为年月日则闪烁第一二位
{
sw1 = 9;
}
if(sw1==1&&P3_4==0&&cnt==7) //在时间状态第一个键又一次按下
{
delay(3);
if(sw1==1&&P3_4==0&&cnt==7)
{
key1 = 2; //在时间状态第一个键的第二种状态
}
}
if(sw1==9&&P3_4==0&&cnt==7) //在年月日状态第一个键第二次按下
{
delay(3);
if(sw1==9&&P3_4==0&&cnt==7)
{
key1 = 9; //在年月日状态第一个键的第二种状态
}
}
if(key1==2&&cnt==7&&P3_4==1) //在时间确认第一个键第二次按下
{
sw1 = 2; // 并闪烁时针
}
if(key1==9&&cnt==7&&P3_4==1) //年月日状态确认第一个键第二次按下
{
sw1 = 8; // 并闪烁月分
}
if(sw1==8&&P3_4==0&&cnt==7) //在年月日状态第一个键第三次按下
{
delay(3);
if(sw1==8&&P3_4==0&&cnt==7)
{
key1 = 8; //在年月日状态第一个键的第三种状态
}
}
if(key1==8&&cnt==7&&P3_4==1) //年月日状态确认第一个键第三次按下
{
sw1 = 7; // 并闪烁年的后两位 ///////////////////
}
if(sw1==2&&P3_4==0&&cnt==7)
{
delay(3);
if(sw1==2&&P3_4==0&&cnt==7)
{
key1 = 3;
}
}
if(sw1==7&&P3_4==0&&cnt==7) //在年月日状态第一个键第四次按下
{
delay(3);
if(sw1==7&&P3_4==0&&cnt==7)
{
key1 = 7; //在年月日状态第一个键的第四种状态
}
}
if(key1==7&&cnt==7&&P3_4==1) //年月日状态确认第一个键第四次按下
{
sw1 = 6; // 并闪烁年的前两位 ///////////////////
}
if(sw1==2&&P3_4==0&&cnt==7)
{
delay(3);
if(sw1==2&&P3_4==0&&cnt==7)
{
key1 = 3;
}
}
if(key1==3&&cnt==7&&P3_4==1)
{
sw1 = 3; // 并闪烁星期
}
if(sw5==0&&P3_4==0&&cnt==6) //检查第二个键是否按下
{
delay(3);
if(sw5==0&&P3_4==0&&cnt==6)
{
key2 = 1;
}
}
if(key2==1&&cnt==6&&P3_4==1)
{
key2 =0;
sw2 = 1; //在时间状态确认第二个键按下
if(sw2==1&&sw1==1) //和sw1的值对比,加分
{
min++;
if(min>=60)
min = 0;
}
if(sw2==1&&sw1==2) //和sw1的值对比,加时
{
hour++;
if(hour>=24)
hour = 0;
}
if(sw2==1&&sw1==3)
{
week++;
if(week>6)
week = 0;
}
}
if(sw5==1&&P3_4==0&&cnt==6) //在年月日检查第二个键是否按下
{
delay(3);
if(sw5==1&&P3_4==0&&cnt==6)
{
key2 = 7;
}
}
if(key2==7&&cnt==6&&P3_4==1)
{
key2 = 0;
sw2 = 1; //确认第二个键按下
if(sw2==1&&sw1==9) //和sw1的值对比,加day
{
day++;
if(day>31)
day = 0;
}
if(sw2==1&&sw1==8) //和sw1的值对比,加month
{
month++;
if(month>12)
month = 0;
}
if(sw2==1&&sw1==7)
{
year1++;
if(year1>100)
year1 = 0;
}
if(sw2==1&&sw1==6)
{
year2++;
if(year2>100)
year2 = 20;
}
} //检查时间状态第三个键是否按下