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

📄 timer.lst

📁 单片机 电子钟 是用c语言编程的
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.50   TIMER                                                                 06/22/2008 15:54:32 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE TIMER
OBJECT MODULE PLACED IN timer.OBJ
COMPILER INVOKED BY: E:\program\C51\BIN\C51.EXE timer.c BROWSE DEBUG OBJECTEXTEND

line level    source

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

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

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

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

⌨️ 快捷键说明

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