⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 基于AT89S52控制芯片的电子万年历程序
💻 C
📖 第 1 页 / 共 2 页
字号:
              keyFlag&=~(0x0001<<(iScan*4+2));      /*清此键的标志位*/
          }
          if((scanTempUchar&0x08) == 0x00)          /*第四列被按*/
          {
              keyFlag|=0x0001<<(iScan*4+3);         /*置此键的标志位*/
          }
          else
          {
              keyFlag&=~(0x0001<<(iScan*4+3));      /*清此键标志位*/
          }
          scanValue = scanValue<<1|0x01;             /*置下次扫描值*/
      }
}

uchar KeyJudge(void)                                /*按键预处理*/
{
      uchar j,counterKeyPressedNum;
      uchar keyRet = 0x55;                            /*初始按键返回码设定为无按码0x55*/
      uint uintTemp;
      
      ScanKeys();                                       /*扫描键盘*/
      if(keyFlag!=0)
      {
          Delay(1000);                                /*掩饰10ms以消除抖动*/
          ScanKeys();
          P1 = 0x0f;
          while((P1&0x0f)!=0x0f);                     /*没松开按键就等按键松开*/
          counterKeyPressedNum = 0;
          for(j=0;j<16;j++)
          {
              uintTemp = ((uint)0x0001)<<j;
              if((keyFlag&uintTemp)==uintTemp)     
                                          /*依次检测键盘扫描标志KeyFlag,如某位置一则按键个数寄存器加1*/
              {
                        counterKeyPressedNum++;
                              keyRet = j;
              }
          }
          if(counterKeyPressedNum>1)   /*如果不止一个键被按则丢弃此状态返回无码0x55*/
          {
                  return 0x55;
          }
          else                                    /*某键被按,返回此键的标识码*/
          {
                  return(keyRet);
          }
      }
      return(0x55);                               /*无键被按则返回无按码*/
}

void KeyHandle(uchar keyIndex)                       /*按键处理模块*/
{
     static uchar cnt = 0;
     switch(keyIndex)
     {
        case 0x00:                                   /*按1键*/     
          showitem = SHOW_TIME;                   /*标识当前显示时间*/
          str1[0]='T';str1[1]='I';str1[2]='M';str1[3]='E';
          cnt = 0;
          current = CUR_MINUTE;
          if((cs.cs2 & 0x08) == 0x08){    /*如果闹钟标志位置位(设定闹钟过程中可能会设置)*/
              cs.cs2 &= 0xf7;                      /*清闹钟标志位*/
              PCF8563_SetCS(cs);                  /*写8563控制/状态字*/
              }
          break;
        case 0x01:                                  /*按2键*/
            showitem = SHOW_ALARM;           /*标识当前显示闹钟*/
            str1[0]='A';str1[1]='L';str1[2]='R';str1[3]='M';
            cnt = 0;
            current = CUR_MINUTE;
            break;
        case 0x02:                                /*按3见*/
             if(showitem == SHOW_TIME){             /*如果显示时间*/
                  switch(cnt){                           /*设定项目更改*/
                  case 0:current = CUR_MINUTE;break;
                  case 1:current = CUR_HOUR;break;
                  case 2:current = CUR_DAY;break;
                  case 3:current = CUR_WEEKDAY;break;
                  case 4:current = CUR_MONTH;break;
                  case 5:current = CUR_YEAR;break;  
                  case 6:current = CUR_SECOND;break;               
                  }
                  if(++cnt>6){                              /*轮回*/
                        cnt = 0;
                  }
            }else if(showitem == SHOW_ALARM){               /*如果显示闹钟*/
                  switch(cnt){
                  case 0:current = CUR_MINUTE;break;
                  case 1:current = CUR_HOUR;break;
                  }
                  if(++cnt>1){                              /*轮回*/
                      cnt = 0;
                  }
               }
             break;
        case 0x03:                                          /*INC*/
              if(showitem == SHOW_TIME){                  /*如果显示时间*/
                  PCF8563_ReadTime(&tm);                    /*读时间*/
                  set_min = (tm.minutes>>4)*10+(tm.minutes&0x0f);    /*BCD到HEX*/
                  set_hour = (tm.hours>>4)*10+(tm.hours&0x0f);
                  set_day = (tm.days>>4)*10+(tm.days&0x0f);
                  set_weekday = tm.weekdays;
                  set_month = (tm.mon_cen>>4)*10+(tm.mon_cen&0x0f);
                  set_year = (tm.years>>4)*10+(tm.years&0x0f);
                  set_second = (tm.seconds>>4)*10+(tm.seconds&0x0f);
                  switch(current){                                /*根据当前设定项目加减时间*/
                  case CUR_MINUTE:set_min++;break;
                  case CUR_HOUR:set_hour++;break;
                  case CUR_DAY:set_day++;break;
                  case CUR_WEEKDAY:set_weekday++;break;
                  case CUR_MONTH:set_month++;break;
                  case CUR_YEAR:set_year++;break;
                  case CUR_SECOND:set_second++;break;                  
                  }
                  ModTime(&tm);                                 /*调整时间*/
                  ModShow(tm);                                  /*调整显示内容*/
                  DisplayString(0,0,str1);
                  DisplayString(0,1,str2);
                  tm.minutes = (tm.minutes>>4)*10+(tm.minutes&0x0f);    /*BCD到HEX*/
                  tm.hours = (tm.hours>>4)*10+(tm.hours&0x0f);
                  tm.days = (tm.days>>4)*10+(tm.days&0x0f);
                  tm.weekdays = tm.weekdays;
                  tm.mon_cen = (tm.mon_cen>>4)*10+(tm.mon_cen&0x0f);
                  tm.years = (tm.years>>4)*10+(tm.years&0x0f);
                  tm.seconds = (tm.seconds>>4)*10+(tm.seconds&0x0f);
                  PCF8563_SetTime(tm);                           /*设定时间*/
              }else if(showitem == SHOW_ALARM){                /*如果显示闹钟*/
                  switch(current){                                    /*根据当前设定项目加减闹钟*/
                  case CUR_MINUTE:setalarm_min++;break;
                  case CUR_HOUR:setalarm_hour++;break;
                  }
                  ModAlarm(&alm);                                 /*调整闹钟*/
                  tm.minutes = alm.minute;                          /*待显*/
                  tm.hours = alm.hour;
                  tm.days = alm.day;
                  tm.weekdays = alm.weekday;
                  ModShow(tm);                                      /*调整显示内容*/
                  DisplayString(0,0,str1);
                  DisplayString(0,1,str2);
                  alm.minute = (alm.minute>>4)*10 + (alm.minute&0x0f);    /*BCD到HEX*/
                  alm.hour = (alm.hour>>4)*10 + (alm.hour&0x0f);
                  alm.day = (alm.day>>4)*10 + (alm.day&0x0f);
                  alm.weekday = (alm.weekday>>4)*10 + (alm.weekday&0x0f);
                  PCF8563_SetAlarm(alm,1,1,0,0);                    /*设定闹钟*/
              }   
              break;
       case 0x04:                                                    /*DEC*/
              if(showitem == SHOW_TIME){                           /*如果显示时间*/
                  PCF8563_ReadTime(&tm);                               /*读时间*/
                  set_min = (tm.minutes>>4)*10+(tm.minutes&0x0f);    /*BCD到HEX*/
                  set_hour = (tm.hours>>4)*10+(tm.hours&0x0f);
                  set_day = (tm.days>>4)*10+(tm.days&0x0f);
                  set_weekday = tm.weekdays;
                  set_month = (tm.mon_cen>>4)*10+(tm.mon_cen&0x0f);
                  set_year = (tm.years>>4)*10+(tm.years&0x0f);
                  set_second = (tm.seconds>>4)*10+(tm.seconds&0x0f);
                  switch(current){                                      /*根据当前设定项目加减时间*/
                    case CUR_MINUTE:set_min--;break;
                    case CUR_HOUR:set_hour--;break;
                    case CUR_DAY:set_day--;break;
                    case CUR_WEEKDAY:set_weekday--;break;
                    case CUR_MONTH:set_month--;break;
                    case CUR_YEAR:set_year--;break;
                    case CUR_SECOND:set_second--;break;
                  }
                  ModTime(&tm);                                     /*调整时间*/
                  ModShow(tm);                                        /*调整显示内容*/
                  DisplayString(0,0,str1);
                  DisplayString(0,1,str2);
                  tm.minutes = (tm.minutes>>4)*10+(tm.minutes&0x0f);    /*BCD到HEX*/
                  tm.hours = (tm.hours>>4)*10+(tm.hours&0x0f);
                  tm.days = (tm.days>>4)*10+(tm.days&0x0f);
                  tm.weekdays = tm.weekdays;
                  tm.mon_cen = (tm.mon_cen>>4)*10+(tm.mon_cen&0x0f);
                  tm.years = (tm.years>>4)*10+(tm.years&0x0f);
                  tm.seconds = (tm.seconds>>4)*10+(tm.seconds&0x0f);
                  PCF8563_SetTime(tm);                              /*设定时间*/
              }else if(showitem == SHOW_ALARM){                   /*如果显示闹钟*/
                 switch(current){                                     /*根据当前设定项目加减闹钟*/
                    case CUR_MINUTE:setalarm_min--;break;
                    case CUR_HOUR:setalarm_hour--;break;                 
                 }
                  ModAlarm(&alm);                                   /*调整闹钟*/
                  tm.minutes = alm.minute;                           /*待显*/
                  tm.hours = alm.hour;
                  tm.days = alm.day;
                  tm.weekdays = alm.weekday;
                  ModShow(tm);                                       /*调整显示内容*/
                  DisplayString(0,0,str1);
                  DisplayString(0,1,str2);
                  alm.minute = (alm.minute>>4)*10 + (alm.minute&0x0f);            /*BCD到HEX*/
                  alm.hour = (alm.hour>>4)*10 + (alm.hour&0x0f);
                  alm.day = (alm.day>>4)*10 + (alm.day&0x0f);
                  alm.weekday = (alm.weekday>>4)*10 + (alm.weekday&0x0f);
                  PCF8563_SetAlarm(alm,1,1,0,0);                            /*设定闹钟*/
              }
              break;
     }
}

void ModAlarm(struct alarm *alm)
{
      if(setalarm_min == 60){                                       /*如果分钟大于59*/
            setalarm_min = 0;
      }else if(setalarm_min == 0xFF){                               /*如果分钟小于0*/
            setalarm_min = 59;
      }
      alm->minute = (setalarm_min%10) | ((setalarm_min/10)<<4);     /*HEX到BCD*/
      
      if(setalarm_hour == 24){                                       /*如果小时大于23*/
            setalarm_hour = 0;
      }else if(setalarm_hour == 0xFF){                               /*如果小时小于0*/
            setalarm_hour = 23;
      }
      alm->hour = (setalarm_hour%10) | ((setalarm_hour/10)<<4);     /*HEX到BCD*/
}

void ModTime(struct time *tm)
{
      if(set_min == 60){                                       /*如果分钟大于59*/
            set_min = 0;
      }else if(set_min == 0xff){                               /*如果分钟小于0*/
            set_min = 59;
      }
      tm->minutes = (set_min%10) | ((set_min/10)<<4);     /*HEX到BCD*/
      
      if(set_hour == 24){                                       /*如果小时大于23*/
            set_hour = 0;
      }else if(set_hour == 0xff){                               /*如果小时小于0*/
            set_hour = 23;
      }
      tm->hours = (set_hour%10) | ((set_hour/10)<<4);     /*HEX到BCD*/
      
      if(set_day==31 && (tm->mon_cen==4 || tm->mon_cen==6 || tm->mon_cen==9 || tm->mon_cen==11)){
          set_day = 1;
      }else if(set_day==29 && (tm->mon_cen==2 && tm->years%4!=0)){
          set_day = 1;
      }else if(set_day==30 && (tm->mon_cen==2 && tm->years%4==0)){
          set_day = 1;
      }else if(set_day == 32){
          set_day = 1;
      }else if(set_day==0 && (tm->mon_cen==4 || tm->mon_cen==6 || tm->mon_cen==9 || tm->mon_cen==11)){
          set_day = 30;
      }else if(set_day==0 && (tm->mon_cen==2 && tm->years%4!=0)){
          set_day = 28;
      }else if(set_day==0 && (tm->mon_cen==2 && tm->years%4==0)){
          set_day = 29;
      }else if(set_day == 0){
          set_day = 31;
      }
      tm->days = (set_day%10)|((set_day/10)<<4);                          /*HEX到BCD*/
      
      if(set_weekday == 7){                                   /*如果星期大于6*/
           set_weekday = 0;
      }else if(set_weekday == 0xff){                          /*如果星期小于0*/
           set_weekday = 6;
      }
      tm->weekdays = (set_weekday%10)|((set_weekday/10)<<4);            /*HEX到BCD*/
      
      if(set_month == 13){                                              /*如果月份大于12*/
           set_month = 1;
      }else if(set_month == 0){                                        /*如果月份小于1*/
           set_month = 12;
      }
      tm->mon_cen = (set_month%10)|((set_month/10)<<4);          /*HEX到BCD*/
      
      if(set_year == 100){                                              /*如果年份大于100*/
           set_year = 0;
      }else if(set_year == 0xff){                                       /*如果年份小于0*/
           set_year = 99;
      }
      tm->years = (set_year%10)|((set_year/10)<<4);                   /*HEX到BCD*/
      
      if(set_second == 60){                                               /*如果秒大于59*/
           set_second = 0;
      }else if(set_second == 0xff){                                        /*如果秒小于0*/
           set_second = 59;
      }
      tm->seconds = (set_second%10)|((set_second/10)<<4);                /*HEX到BCD*/
}
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -