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

📄 timer.lst

📁 单片机数字钟-LCD1602显示 带四键时钟 按键对应关系: key1 —— 减 key2 —— 加 key3 —— 设定 key4 —— 确定
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.02a   TIMER                                                                05/05/2007 09:01:00 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          /*
   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          #include "LCD1602.h"
  16          
  17          unsigned char display_buffer[6];        //显示缓冲区
  18          
  19          unsigned char second,minute,hour,day,month,year;  //分别保存秒、分、时、天、月、年的变量
  20          unsigned char n_50m_second;             //保存多少个50毫秒的变量
  21          unsigned char days_of_month;            //保存该月多少天的变量
  22          
  23          void timer0_isr(void) interrupt 1 using 1      //定时器0中断处理函数
  24          {
  25   1       TL0=0xB9;
  26   1       TH0=0x3C;                              //定时器重装。定时50mS中断一次
  27   1       n_50m_second++;
  28   1       if(n_50m_second>=20)                  //1秒到
  29   1        {
  30   2         n_50m_second=0;                     //清50毫秒计数
  31   2         second++;                           //秒加1
  32   2         if(second==60)                      //如果秒到60
  33   2          {
  34   3           second=0;                         //秒清0
  35   3           minute++;                         //分加1
  36   3           if(minute==60)                    //如果分到60
  37   3            {
  38   4             minute=0;                       //分清0
  39   4             hour++;                         //小时加1
  40   4             if(hour==24)                    //如果小时到24
  41   4              {
  42   5               hour=0;                       //小时清零
  43   5               day++;                        //天加1
  44   5               if(day>days_of_month)         //如果天大于本月最后一天
  45   5                {
  46   6                 day=1;                      //天置1
  47   6                 month++;                    //月加1
  48   6                 if(month>12)                //如果月大于12
  49   6                  {
  50   7                   month=1;                  //月置1
  51   7                   year++;                   //年加1
  52   7                   if(year>=100)             //如果年大于100
  53   7                    {
  54   8                     year=0;                 //年清零
  55   8                    }
C51 COMPILER V7.02a   TIMER                                                                05/05/2007 09:01:00 PAGE 2   

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

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

 180   4             display_on=1;
 181   4             second--;
 182   4             if(second>=60)second=59;
 183   4             key=0;
 184   4            }
 185   3           display_buffer[5]=second%10;   //计算每位值
 186   3           display_buffer[4]=second/10;
 187   3           display_buffer[3]=16+minute%10;
 188   3           display_buffer[2]=minute/10;
 189   3           display_buffer[1]=16+hour%10;
 190   3           display_buffer[0]=hour/10;
 191   3           if(!display_on)             //如果关显示
 192   3            {
 193   4             flicker_time++;           //闪烁计时加1
 194   4             if(flicker_time>20){flicker_time=0;display_on=1;}   //如果闪烁计时到20,开显示
 195   4             display_buffer[5]=DISPLAY_OFF;
 196   4             //display_buffer[4]=DISPLAY_OFF;
 197   4            }
 198   3           else                       //如果开显示
 199   3            {
 200   4             flicker_time++;           //闪烁计时加1
 201   4             if(flicker_time>30){flicker_time=0;display_on=0;}   //如果闪烁计时到20,关显示
 202   4            }
 203   3           display(display_buffer);

⌨️ 快捷键说明

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