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

📄 digitalclock.lst

📁 51单片机的数字时钟代码
💻 LST
字号:
C51 COMPILER V7.08   DIGITALCLOCK                                                          02/13/2006 15:17:11 PAGE 1   


C51 COMPILER V7.08, COMPILATION OF MODULE DIGITALCLOCK
OBJECT MODULE PLACED IN DigitalClock.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE DigitalClock.C BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*******************************************************************************
   2          
   3          ********************************************************************************
   4          *  描述:                                                                       *
   5          *                 简易电子时钟,LED数码管显示                                  *
   6          *                 K1---时调整                                                  *
   7          *                 K2---分调整                                                  *
   8          *                                                                              *
   9          *                 上电时初始化显示:  12-00-00                                  *
  10          *                                                                              *
  11          *           *    ****          ****    ****          ****    ****              *
  12          *           *        *        *    *  *    *        *    *  *    *             *
  13          *           *        *        *    *  *    *        *    *  *    *             *
  14          *           *    ****  ****** *    *  *    * ****** *    *  *    *             *
  15          *           *   *             *    *  *    *        *    *  *    *             *
  16          *           *   *             *    *  *    *        *    *  *    *             *
  17          *           *    ****          ****    ****          ****    ****              *
  18          *                                                                              *
  19          *                                                                              *
  20          
  21          *******************************************************************************/
  22          
  23          #include <reg51.h>
  24          #include <intrins.h>
  25          
  26          unsigned char data dis_digit;
  27          unsigned char key_s, key_v;
  28          
  29          unsigned char code dis_code[11]={0xc0,0xf9,0xa4,0xb0,   // 0, 1, 2, 3
  30                                          0x99,0x92,0x82,0xf8,0x80,0x90, 0xff};// 4, 5, 6, 7, 8, 9, off 
  31          unsigned char data dis_buf[8];
  32          unsigned char data dis_index;
  33          unsigned char hour,min,sec;
  34          unsigned char sec100; 
  35          
  36          sbit    K1 = P3^6;
  37          sbit    K2 = P3^7;
  38          
  39          bit scan_key();
  40          void proc_key();
  41          void inc_sec();
  42          void inc_min();
  43          void inc_hour();
  44          void display();
  45          void delayms(unsigned char ms);
  46          
  47          void main(void)
  48          {
  49   1              P0 = 0xff;
  50   1              P2 = 0xff;
  51   1              TMOD = 0x11;            // 定时器0, 1工作模式1, 16位定时方式
  52   1              TH1 = 0xdc;
  53   1              TL1 = 0;
  54   1      
  55   1              TH0 = 0xFC;
C51 COMPILER V7.08   DIGITALCLOCK                                                          02/13/2006 15:17:11 PAGE 2   

  56   1              TL0 = 0x17;
  57   1              
  58   1              hour = 12;
  59   1              min = 00;
  60   1              sec = 00;
  61   1      
  62   1              sec100 = 0;
  63   1              
  64   1              dis_buf[0] = dis_code[hour / 10];               // 时十位
  65   1              dis_buf[1] = dis_code[hour % 10];               // 时个位
  66   1              dis_buf[3] = dis_code[min / 10];                // 分十位
  67   1              dis_buf[4] = dis_code[min % 10];                // 分个位
  68   1              dis_buf[6] = dis_code[sec / 10];                // 秒十位
  69   1              dis_buf[7] = dis_code[sec % 10];                // 秒个位
  70   1              dis_buf[2] = 0xbf;                                              // 显示"-"
  71   1              dis_buf[5] = 0xbf;                                              // 显示"-"
  72   1                              
  73   1              dis_digit = 0xfe;
  74   1              dis_index = 0;
  75   1              
  76   1              TCON = 0x01;
  77   1              IE = 0x8a;                              // 使能timer0,1 中断
  78   1              
  79   1              TR0 = 1;
  80   1              TR1 = 1;
  81   1      
  82   1              key_v = 0x03;
  83   1      
  84   1              while(1)
  85   1              {
  86   2                      if(scan_key())
  87   2                      {
  88   3                              delayms(10);
  89   3                              if(scan_key())
  90   3                              {
  91   4                                      key_v = key_s;
  92   4                                      proc_key();
  93   4                              }
  94   3                      }
  95   2                      
  96   2              }
  97   1      }
  98          
  99          bit scan_key()
 100          {
 101   1              key_s = 0x00;
 102   1              key_s |= K2;
 103   1              key_s <<= 1;
 104   1              key_s |= K1;
 105   1              return(key_s ^ key_v);  
 106   1      }
 107          
 108          void proc_key()
 109          {
 110   1              EA = 0;
 111   1              if((key_v & 0x01) == 0)         // K1
 112   1              {
 113   2                      inc_hour();
 114   2              }
 115   1              else if((key_v & 0x02) == 0)    // K2
 116   1              {
 117   2                      min++;
C51 COMPILER V7.08   DIGITALCLOCK                                                          02/13/2006 15:17:11 PAGE 3   

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

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


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    502    ----
   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 + -