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

📄 timer.lst

📁 用89C51做的一个简单的电子钟
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.06   TIMER                                                                 03/08/2006 13:20:05 PAGE 1   


C51 COMPILER V7.06, 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          /*
   2           timer.c file
   3           Created by Computer-lov. Date: 2005.5.31
   4           Last edited date:2005.5.31
   5           Copyright (c) 2005 Computer-lov
   6           version 1.0
   7           All rigths reserved
   8           欢迎访问我的blog:  http://computer00.21ic.org
   9          */
  10          
  11          #include "timer.h"
  12          #include "main.h"
  13          #include "keyboard.h"
  14          #include "led.h"
  15          
  16          unsigned char display_buffer[6];        //显示缓冲区
  17          
  18          unsigned char second,minute,hour,day,month,year;  //分别保存秒、分、时、天、月、年的变量
  19          unsigned char n_50m_second;             //保存多少个50毫秒的变量
  20          unsigned char days_of_month;            //保存该月多少天的变量
  21          
  22          void timer0_isr(void) interrupt 1 using 1      //定时器0中断处理函数
  23          {
  24   1       TL0=0xB9;
  25   1       TH0=0x3C;                              //定时器重装。定时50mS中断一次
  26   1       n_50m_second++;
  27   1       if(n_50m_second>=20)                  //1秒到
  28   1        {
  29   2         n_50m_second=0;                     //清50毫秒计数
  30   2         second++;                           //秒加1
  31   2         if(second==60)                      //如果秒到60
  32   2          {
  33   3           second=0;                         //秒清0
  34   3           minute++;                         //分加1
  35   3           if(minute==60)                    //如果分到60
  36   3            {
  37   4             minute=0;                       //分清0
  38   4             hour++;                         //小时加1
  39   4             if(hour==24)                    //如果小时到24
  40   4              {
  41   5               hour=0;                       //小时清零
  42   5               day++;                        //天加1
  43   5               if(day>days_of_month)         //如果天大于本月最后一天
  44   5                {
  45   6                 day=1;                      //天置1
  46   6                 month++;                    //月加1
  47   6                 if(month>12)                //如果月大于12
  48   6                  {
  49   7                   month=1;                  //月置1
  50   7                   year++;                   //年加1
  51   7                   if(year>=100)             //如果年大于100
  52   7                    {
  53   8                     year=0;                 //年清零
  54   8                    }
  55   7                  }
C51 COMPILER V7.06   TIMER                                                                 03/08/2006 13:20:05 PAGE 2   

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

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

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

⌨️ 快捷键说明

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