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

📄 wl010.lst

📁 伟纳电子ME500B单片机开发系统演示程序 - 数码管显示简易电子时钟
💻 LST
字号:
C51 COMPILER V7.06   WL010                                                                 06/07/2008 09:21:42 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE WL010
OBJECT MODULE PLACED IN wl010.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE wl010.C ROM(SMALL) BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          /*******************************************************************************
   2          *  标题:  伟纳电子ME500B单片机开发系统演示程序 - 数码管显示简易电子时钟        *
   3          *  文件:  wl010.C                                                              *
   4          *  日期:  2004-1-5                                                             *
   5          *  版本:  1.0                                                                  *
   6          *  作者:  伟纳电子 - Freeman                                                   *
   7          *  邮箱:  freeman@willar.com                                                   *
   8          *  网站: http://www.willar.com                                                *
   9          ********************************************************************************
  10          *  描述:                                                                       *
  11          *                 简易电子时钟,LED数码管显示                                  *
  12          *                 K1---时调整                                                  *
  13          *                 K2---分调整                                                  *
  14          *                                                                              *
  15          *                 上电时初始化显示:  12-00-00                                  *
  16          *                                                                              *
  17          *           *    ****          ****    ****          ****    ****              *
  18          *           *        *        *    *  *    *        *    *  *    *             *
  19          *           *        *        *    *  *    *        *    *  *    *             *
  20          *           *    ****  ****** *    *  *    * ****** *    *  *    *             *
  21          *           *   *             *    *  *    *        *    *  *    *             *
  22          *           *   *             *    *  *    *        *    *  *    *             *
  23          *           *    ****          ****    ****          ****    ****              *
  24          *                                                                              *
  25          *                                                                              *
  26          ********************************************************************************
  27          * 【版权】 Copyright(C)伟纳电子 www.willar.com  All Rights Reserved            *
  28          * 【声明】 此程序仅用于学习与参考,引用请注明版权和作者信息!                  *
  29          *******************************************************************************/
  30          
  31          #include <reg51.h>
  32          #include <intrins.h>
  33          
  34          unsigned char data dis_digit;
  35          unsigned char key_s, key_v;
  36          
  37          unsigned char code dis_code[11]={0xc0,0xf9,0xa4,0xb0,   // 0, 1, 2, 3
  38                                          0x99,0x92,0x82,0xf8,0x80,0x90, 0xff};// 4, 5, 6, 7, 8, 9, off 
  39          unsigned char data dis_buf[8];
  40          unsigned char data dis_index;
  41          unsigned char hour,min,sec;
  42          unsigned char sec100; 
  43          
  44          sbit    K1 = P1^4;
  45          sbit    K2 = P1^5;
  46          
  47          bit scan_key();
  48          void proc_key();
  49          void inc_sec();
  50          void inc_min();
  51          void inc_hour();
  52          void display();
  53          void delayms(unsigned char ms);
  54          
  55          void main(void)
C51 COMPILER V7.06   WL010                                                                 06/07/2008 09:21:42 PAGE 2   

  56          {
  57   1              P0 = 0xff;
  58   1              P2 = 0xff;
  59   1              TMOD = 0x11;            // 定时器0, 1工作模式1, 16位定时方式
  60   1              TH1 = 0xdc;
  61   1              TL1 = 0;
  62   1      
  63   1              TH0 = 0xFC;
  64   1              TL0 = 0x17;
  65   1              
  66   1              hour = 12;
  67   1              min = 00;
  68   1              sec = 00;
  69   1      
  70   1              sec100 = 0;
  71   1              
  72   1              dis_buf[0] = dis_code[hour / 10];               // 时十位
  73   1              dis_buf[1] = dis_code[hour % 10];               // 时个位
  74   1              dis_buf[3] = dis_code[min / 10];                // 分十位
  75   1              dis_buf[4] = dis_code[min % 10];                // 分个位
  76   1              dis_buf[6] = dis_code[sec / 10];                // 秒十位
  77   1              dis_buf[7] = dis_code[sec % 10];                // 秒个位
  78   1              dis_buf[2] = 0xbf;                                              // 显示"-"
  79   1              dis_buf[5] = 0xbf;                                              // 显示"-"
  80   1                              
  81   1              dis_digit = 0xfe;
  82   1              dis_index = 0;
  83   1              
  84   1              TCON = 0x01;
  85   1              IE = 0x8a;                              // 使能timer0,1 中断
  86   1              
  87   1              TR0 = 1;
  88   1              TR1 = 1;
  89   1      
  90   1              key_v = 0x03;
  91   1      
  92   1              while(1)
  93   1              {
  94   2                      if(scan_key())
  95   2                      {
  96   3                              delayms(10);
  97   3                              if(scan_key())
  98   3                              {
  99   4                                      key_v = key_s;
 100   4                                      proc_key();
 101   4                              }
 102   3                      }
 103   2                      
 104   2              }
 105   1      }
 106          
 107          bit scan_key()
 108          {
 109   1              key_s = 0x00;
 110   1              key_s |= K2;
 111   1              key_s <<= 1;
 112   1              key_s |= K1;
 113   1              return(key_s ^ key_v);  
 114   1      }
 115          
 116          void proc_key()
 117          {
C51 COMPILER V7.06   WL010                                                                 06/07/2008 09:21:42 PAGE 3   

 118   1              EA = 0;
 119   1              if((key_v & 0x01) == 0)         // K1
 120   1              {
 121   2                      inc_hour();
 122   2              }
 123   1              else if((key_v & 0x02) == 0)    // K2
 124   1              {
 125   2                      min++;
 126   2                      if(min > 59)
 127   2                      {
 128   3                              min = 0;
 129   3                      }
 130   2                      dis_buf[3] = dis_code[min / 10];                // 分十位
 131   2                      dis_buf[4] = dis_code[min % 10];                // 分个位
 132   2              }
 133   1      
 134   1              EA = 1;
 135   1      }
 136          
 137          void timer0() interrupt 1
 138          // 定时器0中断服务程序, 用于数码管的动态扫描
 139          // dis_index --- 显示索引, 用于标识当前显示的数码管和缓冲区的偏移量
 140          // dis_digit --- 位选通值, 传送到P2口用于选通当前数码管的数值, 如等于0xfe时,
 141          //                              选通P2.0口数码管
 142          // dis_buf   --- 显于缓冲区基地址       
 143          {
 144   1              TH0 = 0xFC;
 145   1              TL0 = 0x17;
 146   1              
 147   1              P2 = 0xff;                                                      // 先关闭所有数码管
 148   1              P0 = dis_buf[dis_index];                        // 显示代码传送到P0口
 149   1              P2 = dis_digit;                                         // 
 150   1      
 151   1              dis_digit = _crol_(dis_digit,1);        // 位选通值左移, 下次中断时选通下一位数码管
 152   1              dis_index++;                                            // 
 153   1                                              
 154   1              dis_index &= 0x07;                      // 8个数码管全部扫描完一遍之后,再回到第一个开始下一次扫描
 155   1      } 
 156          
 157          void timer1() interrupt 3
 158          {
 159   1              TH1 = 0xdc;
 160   1              
 161   1              sec100++;
 162   1              
 163   1              if(sec100 >= 100)
 164   1              {
 165   2                      sec100 = 0;
 166   2                      inc_sec();
 167   2              }
 168   1      }
 169          
 170          void inc_sec()
 171          {
 172   1              sec++;
 173   1              if(sec > 59)
 174   1              {
 175   2                      sec = 0;
 176   2                      inc_min();
 177   2              }
 178   1              dis_buf[6] = dis_code[sec / 10];                // 秒十位
 179   1              dis_buf[7] = dis_code[sec % 10];                // 秒个位       
C51 COMPILER V7.06   WL010                                                                 06/07/2008 09:21:42 PAGE 4   

 180   1      }
 181          
 182          void inc_min()
 183          {
 184   1              min++;
 185   1              if(min > 59)
 186   1              {
 187   2                      min = 0;
 188   2                      inc_hour();
 189   2              }
 190   1              dis_buf[3] = dis_code[min / 10];                // 分十位
 191   1              dis_buf[4] = dis_code[min % 10];                // 分个位
 192   1      }
 193          
 194          void inc_hour()
 195          {
 196   1              hour++;
 197   1              if(hour > 23)
 198   1              {
 199   2                      hour = 0;
 200   2              }
 201   1              if(hour > 9)
 202   1                      dis_buf[0] = dis_code[hour / 10];               // 时十位
 203   1              else
 204   1                      dis_buf[0] = 0xff;                                      // 当小时的十位为0时不显示
 205   1              dis_buf[1] = dis_code[hour % 10];               // 时个位
 206   1      
 207   1      }
 208          
 209          
 210          void delayms(unsigned char ms)  
 211          // 延时子程序
 212          {                                               
 213   1              unsigned char i;
 214   1              while(ms--)
 215   1              {
 216   2                      for(i = 0; i < 120; i++);
 217   2              }
 218   1      }
 219          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    494    ----
   CONSTANT SIZE    =     11    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     16    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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