新闻  |   论坛  |   博客  |   在线研讨会
基于STC89C51的时钟软件设计(二)
max116 | 2012-04-27 16:52:48    阅读:14958   发布文章

/*****************************/
/****    键处理函数定义  ****/
/*****************************/
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;
                            }
                     }
              }
       }
}

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客