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

📄 clock.lst

📁 时钟程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
 203   6      { day=1; month++; } break; 
 204   6       case 32: day=1;   month++;
 205   6      if(month==13) { month=1; year++; }
 206   6      }
 207   5      }
 208   4      }
 209   3      }
 210   2      }
 211   1      }
 212          //以下是定时器2中断,用于按键扫描
 213          void Timer1ISR(void) interrupt 3 using 2 
 214          {
 215   1      unsigned char keytmp;
 216   1      char tmp;
 217   1      TH1=0x15; TL1=0xa0;      // 每30ms中断一次
 218   1      /***  当前显示的内容 ***/
 219   1       if(show_status==0)   //当前正在设置闹钟项
 220   1      {display[0]=cur_alarm_set;
 221   2      display[1]=0xf;
 222   2      display[2]=alarm[cur_alarm_set].h/10;
 223   2      display[3]=alarm[cur_alarm_set].h%10;
 224   2      display[4]=alarm[cur_alarm_set].m/10;
 225   2      display[5]=alarm[cur_alarm_set].m%10;
 226   2      display[6]=(alarm_wk>>cur_alarm_set)&1; 
 227   2      display[7]=(alarm_en>>cur_alarm_set)&1;}
 228   1      if(show_status==1 || show_status==3)         //当前显示或设置日期
 229   1      {display[0]=year/10;
 230   2      display[1]=year%10; 
 231   2      display[2]=month/10;   
 232   2      display[3]=month%10; 
 233   2      display[4]=day/10;
 234   2      display[5]=day%10;
 235   2      display[6]=0xf; 
 236   2      display[7]=weekday;}
 237   1       if(show_status==2 || show_status==4)         //当前显示或设置时间
 238   1      {display[0]=hour/10;
 239   2      display[1]=hour%10;
 240   2      display[2]=min/10;
 241   2      display[3]=min%10;
C51 COMPILER V7.04   CLOCK                                                                 09/17/2005 11:01:02 PAGE 5   

 242   2      display[4]=sec/10;
 243   2      display[5]=sec%10;
 244   2      display[6]=0xf;
 245   2      display[7]=0xf;}   //最后两后无显示
 246   1       /***  按键扫描及处理  ***/
 247   1        keytmp=~(P1) & 0x0f;
 248   1      if(keytmp==0)  { km=0;  kp=0; } 
 249   1      else { if(km==0)   km=1;
 250   2      else{ if(kp==0)
 251   3      {kp=1;if(keytmp==1)   //第一个按钮
 252   4      { if(sound) { alarm_stop=1; sound=0; }  //如果闹钟正响,按此键停止
 253   5      else if((show_status==1 || show_status==2) && led_on)  //正显示日期或时间
 254   5      { show_status=0;  cur_alarm_set=0;  attr=0x3f; }  //进入闹钟设置
 255   5       else if(show_status==0)                //如正在设置闹钟时间项
 256   5       { show_status=2;  new_alarm_info=1; attr=0xff; }  //返回当前时间显示
 257   5       return;
 258   5      }
 259   4       if(keytmp==2 && led_on)    //第二个按钮,仅当数码管打开时有效
 260   4      {switch(attr)
 261   5      { case 0xff: if(show_status==1) show_status=2;   //在显示时间与日期间切换
 262   6       else if(show_status==2) show_status=1;   break;  
 263   6      case 0x3f: if(show_status==0) cur_alarm_set=(cur_alarm_set+1)%8;
 264   6       else if(show_status==3) 
 265   6      year=(year+1)%50;       //当前日期的"年"加1
 266   6      else if(show_status==4) 
 267   6      hour=(hour+1)%24;       //当前时间的"时"加1
 268   6       break;  
 269   6      case 0xcf: if(show_status==0)          //闹钟设置的"时"加1
 270   6      alarm[cur_alarm_set].h=(alarm[cur_alarm_set].h+1)%24;
 271   6      else if(show_status==3) 
 272   6      { month++;                //当前日期的"月"加1
 273   7      if(month==13) month=1; } 
 274   6      else if(show_status==4) 
 275   6      min=(min+1)%60;         //当前时间的"分"加1
 276   6      break;  
 277   6      case 0xf3: if(show_status==0) 
 278   6      alarm[cur_alarm_set].m=(alarm[cur_alarm_set].m+1)%60;
 279   6      else if(show_status==3) 
 280   6      {day++;                  //当前日期的"日"加1
 281   7       if(day==32) day=1; }
 282   6      else if(show_status==4) 
 283   6      {count_down=8000; 
 284   7       sec=(sec+1)%60; }        //当前时间的"秒"加1
 285   6      break; 
 286   6      case 0xfd: if(show_status==0)
 287   6      alarm_wk^=0x1<<cur_alarm_set;   //周末标志位切换
 288   6      break;
 289   6      case 0xfe: if(show_status==0)
 290   6      alarm_en^=0x1<<cur_alarm_set;   //启用标志位切换
 291   6      }
 292   5      return;
 293   5      }
 294   4       if(keytmp==4)  //第三个按钮
 295   4      {switch(attr)
 296   5      { case 0xff: if(show_status==1 || show_status==2) 
 297   6      led_on=~led_on;        //打开或关闭数码管显示
 298   6      break; 
 299   6      case 0x3f: if(show_status==0)         //如果正在设置闹钟
 300   6      { if(cur_alarm_set==0)  cur_alarm_set=7; 
 301   7      else cur_alarm_set--;}
 302   6       else if(show_status==3)     //当前日期的"年"减1
 303   6       { if(year==0)  year=49;  else year--; }
C51 COMPILER V7.04   CLOCK                                                                 09/17/2005 11:01:02 PAGE 6   

 304   6      else if(show_status==4)     //当前时间的"时"减1
 305   6      { tmp=hour-1;  if(tmp<0) hour=23;  else  hour=tmp;  }
 306   6      break;
 307   6      case 0xcf: if(show_status==0)          //闹钟设置的"时"减1
 308   6      { tmp=alarm[cur_alarm_set].h-1;
 309   7      if(tmp<0)    alarm[cur_alarm_set].h=23;
 310   7      else         alarm[cur_alarm_set].h=tmp;
 311   7      }
 312   6       else if(show_status==3)  
 313   6      { month--;             //当前日期的"月"减1
 314   7      if(month==0)  month=12; }
 315   6      else if(show_status==4) 
 316   6      { tmp=min-1;           //当前时间的"分"减1
 317   7       if(tmp<0) min=59;   else  min=tmp;   }
 318   6      break;
 319   6      case 0xf3: if(show_status==0)          //闹钟设置的"分钟"减1
 320   6      { tmp=alarm[cur_alarm_set].m-1;
 321   7      if(tmp<0)    alarm[cur_alarm_set].m=59;
 322   7      else         alarm[cur_alarm_set].m=tmp;
 323   7      }
 324   6      else if(show_status==3) 
 325   6      { day--;                 //当前日期的"日"减1
 326   7      if(day==0)  day=31; }
 327   6       else if(show_status==4) 
 328   6      { tmp=sec-1;             //当前时间的"秒"减1
 329   7       count_down=8000;
 330   7       if(tmp<0) sec=59;   else  sec=tmp; }
 331   6      break;
 332   6      case 0xfd: if(show_status==0)     //切换周末标志
 333   6      alarm_wk^=0x1<<cur_alarm_set;
 334   6      break;
 335   6      case 0xfe: if(show_status==0)     //切换启用标志
 336   6      alarm_en^=0x1<<cur_alarm_set;
 337   6      }
 338   5      return;
 339   5      }
 340   4      if(keytmp==8 & led_on)    //第四个按钮,仅当数码管打开时有效
 341   4      {switch(attr)
 342   5      {case 0xff: if(show_status==1)   //如果当前显示日期
 343   6      show_status=3;       //切换到调准日期状态
 344   6      else if(show_status==2)  //如果当前显示时间
 345   6       show_status=4;      //切换到调准时间状态
 346   6      attr=0x3f; break;   //第一?二个数码管闪烁
 347   6      case 0x3f: attr=0xcf; break;  //第三?四个数码管闪烁
 348   6      case 0xcf: attr=0xf3; break;  //第五?六个数码管闪烁case 0xf3: if(show_status==0) 
 349   6      case 0xf3: if(show_status==0) attr=0xfd;   //第七个数码管闪烁
 350   6          else if(show_status==3) 
 351   6         { show_status=1; attr=0xff; }  //恢复正常显示日期
 352   6      else if(show_status==4) 
 353   6      { show_status=2; attr=0xff; }  //恢复正常显示时间
 354   6       break;
 355   6       case 0xfd: if(show_status==0) attr=0xfe;     //第八个数码管闪烁
 356   6      break;
 357   6      case 0xfe: if(show_status==0) attr=0x3f;     //第一?二个数码管闪烁
 358   6      }
 359   5      }    // end of if(keytmp==4)
 360   4      }       // end of if(kp==0)
 361   3      }         // end of if(km==0)
 362   2      }             // end of if(keytmp!=0)
 363   1      }
 364          //以下是主函数
 365          main()
C51 COMPILER V7.04   CLOCK                                                                 09/17/2005 11:01:02 PAGE 7   

 366          {
 367   1      unsigned char i;
 368   1         hour=23;  min=58;  sec=30;  year=2;  month=4;  day=25;
 369   1      count_down=8000;
 370   1      flash=0;    attr=0xff;      led_on=1;
 371   1      km=0;     kp=0;          show_status=2;     //加电后显示当前时间
 372   1      new_alarm_info=0;  sound=0;   alarm_stop=0;   
 373   1      for(i=0;i<8;i++)           //从EEPROM中读入8个闹钟设置
 374   1       { alarm[i].h=myread(i*2);  alarm[i].m=myread(i*2+1); }  
 375   1       alarm_en=myread(i*2); 
 376   1      alarm_wk=myread(i*2+1);
 377   1      IE=0;  IP=0;             //禁止所有中断
 378   1      TMOD=0x12;             //定时器0为模式2,定时器1为模式1
 379   1      TH0=6;    TL0=6;        //定时器0为0.125ms
 380   1      TH1=0x15; TL1=0xa0; //定时器1为30ms
 381   1      TR0=1;    TR1=1;        //启动定时器0和定时器1
 382   1      ET0=1;  ET1=1;    EA=1;  //开定时器0中断?定时器1中断和总中断
 383   1      while(1)
 384   1      {
 385   2      if(led_on)
 386   2       for(i=0;i<8;i++)
 387   2      { P2=0; if(flash || attr&(0x80>>i))  
 388   3      { P0=display;  P2=0x80>>i; DelayX1ms(1); } }
 389   2      else  P2=0; 
 390   2      if(new_alarm_info)
 391   2      { P2=0;                      //暂时关闭数码管
 392   3       new_alarm_info=0;      //写入EEPROM
 393   3      for(i=0;i<8;i++)
 394   3      { mywrite(i*2,alarm[i].h);  mywrite(i*2+1,alarm[i].m); }  
 395   3       mywrite(i*2,alarm_en);   mywrite(i*2+1,alarm_wk);}
 396   2      } 
 397   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   2224    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     39       4
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      7       1
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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