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

📄 main.lst

📁 51单片机电子时钟源码,数码管显示,经过实物验证
💻 LST
字号:
C51 COMPILER V8.08   MAIN                                                                  05/14/2009 21:52:33 PAGE 1   


C51 COMPILER V8.08, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include <reg51.h>
   2          #include <intrins.h>
   3          #define uchar unsigned char
   4          
   5          void delay_ms(uchar ms);  // 延时毫秒@12M,ms最大值255
   6          void key_scan();          // 按键扫描
   7          void key_to();            // 按键处理
   8          
   9          /*uchar code dis_code[11] = {0xc0,0xf9,0xa4,0xb0,0x99,       //段码表
  10                                    // 0    1    2    3    4         对应内容
  11                                     0x92,0x82,0xf8,0x80,0x90,0xbf};
  12                                    // 5    6    7    8    9    -
  13          */
  14          uchar code dis_code[11] = {0x28,0x7E,0xA2,0x62,0x74,0x61,0x21,0x7A,0x20,0x60,0xf7};
  15          
  16          uchar data dis[8];       // dis[0]为秒个位值,dis[1]为秒十位值
  17                                   // dis[2],dis[5]为'-'段码的偏移量
  18                                   // dis[3]为分个位值,dis[4为分十位值
  19                                   // dis[6]为时个位值,dis[7]为时十位值
  20          
  21          uchar data sec = 0;      // 秒计数器(00s-59s)
  22          uchar data min = 0;      // 分计数器(00m-59m)
  23          uchar data hou = 0;      // 时计数器)00h-23h)
  24          
  25          uchar data cou  = 0;     // 软计数器,对10ms时基信号累加到1s
  26          
  27          uchar data dis_b;        // dis_b为位码选通数码管
  28          uchar data dis_r;        // dis_r为取段码时的偏移量
  29          
  30          uchar data key_v = 0;    // 存储键值
  31          uchar data key_t = 0;    // 按键扫描中临时存储键值
  32          
  33          void main()
  34          {
  35   1          P2 = 0xff;           // 关所有数码管
  36   1          P1 = 0xff;           // p1为准双向口,作输入时先写1
  37   1          dis[2] = 10;         // '-'在段码表中偏移量为10
  38   1          dis[5] = 10;         // '-'在段码表中偏移量为10
  39   1          dis_b = 0x7f;        // 初始选通P2.7口数码管
  40   1          dis_r = 0;           // 初始化偏移量为0
  41   1          
  42   1          TMOD = 0x11;         // 定时/计数器0,1工作于方式1
  43   1          TH0 = 0xd8;          // 预置定时常数55536(d8f0),产生10ms时基信号
  44   1          TL0 = 0xf0;
  45   1          TH1 = 0xfc;          // 预置定时常数64536(fc18),产生1ms间隔用于动态显示
  46   1          TL1 = 0x18;
  47   1          EA = 1;              // 开总中断
  48   1          ET0 = 1;             // 定时/计数器0允许中断
  49   1          ET1 = 1;             // 定时/计数器1允许中断
  50   1          TR0 = 1;             // 开闭定时/计数器0
  51   1          TR1 = 1;             // 启动定时/计数器1
  52   1          while(1)
  53   1          {
  54   2              key_t = P1;            // 读入键值
  55   2              if(key_t != key_v)     // 键值改变
C51 COMPILER V8.08   MAIN                                                                  05/14/2009 21:52:33 PAGE 2   

  56   2              {
  57   3                  delay_ms(10);      // 延时10ms消抖
  58   3                  key_t = P1;        // 再次读入键值
  59   3                  if(key_t != key_v) // 键值仍未改变则不是抖动
  60   3                  {
  61   4                      key_v = key_t; // 保存键值
  62   4                      key_to();      // 键处理
  63   4                  }
  64   3              }
  65   2          }
  66   1      }
  67          void key_to()                  // 按键处理子程序
  68          {
  69   1          if(key_v == 0xef)          // P1.4口键值
  70   1          {
  71   2              if(min == 59)          // 分计数已加到59
  72   2                  min = 0;           // 清零之
  73   2              else
  74   2                  min++;             // 否则加1
  75   2          }
  76   1          else if(key_v == 0xdf)      // P1.5口键值
  77   1              {
  78   2                  if(hou == 23)      // 时计数已加到23
  79   2                      hou = 0;       // 清零之
  80   2                  else
  81   2                      hou++;         // 否则加1
  82   2              }
  83   1              else if(key_v==0xbf)
  84   1                   sec=0;
  85   1      
  86   1      }
  87          void time0(void) interrupt 1   // T/C0中断服务程序(产生10ms时基信号)
  88          {
  89   1          cou++;                     // 软计数器加1
  90   1          if(cou == 100)             // 计数值到100(1s)
  91   1          {
  92   2              cou = 0;               // 软计数器清零
  93   2              sec++;                 // 秒计数器加1(进位10ms*100=1s)
  94   2              if(sec == 60)          // 秒计数值到60
  95   2              {
  96   3                  sec = 0;           // 秒计数器清零
  97   3                  min++;             // 分计数器加1(进位60s=1m)
  98   3                  if(min == 60)      // 分计数到60
  99   3                  {
 100   4                      min = 0;       // 分计数器清零
 101   4                      hou++;         // 时计数器加1(进位60m=1h)
 102   4                      if(hou == 23)  // 时计数到23
 103   4                          hou = 0;   // 时计数器清零
 104   4                  }
 105   3              }
 106   2          }
 107   1          TH0 = 0xd8;                // 重置定时常数
 108   1          TL0 = 0xf0;
 109   1      }
 110          void time1(void) interrupt 3   // T/C1中断服务程序(延时1ms数码管动态显示)
 111          {
 112   1          dis[0] = sec % 10;         // 秒计数器个位赋绐dis[0]
 113   1          dis[1] = sec / 10;         // 秒计数器十位赋绐dis[1]
 114   1          dis[3] = min % 10;         // 分计数器个位赋绐dis[3]
 115   1          dis[4] = min / 10;         // 分计数器十位赋绐dis[4]
 116   1          dis[6] = hou % 10;         // 时计数器个位赋绐dis[6]
 117   1          dis[7] = hou / 10;         // 时计数器十位赋绐dis[7]
C51 COMPILER V8.08   MAIN                                                                  05/14/2009 21:52:33 PAGE 3   

 118   1      
 119   1          P0 = dis_code[dis[dis_r]]; // 段码送P0口(dis[0]...dis[7])
 120   1          P2 = dis_b;                // 位码送P2口
 121   1      
 122   1          dis_r++;                   // 偏移量加1,下次中断时显示下个数
 123   1          dis_r &= 0x07;             // dis_r增到8时自动清0(使之在0到7间循环)
 124   1          
 125   1          dis_b = _cror_(dis_b,1);   // 位码循环右移,下次中断时选通下个数码管
 126   1      
 127   1          TH1 = 0xfc;                // 重置定时常数
 128   1          TL1 = 0x18;
 129   1      
 130   1      }
 131          void delay_ms(uchar ms)       // 延时毫秒@12M,ms最大值255
 132          {
 133   1          uchar i;
 134   1          while(ms--)
 135   1              for(i = 0; i < 124; i++);
 136   1      }


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