/*****************************/
/**** 键处理函数定义 ****/
/*****************************/
void key_charge()
{
if( alarm_able && time.hour == alarm.hour
&& time.min == alarm.min)
//闹铃响起,有按键
{
alarm_able = 0; // 关闹铃
old_min = time.min; //有按键则维持显示
return;
}
old_min = time.min; //有按键则维持显示
if ( (0 <= key_value)&&( key_value <= 9) ) //键值为0~9 则赋值相应位
{
if( state == 2 )
{
switch( loc )
{
case 0: time.hour = (time.hour%10) + key_value*10;
break;
case 1: time.hour = (time.hour/10)*10 + key_value;
break;
case 2: time.min = (time.min%10) + key_value*10;
break;
case 3: time.min = (time.min/10)*10 + key_value;
break;
case 4: time.sec = (time.sec%10) + key_value*10;
break;
case 5: time.sec = (time.sec/10)*10 + key_value;
break;
}
}
if( state == 3 )
{
switch( loc )
{
case 0: date.year = (date.year%10) + key_value*10;
break;
case 1: date.year = (date.year/10)*10 + key_value;
break;
case 2: date.month = (date.month%10) + key_value*10;
break;
case 3: date.month = (date.month/10)*10 + key_value;
break;
case 4: date.day = (date.day%10) + key_value*10;
break;
case 5: date.day = (date.day/10)*10 + key_value;
break;
}
}
if( state == 4 )
{
switch( loc )
{
case 0: week = key_value;
break;
case 2: alarm.hour = (alarm.hour%10) + key_value*10;
break;
case 3: alarm.hour = (alarm.hour/10)*10 + key_value;
break;
case 4: alarm.min = (alarm.min%10) + key_value*10;
break;
case 5: alarm.min = (alarm.min/10)*10 + key_value;
break;
}
}
correct(); //过调修正
}
else if ( key_value == 10 )
{
}
else if ( key_value == 11 )
{
}
else if ( key_value == 12 ) //改变当前位置
{
if( ++loc >= 6) loc = 0;
}
else if ( key_value == 13 ) //闹铃使(不)能
{
alarm_able = ~alarm_able;
}
else if ( key_value == 14 ) //改变当前状态
{
++state;
if( state > 1) //状态值 > 1
{
shine = 1; //开启闪烁
if( state > 4) //状态回绕
{
state = 0;
shine = 0;
}
}
}
else if ( key_value == 15 ) //返回计时状态
{
state = 0;
shine = 0;
}
}
/*****************************/
/**** 显示函数定义 ****/
/*****************************/
void display()
{
unsigned char i;
switch( state ) //由state决定显示内容
{
case 2:
case 0:
LedOut[0]=Disp_Tab[time.hour/10];
LedOut[1]=Disp_Tab[time.hour%10]&0xfe;
LedOut[2]=Disp_Tab[time.min/10];
LedOut[3]=Disp_Tab[time.min%10]&0xfe;
LedOut[4]=Disp_Tab[time.sec/10];
//是否显示闹铃开启标志
if ( alarm_able ) LedOut[5]=Disp_Tab[time.sec%10]&0xfe;
else LedOut[5]=Disp_Tab[time.sec%10]; break;
case 3:
case 1:
LedOut[0]=Disp_Tab[date.year/10];
LedOut[1]=Disp_Tab[date.year%10]&0xfe;
LedOut[2]=Disp_Tab[date.month/10];
LedOut[3]=Disp_Tab[date.month%10]&0xfe;
LedOut[4]=Disp_Tab[date.day/10];
//是否显示闹铃开启标志
if ( alarm_able )LedOut[5]=Disp_Tab[date.day%10]&0xfe;
else LedOut[5]=Disp_Tab[date.day%10]; break;
case 4:
LedOut[0]=Disp_Tab[week+1];
LedOut[1]=Disp_Tab[11];
LedOut[2]=Disp_Tab[alarm.hour/10];
LedOut[3]=Disp_Tab[alarm.hour%10]&0xfe;
LedOut[4]=Disp_Tab[alarm.min/10];
//是否显示闹铃开启标志
if ( alarm_able )LedOut[5]=Disp_Tab[alarm.min%10]&0xfe;
else LedOut[5]=Disp_Tab[alarm.min%10]; break;
}
if( light )
{
for( i=0; i<=6; i++) //实现6位动态扫描循环
/* **注意** */
/* 此处多一次循环以使数码管亮度一致 */
{
if ( shine && ms/500 && i == loc ) P2 =~(1<<i) | 0x3f;//闪烁0.5s
else P2 = ~(1<<i);
SBUF = LedOut[i]; //串行口输出
while( !TI ) delay(1);
TI = 0;
delay(100);
}
}
else P2 |= 0x3f; //熄灭显示
}
/*****************************/
/**** 定时器0中断处理函数 ****/
/*****************************/
void t0() interrupt 1 //定时器0 精确计时1ms
{
TH0= 0xFC; //12.000M
TL0= 0x18; //
++ms;
if ( ms >= 1000 ) //计时满1s
{
ms = 0;
++time.sec;
if( time.sec >= 60 ) //计时满1min
{
time.sec = 0;
++time.min;
if(time.min >= 60) //计时满1h
{
time.min = 0;
++time.hour;
if (time.hour >= 24)
{
time.hour = 0;
++week;
if( week >= 7)
{
week = 0;
}
change = 1;
}
}
}
}
}
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。