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

📄 timer.lst

📁 AD89C51单片机控制液晶显示器LCD1602显示时间。
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.02a   TIMER                                                                09/12/2008 14:50:32 PAGE 1   


C51 COMPILER V7.02a, COMPILATION OF MODULE TIMER
OBJECT MODULE PLACED IN timer.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE timer.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          #include <at89x51.h>
   2          #include "keyboard.h"
   3          #include "led.h"
   4          #include "LCD1602.h"
   5          
   6          unsigned char display_buffer[6];        //显示缓冲区
   7          
   8          unsigned char second,minute,hour,day,month,year;  //分别保存秒、分、时、天、月、年的变量
   9          unsigned char n_50m_second;             //保存多少个50毫秒的变量
  10          unsigned char days_of_month;            //保存该月多少天的变量
  11          
  12          void timer0_isr(void) interrupt 1 using 1      //定时器0中断处理函数
  13          {
  14   1       TL0=0xB9;
  15   1       TH0=0x3C;                              //定时器重装。定时50mS中断一次
  16   1       n_50m_second++;
  17   1       if(n_50m_second>=20)                  //1秒到
  18   1        {
  19   2         n_50m_second=0;                     //清50毫秒计数
  20   2         second++;                           //秒加1
  21   2         if(second==60)                      //如果秒到60
  22   2          {
  23   3           second=0;                         //秒清0
  24   3           minute++;                         //分加1
  25   3           if(minute==60)                    //如果分到60
  26   3            {
  27   4             minute=0;                       //分清0
  28   4             hour++;                         //小时加1
  29   4             if(hour==24)                    //如果小时到24
  30   4              {
  31   5               hour=0;                       //小时清零
  32   5               day++;                        //天加1
  33   5               if(day>days_of_month)         //如果天大于本月最后一天
  34   5                {
  35   6                 day=1;                      //天置1
  36   6                 month++;                    //月加1
  37   6                 if(month>12)                //如果月大于12
  38   6                  {
  39   7                   month=1;                  //月置1
  40   7                   year++;                   //年加1
  41   7                   if(year>=100)             //如果年大于100
  42   7                    {
  43   8                     year=0;                 //年清零
  44   8                    }
  45   7                  }
  46   6                }
  47   5              }
  48   4            }
  49   3          }
  50   2        } 
  51   1      }
  52          
  53          #define NORMAL       0
  54          #define SECOND_ADJ   1
  55          #define MINUTE_ADJ   2
C51 COMPILER V7.02a   TIMER                                                                09/12/2008 14:50:32 PAGE 2   

  56          #define HOUR_ADJ     3
  57          #define DAY_ADJ      4
  58          #define MONTH_ADJ    5
  59          #define YEAR_ADJ     6
  60          
  61          #define STATUS_MIN   0
  62          #define STATUS_MAX   6
  63          
  64          unsigned char calculate_days(void)       //计算本月有多少天
  65          {
  66   1       unsigned int temp;
  67   1       switch (month)
  68   1        {
  69   2         case 1:
  70   2         case 3:
  71   2         case 5:
  72   2         case 7:
  73   2         case 8:
  74   2         case 10:
  75   2         case 12:
  76   2                 return 31;  //1、3、5、7、8、10、12月为31天
  77   2                 break;
  78   2         case 4:
  79   2         case 6:
  80   2         case 9:
  81   2         case 11:            //4、6、9、11月为30天
  82   2                 return 30;
  83   2                 break;
  84   2         case 2:
  85   2                 temp=2000+year; //因为year中保存的是年的最后两位,所以要加上2000
  86   2                 if((((temp%4)==0)&&((temp%100)!=0))||((temp%400)==0))
  87   2                  {
  88   3                   return 29;    //闰年2月为29天
  89   3                  }
  90   2                 else
  91   2                  {
  92   3                   return 28;    //平年2月为28天
  93   3                  }
  94   2        }
  95   1      }
  96          
  97          unsigned char flicker_time;     //闪烁频率
  98          unsigned char display_on;       //显示开关标志。用来产生闪烁效果
  99          unsigned char status;           //状态值
 100          unsigned char display_date;     //是否是显示日期
 101          
 102          void timer(void)
 103          {
 104   1       if(key==KEY_FUNCTION)          //如果功能键按下
 105   1        {
 106   2         if(status<STATUS_MAX)status++;   //如果状态值小于对大状态,则状态值加1
 107   2         else status=STATUS_MIN;          //否则,状态值置最小状态值
 108   2         key=0;                           //清键值
 109   2        }
 110   1      
 111   1      
 112   1      /*****************************************************/
 113   1      // 我加入的代码
 114   1      if(key==KEY_ENTER)          //如果确定键按下
 115   1      {
 116   2          status=NORMAL;          
 117   2         key=0;                         
C51 COMPILER V7.02a   TIMER                                                                09/12/2008 14:50:32 PAGE 3   

 118   2      }
 119   1      /*****************************************************/
 120   1      
 121   1       days_of_month=calculate_days();    //计算本月天数
 122   1       switch (status)
 123   1        {
 124   2         case NORMAL:                     //平常状态
 125   2          {
 126   3           if(key==KEY_UP)                //如果上翻键按下,则显示日期
 127   3            {
 128   4             display_date=100;            //设置显示日期的时间
 129   4             key=0;
 130   4            }
 131   3           if(key==KEY_DOWN)             //如果下翻键按下,则显示时间
 132   3            {
 133   4             display_date=0;
 134   4             key=0;
 135   4            }
 136   3           if(display_date)              //如果是显示日期,则计算日期每位
 137   3            {
 138   4             display_buffer[5]=16+day%10;
 139   4             display_buffer[4]=day/10;
 140   4             display_buffer[3]=16+month%10;
 141   4             display_buffer[2]=month/10;
 142   4             display_buffer[1]=16+year%10;
 143   4             display_buffer[0]=year/10;
 144   4             display_date--;               //经过一定时间后,自动显示时间
 145   4            }
 146   3           else                            //如果是显示时间,则计算时间每位                     
 147   3            {
 148   4             display_buffer[5]=second%10;
 149   4             display_buffer[4]=second/10;
 150   4             display_buffer[3]=16+minute%10;
 151   4             display_buffer[2]=minute/10;
 152   4             display_buffer[1]=16+hour%10;
 153   4             display_buffer[0]=hour/10;
 154   4            }
 155   3             display(display_buffer);        //显示结果
 156   3             break;
 157   3          }
 158   2         case SECOND_ADJ:                  //秒调整状态
 159   2          {
 160   3           if(key==KEY_UP)               //上翻键按下,秒增加1
 161   3            {
 162   4             display_on=1;               //开显示,调整时能看清楚
 163   4             second++;
 164   4             if(second>=60)second=0;     //如果秒到60,则清0
 165   4             key=0;
 166   4            }
 167   3           if(key==KEY_DOWN)             //下翻键按下,秒减1
 168   3            {
 169   4             display_on=1;
 170   4             second--;
 171   4             if(second>=60)second=59;
 172   4             key=0;
 173   4            }
 174   3           display_buffer[5]=second%10;   //计算每位值
 175   3           display_buffer[4]=second/10;
 176   3           display_buffer[3]=16+minute%10;
 177   3           display_buffer[2]=minute/10;
 178   3           display_buffer[1]=16+hour%10;
 179   3           display_buffer[0]=hour/10;
C51 COMPILER V7.02a   TIMER                                                                09/12/2008 14:50:32 PAGE 4   

 180   3           if(!display_on)             //如果关显示
 181   3            {
 182   4             flicker_time++;           //闪烁计时加1
 183   4             if(flicker_time>20){flicker_time=0;display_on=1;}   //如果闪烁计时到20,开显示
 184   4             display_buffer[5]=DISPLAY_OFF;
 185   4             //display_buffer[4]=DISPLAY_OFF;
 186   4            }
 187   3           else                       //如果开显示
 188   3            {
 189   4             flicker_time++;           //闪烁计时加1
 190   4             if(flicker_time>30){flicker_time=0;display_on=0;}   //如果闪烁计时到20,关显示
 191   4            }
 192   3           display(display_buffer);
 193   3           break;
 194   3          }
 195   2         case MINUTE_ADJ:       //分调整状态
 196   2          {
 197   3           if(key==KEY_UP)
 198   3            {

⌨️ 快捷键说明

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