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

📄 main.lst

📁 可设置八个闹钟的智能时钟程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
 171          {
 172   1      switch(attr)
 173   1       { case 0xff: 
 174   2                                if(show_status==1)show_status=3;      //如果当前显示日期 切换到调准日期状态
 175   2                                if(show_status==2)show_status=4;              //如果当前显示时间 切换到调准时间状态
 176   2                            attr=0x3f; break;                                         //第一、二个数码管闪烁
 177   2         case 0x3f: attr=0xcf; break;                                         //第三、四个数码管闪烁
 178   2         case 0xcf: attr=0xf3; break;                                         //第五、六个数码管闪烁
 179   2         case 0xf3: if(show_status==0) attr=0xfd;                                     //第七个数码管闪烁
C51 COMPILER V7.06   MAIN                                                                  08/22/2008 21:21:40 PAGE 4   

 180   2                    if(show_status==3) {show_status=1; attr=0xff;}    //恢复正常显示日期
 181   2                    if(show_status==4) {show_status=2; attr=0xff;}    //恢复正常显示时间
 182   2                                break;
 183   2         case 0xfd: if(show_status==0) attr=0xfe;     //第八个数码管闪烁
 184   2                    break;
 185   2         case 0xfe: if(show_status==0) attr=0x3f;     //第一、二个数码管闪烁
 186   2       }
 187   1      }
 188          ///////////////////////////////////////////////////////////////////////
 189          void SetInc(void)       //轮换调节函数
 190          {
 191   1      switch(attr)
 192   1              { 
 193   2      case 0xff: if(show_status==1) show_status=2;   //在显示时间与日期间切换
 194   2                         else if(show_status==2) show_status=1;  
 195   2                         break;  
 196   2      case 0x3f: if(show_status==0) cur_alarm_set=(cur_alarm_set+1)%8;
 197   2                 else if(show_status==3) 
 198   2                 year=(year+1)%50;       //当前日期的"年"加1
 199   2                     else if(show_status==4) 
 200   2                 hour=(hour+1)%24;       //当前时间的"时"加1
 201   2                         break;    
 202   2      case 0xcf: if(show_status==0)      //闹钟设置的"时"加1
 203   2                         alarm[cur_alarm_set].h=(alarm[cur_alarm_set].h+1)%24;
 204   2                 else if(show_status==3) 
 205   2                              { 
 206   3                                      month++;                //当前日期的"月"加1
 207   3                                      if(month==13) month=1; 
 208   3                              } 
 209   2                     else if(show_status==4) 
 210   2                 min=(min+1)%60;         //当前时间的"分"加1
 211   2                         break;  
 212   2      case 0xf3: if(show_status==0) 
 213   2                 alarm[cur_alarm_set].m=(alarm[cur_alarm_set].m+1)%60;
 214   2                 else if(show_status==3) 
 215   2                            {
 216   3                                                      day++;                  //当前日期的"日"加1
 217   3                             if(day==32) day=1; }
 218   2                             else if(show_status==4) 
 219   2                                 {
 220   3                                                                      count_down=8000; 
 221   3                                                                      sec=(sec+1)%60;
 222   3                                                              }        //当前时间的"秒"加1
 223   2                                      break;                 
 224   2      case 0xfd: if(show_status==0)alarm_wk^=0x1<<cur_alarm_set;   //周末标志位切换
 225   2                         break;
 226   2      case 0xfe: if(show_status==0)alarm_en^=0x1<<cur_alarm_set;   //启用标志位切换
 227   2                         break;
 228   2              }       
 229   1      }
 230          ////////////////////////////////////////////////////////////////////////
 231          void SetReduce()
 232          { 
 233   1              char tmp;
 234   1              switch(attr)
 235   1                           { case 0xff: if(show_status==1 || show_status==2) 
 236   2                                            led_on=~led_on;        //打开或关闭数码管显示
 237   2                                                        break; 
 238   2                                 case 0x3f: if(show_status==0)         //如果正在设置闹钟
 239   2                                                         { if(cur_alarm_set==0)  cur_alarm_set=7; 
 240   3                                   else cur_alarm_set--;}
 241   2                              else if(show_status==3)     //当前日期的"年"减1
C51 COMPILER V7.06   MAIN                                                                  08/22/2008 21:21:40 PAGE 5   

 242   2                                             { if(year==0)  year=49;  else year--; }
 243   2                                          else if(show_status==4)     //当前时间的"时"减1
 244   2                                                         { tmp=hour-1;  if(tmp<0) hour=23;  else  hour=tmp;  }
 245   2                                                break;
 246   2                                 case 0xcf: if(show_status==0)          //闹钟设置的"时"减1
 247   2                                                         { tmp=alarm[cur_alarm_set].h-1;
 248   3                                                           if(tmp<0)    alarm[cur_alarm_set].h=23;
 249   3                                                               else         alarm[cur_alarm_set].h=tmp;
 250   3                                                              }
 251   2                                else if(show_status==3)          
 252   2                                             { month--;             //当前日期的"月"减1
 253   3                                   if(month==0)  month=12; }
 254   2                                                        else if(show_status==4)          
 255   2                                 { tmp=min-1;           //当前时间的"分"减1
 256   3                                  if(tmp<0) min=59;   else  min=tmp;   }
 257   2                                                        break;
 258   2                                 case 0xf3: if(show_status==0)          //闹钟设置的"分钟"减1
 259   2                                                         { tmp=alarm[cur_alarm_set].m-1;
 260   3                                                           if(tmp<0)    alarm[cur_alarm_set].m=59;
 261   3                                                               else         alarm[cur_alarm_set].m=tmp;
 262   3                                                              }
 263   2                                else if(show_status==3)      
 264   2                                             { day--;                 //当前日期的"日"减1
 265   3                                   if(day==0)  day=31; }
 266   2                                                        else if(show_status==4)         
 267   2                                 { tmp=sec-1;             //当前时间的"秒"减1
 268   3                                   count_down=8000;
 269   3                                   if(tmp<0) sec=59;   else  sec=tmp; }
 270   2                                                        break;
 271   2                                 case 0xfd: if(show_status==0)                          //切换周末标志
 272   2                                               alarm_wk^=0x1<<cur_alarm_set;
 273   2                                                        break;
 274   2                                 case 0xfe: if(show_status==0)                          //切换启用标志
 275   2                                               alarm_en^=0x1<<cur_alarm_set;
 276   2                                }       //end of switch(attr)
 277   1                               return;
 278   1      }
 279          ////////////////////////////////////////////////////////////////////////
 280          void SetAlarm()         //第一个按钮
 281          { 
 282   1      //如果闹钟正响,按此键停止
 283   1      if(sound) 
 284   1              { 
 285   2                      alarm_stop=1; 
 286   2                      sound=0; 
 287   2              }   
 288   1      //正显示日期或时间 进入闹钟设置 
 289   1      else if((show_status==1 || show_status==2) && led_on)
 290   1              { 
 291   2                      show_status=0;  
 292   2                      cur_alarm_set=0;  
 293   2                      attr=0x3f; 
 294   2              } 
 295   1      //如正在设置闹钟时间项  返回当前时间显示                      
 296   1      else if(show_status==0) 
 297   1              {
 298   2                      show_status=2; 
 299   2                      new_alarm_info=1;
 300   2                      attr=0xff;
 301   2              } 
 302   1      }        
 303          ////////////////////////////////////////////////////////////////////////
C51 COMPILER V7.06   MAIN                                                                  08/22/2008 21:21:40 PAGE 6   

 304          void Timer0ISR(void) interrupt 1 using 3        //定时器0中断程序,用于走时,1/8000秒一次
 305          {
 306   1              unsigned char tmp,tmp_days;
 307   1              count_down--;
 308   1        if(count_down==1 || count_down==2001 || count_down==4001 || count_down==6001)
 309   1         { flash=~flash;                                      //数码管闪烁的开关量
 310   2           if(sound && flash) sound_output=0;         //驱动蜂鸣器
 311   2           else             sound_output=1;           //关闭蜂鸣器
 312   2               return;
 313   2              }
 314   1      
 315   1      /*** 计算当前日期为星期几***/  
 316   1        if(count_down==3000)
 317   1         { if(year==0)       weekday=5;                 //2000年1月1日为星期六
 318   2          else { tmp=(year-1)/4+1;   tmp=(year-tmp)+tmp*2;
 319   3               weekday=(tmp+5)%7;           //计算出当前年的1月1日为星期几
 320   3              }
 321   2           tmp_days=0;
 322   2           for(tmp=1;tmp<month;tmp++)
 323   2             if(tmp==1 || tmp==3 || tmp==5 || tmp==7 || tmp==8 || tmp==10)
 324   2                tmp_days=tmp_days+31;
 325   2             else if(tmp==4 || tmp==6 || tmp==9 || tmp==11)
 326   2                    tmp_days=tmp_days+30;
 327   2             else if(tmp==2)
 328   2                    { if(year%4==0) tmp_days=tmp_days+29;
 329   3                  else         tmp_days=tmp_days+28;
 330   3                 }
 331   2           tmp_days=tmp_days+day-1;    weekday=(weekday+tmp_days%7)%7+1;
 332   2               return;
 333   2              }
 334   1      /***  查询是否有闹钟时间项符合触发条件 ***/
 335   1        if(count_down==5000)
 336   1        { if((alarm_stop || sound) && alarm[cur_alarm_active].m!=min)         //触发后1分钟
 337   2            { alarm_stop=0; sound=0; }                                                        //自动关蜂鸣器
 338   2      
 339   2          if(sound==0 && alarm_stop==0)           //没有已触发的闹钟项
 340   2           for(tmp=0;tmp<8;tmp++)                               //则查询8个闹钟项内是否有符合条件的
 341   2                { if(((alarm_en>>tmp)&1)==0) continue;    //该闹钟项不启用
 342   3                  if(((alarm_wk>>tmp)&1)==1)           //该闹钟项周末有效
 343   3                        { if(weekday!=6 && weekday!=7) continue;  }   //当前不是星期六或星期天
 344   3                      else
 345   3                        { if(weekday==6 || weekday==7) continue;  }
 346   3      
 347   3              if(alarm[tmp].h==hour && alarm[tmp].m==min)             //比较当前时间与该

⌨️ 快捷键说明

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