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

📄 main.lst

📁 可设置八个闹钟的智能时钟程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
 348   3                { sound=1;  cur_alarm_active=tmp; break; }            //闹钟项的时间
 349   3                 }
 350   2          return;
 351   2         }
 352   1      
 353   1        if(count_down==0)                             //过了一秒钟
 354   1         { count_down=8000;
 355   2           sec++;
 356   2           if(sec==60)
 357   2            { sec=0;
 358   3              min++;
 359   3              if(min==60)
 360   3                { min=0;
 361   4                  hour++;
 362   4                  if(hour==24)
 363   4                    { hour=0;   day++;
 364   5                                      switch(day)
 365   5                                      { case 29: if(month==2 && year%4)    { day=1; month=3; }
C51 COMPILER V7.06   MAIN                                                                  08/22/2008 21:21:40 PAGE 7   

 366   6                                                 break; 
 367   6                                        case 30: if(month==2 && year%4==0) { day=1; month=3; }
 368   6                                                 break; 
 369   6                                        case 31: if(month==4 || month==6 || month==9 || month==11)
 370   6                                                 { day=1; month++; }
 371   6                                                     break; 
 372   6                                        case 32: day=1;          month++;
 373   6                                               if(month==13) { month=1; year++; }
 374   6                                       }
 375   5                     }
 376   4                 }
 377   3             }
 378   2           }
 379   1      }
 380          ///////////////////////////////////////////////////////
 381          //定时器2中断,用于按键扫描
 382          //////////////////////////////////////////////////////
 383          void Timer1ISR(void) interrupt 3 using 2                
 384          {
 385   1      unsigned char keytmp;
 386   1              TH1=0x15; 
 387   1              TL1=0xa0;      // 每30ms中断一次
 388   1        if(show_status==0)   //当前正在设置闹钟项
 389   1          { 
 390   2               display[0]=dis_code[ cur_alarm_set ];               
 391   2               display[1]=0xff;
 392   2           display[2]=dis_code[ alarm[cur_alarm_set].h/10 ];      
 393   2               display[3]=dis_code[ alarm[cur_alarm_set].h%10 ];
 394   2               display[4]=dis_code[ alarm[cur_alarm_set].m/10 ];      
 395   2               display[5]=dis_code[ alarm[cur_alarm_set].m%10 ];
 396   2           display[6]=dis_code[ (alarm_wk>>cur_alarm_set)&1 ];  
 397   2               display[7]=dis_code[ (alarm_en>>cur_alarm_set)&1 ];
 398   2           }
 399   1        if(show_status==1 || show_status==3)         //当前显示或设置日期
 400   1          { 
 401   2                display[0]=dis_code[ year/10 ];         
 402   2                display[1]=dis_code[ year%10 ];         
 403   2                display[2]=dis_code[ month/10 ];        
 404   2                display[3]=dis_code[ month%10 ];   
 405   2                display[4]=dis_code[ day/10 ];          
 406   2                display[5]=dis_code[ day%10 ];
 407   2                display[6]=0xff;        
 408   2                display[7]=dis_code[ weekday ];
 409   2           }
 410   1        if(show_status==2 || show_status==4)         //当前显示或设置时间
 411   1          { 
 412   2              display[0]=dis_code[ hour/10 ];   
 413   2              display[1]=dis_code[ hour%10 ];
 414   2              display[2]=dis_code[ min/10 ];
 415   2              display[3]=dis_code[ min%10 ];
 416   2              display[4]=dis_code[ sec/10 ];    
 417   2              display[5]=dis_code[ sec%10 ];
 418   2              display[6]=0xff;  
 419   2              display[7]=0xff;  
 420   2               }
 421   1      /***  按键扫描及处理  ***/
 422   1              keytmp=P3;
 423   1              keytmp=keytmp>>2;
 424   1              keytmp=~(keytmp) & 0x0f;
 425   1        if(keytmp==0)  {km=0;kp=0;}   
 426   1        else 
 427   1         { if(km==0)   km=1;   
C51 COMPILER V7.06   MAIN                                                                  08/22/2008 21:21:40 PAGE 8   

 428   2               else
 429   2           { if(kp==0)
 430   3              { kp=1;
 431   4                        if(keytmp==1)                SetAlarm();      //第一个按钮闹钟设置
 432   4                        if(keytmp==2 && led_on)  SetInc();    //第二个按钮,仅当数码管打开时有效
 433   4                        if(keytmp==4)                SetReduce();     //第三个按钮
 434   4                        if(keytmp==8 & led_on)   SetNext();   //第四个按钮,仅当数码管打开时有效 
 435   4                       }      // end of if(kp==0)
 436   3                }         // end of if(km==0)
 437   2         }            // end of if(keytmp!=0)
 438   1      }
 439          
 440          //////////////////////////////////////////////////////////
 441          //主函数入口
 442          /////////////////////////////////////////////////////////
 443          void main(void)
 444          {
 445   1                unsigned char i;
 446   1                hour=12; min=00; sec=00;  
 447   1                year=8;  month=8;  day=8;
 448   1                count_down=8000;
 449   1                flash=0; attr=0xff;      
 450   1                led_on=1;                     //点亮数码管标志
 451   1                km=0;kp=0;          
 452   1                show_status=2;     //加电后显示当前时间
 453   1                new_alarm_info=0;  
 454   1                sound=0;   
 455   1                alarm_stop=0;   
 456   1        
 457   1        for(i=0;i<8;i++)           //从EEPROM中读入8个闹钟设置
 458   1          { 
 459   2                      alarm[i].h=myread(i*2);  
 460   2                      alarm[i].m=myread(i*2+1); 
 461   2              }  
 462   1                alarm_en=myread(i*2);        
 463   1                alarm_wk=myread(i*2+1);
 464   1                IE=0;  
 465   1                IP=0;                 //disable all interrupt and lower priority
 466   1                TMOD=0x12;            //timer 0 is set to mode 2,auto_reloading,timer1,mode 1
 467   1                TH0=0x8d;    
 468   1                TL0=0x8d;                     //timer0 parameters for 0.125ms
 469   1                TH1=0x94; 
 470   1                TL1=0x00;                     //timer1 parameters for 30ms
 471   1                TR0=1;    
 472   1                TR1=1;                        //timer0 interrupt most important
 473   1                ET0=1;    
 474   1                ET1=1;    
 475   1                EA=1;                         //enable interrupt function
 476   1        while(1)
 477   1        { 
 478   2      ///////////////////////////////////
 479   2              if(led_on)
 480   2            for(i=0;i<8;i++)
 481   2                 { 
 482   3                 P2=0xff; 
 483   3                 if( flash || attr&(0x80>>i) )  
 484   3                         { 
 485   4                         P0=display[i];  
 486   4                         P2=0xff-(0x80>>i); 
 487   4                         DelayX1ms(1); 
 488   4                         }
 489   3                      }
C51 COMPILER V7.06   MAIN                                                                  08/22/2008 21:21:40 PAGE 9   

 490   2          else  P2=0xff;  
 491   2      ///////////////////////////////////
 492   2          if(new_alarm_info)
 493   2           { 
 494   3                       P2=0xff;               //暂时关闭数码管   
 495   3                       new_alarm_info=0;      //写入EEPROM       
 496   3                       for(i=0;i<8;i++)  
 497   3                       { 
 498   4                         mywrite(i*2,alarm[i].h);  
 499   4                         mywrite(i*2+1,alarm[i].m); 
 500   4                       }  
 501   3                         mywrite(i*2,alarm_en);   
 502   3                         mywrite(i*2+1,alarm_wk);
 503   3               }
 504   2      
 505   2        }   
 506   1      }
 507          ///////////////////////////////////////////////
 508          //程序结束
 509          ///////////////////////////////////////////////


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   2120    ----
   CONSTANT SIZE    =     10    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     39       1
   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 + -