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

📄 global.lst

📁 KEILC51的始终程序,显示年月日
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.50   GLOBAL                                                                11/12/2006 10:31:38 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE GLOBAL
OBJECT MODULE PLACED IN Global.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE Global.c BROWSE DEBUG OBJECTEXTEND CODE

line level    source

   1          #include "Global.H"
   2          
   3          
   4          //任务及菜单控制
   5          //==============
   6          UNCHAR TaskMode = 1;//任务模式。1.键盘测试 2.HELLO 3.时钟显示
   7          bit     TaskChangeFlag = 0;//请求切换任务标志
   8          UNCHAR Menu1 = 1;//任务中的一级菜单控制变量
   9          UNCHAR Menu2 = 1;//任务中的二级菜单控制变量
  10          UNCHAR Menu3 = 1;//任务中的三级菜单控制变量
  11          
  12          //数码管显示缓冲区。改变此缓冲区中的字型码,即改变相应数码管的显示内容。
  13          //=====================================================================
  14          UNCHAR DisplayBuffer[8];//数码管显示缓冲区,低字节为左边数码管,高字节为右边数码管
  15          
  16          //键盘接口参数
  17          //============
  18          UNCHAR KeyDownFlag = 0;//有键按下标志。应用程序代码不能改变此变量的值,否则会影响键盘的正常工作。
  19          UNCHAR KeyValue = 0;//按键值.有键按下置非0按键扫描码,应用程序读取按键扫描码后需清0.
  20          
  21          UNCHAR MyKey = 0;//自定义的按键值。将系统的按键值转换成自定义的按键值,由函数KeyConvert()完成。
  22          void KeyConvert(void);//完成系统按键值转换成自定义按键值的功能
  23          
  24          
  25          /*
  26          ;==============================================================================
  27          ;|/
  28          ;        ----a----
  29          ;       |                 |
  30          ;       f                 b
  31          ;       |                 |
  32          ;        ----g----                               显示字符编码区
  33          ;       |                 |
  34          ;       e                 c
  35          ;       |                 |
  36          ;        ----d----       .dp
  37          ;
  38          ;显示字节:7(dp),6(g),5(f),4(e),3(d),2(c),1(b),0(a)
  39          ;               
  40          ;带小数点显示时,只需将要显示的字符符号编码值或上0x80即可.
  41          ;
  42          */
  43          
  44          //十六进制数码字符编码
  45          //====================
  46          UNCHAR code HexChar[]={
  47                  0x3F,//0:       00111111B
  48                  0x06,//1:       00000110B
  49                  0x5B,//2:       01011011B
  50                  0x4F,//3:       01001111B
  51                  0x66,//4:       01100110B
  52                  0x6D,//5:       01101101B
  53                  0x7D,//6:       01111101B
  54                  0x07,//7:       00000111B
  55                  0x7F,//8:       01111111B
C51 COMPILER V7.50   GLOBAL                                                                11/12/2006 10:31:38 PAGE 2   

  56                  0x6F,//9:       01101111B
  57                  0x77,//A:       01110111B
  58                  0x7C,//B:       01111100B
  59                  0x39,//C:       00111001B
  60                  0x5E,//D:       01011110B
  61                  0x79,//E:       01111001B
  62                  0x71 //F:       01110001B
  63                  };
  64          
  65          //其它字符编码
  66          //============
  67          UNCHAR code Char_H = 0x76;//01110110B
  68          UNCHAR code Char_L = 0x38;//00111000B
  69          UNCHAR code Char_O = 0x3F;//00111111B
  70          UNCHAR code Char_Colon = 0x09;//00001001B 冒号
  71          UNCHAR code Char_SubSign = 0x40;//01000000B 减号
  72          
  73          
  74          
  75          
  76          //显示控制程序内部使用的变量
  77          //--------------------------
  78          UNCHAR DisplayDigit = 0;//当前数码管显示位的编号,亦即显示数据在显示缓冲区中的偏移量
  79          //键盘扫描程序内部使用的变量
  80          //--------------------------
  81          UNCHAR KeyValueTemp = 0;//临时按键值变量,用于进行20ms延时检测
  82          UNCHAR Key20msDelay = 0;//有键按下时的20ms去抖动延时控制
  83          
  84          //显示键盘控制程序。在Timer2中断服务程序中被调用。
  85          //===============================================
  86          void DisplayKeyboardControl(void) using 3
  87          {
  88   1              UNCHAR KeyTestCode;//扫描键盘时的扫描测试码
  89   1              UNCHAR KeyScanCode;//按键扫描码,为0表示没有键按下
  90   1              UNCHAR i;
  91   1      
  92   1              UNCHAR Digit;//用于计算控制数码位显示的位数据,以便送入DisplayDigitSelect锁存器控制位显示
  93   1      
  94   1              //停止所有数码位的显示
  95   1              //====================
  96   1              XBYTE[DisplayDigitSelect] = 0xFF;
  97   1      
  98   1              //扫描键盘当前是否有键按下
  99   1              //========================
 100   1              KeyScanCode = 0x00 ;//初始化为未检测到有键按下
 101   1              for(i=0;i<8;i++)
 102   1              {
 103   2                      //计算本次扫描测试码
 104   2                      //------------------
 105   2                      KeyTestCode = 0x01;
 106   2                      KeyTestCode <<= i;
 107   2                      KeyTestCode = ~KeyTestCode;
 108   2      
 109   2                      //输出键盘扫描测试码
 110   2                      //------------------
 111   2                      XBYTE[DisplaySegmentSelect] = KeyTestCode;
 112   2      
 113   2                      //检查是否有按键按下
 114   2                      //------------------
 115   2                      if(!P1_0)
 116   2                      {//0路有键按下
 117   3                              KeyScanCode = 2*i + 1;//计算此按键的扫描码
C51 COMPILER V7.50   GLOBAL                                                                11/12/2006 10:31:38 PAGE 3   

 118   3                              break;//退出键盘扫描循环
 119   3                      }
 120   2                      else if(!P1_1)
 121   2                      {//1路有键按下
 122   3                              KeyScanCode = 2*i + 2;//计算此按键的扫描码
 123   3                              break;//退出键盘扫描循环
 124   3                      }
 125   2              }
 126   1              
 127   1              //确定按键是否稳定按下或已经抬起
 128   1              //==============================
 129   1              if(KeyScanCode)
 130   1              {//本次中断有键按下.如果按键已经稳定按下(KeyDownFlag非0)了,则不做任何事,否则处理20ms去抖动延时.
 131   2                      if(!KeyDownFlag)
 132   2                      {//如果未确定按键已经稳定按下时,处理20ms延时
 133   3                              if(Key20msDelay)
 134   3                              {//在20ms延时处理中,继续20ms延时处理
 135   4                                      Key20msDelay++;
 136   4                                      if(Key20msDelay>8)
 137   4                                      {//20ms延时时间到
 138   5                                              if(KeyScanCode == KeyValueTemp)
 139   5                                              {//本次按键扫描码与20ms延时开始时的按键扫描码相同,确定按键稳定按下
 140   6                                                      KeyDownFlag = 1;//标记按键稳定按下
 141   6                                                      KeyValue = KeyScanCode;//将按键扫描码送入按键缓冲区
 142   6                                                      Key20msDelay = 0;//结束20ms延时状态
 143   6                                              }
 144   5                                              else
 145   5                                              {//20ms延时前后的扫描码不相同,以最后一次的扫描码来启动新的20ms去抖动延时
 146   6                                                      KeyValueTemp = KeyScanCode;//记下20ms延时开始时的按键扫描码
 147   6                                                      Key20msDelay = 1;//重新进入20ms延时处理
 148   6                                              }
 149   5                                      }
 150   4                              }
 151   3                              else
 152   3                              {//未进入20ms延时处理时,启动20ms延时处理
 153   4                                      KeyValueTemp = KeyScanCode;//记下20ms延时开始时的按键扫描码
 154   4                                      Key20msDelay = 1;//进入20ms延时处理
 155   4                              }
 156   3                      }
 157   2              }
 158   1              else
 159   1              {//本次中断无键按下
 160   2                      if(Key20msDelay)
 161   2                      {//在20ms延时处理中,继续20ms延时处理
 162   3                              Key20msDelay++;
 163   3                              if(Key20msDelay>8)
 164   3                              {//20ms延时时间到,说明启动20ms延时的按键信号是干扰信号,直接结束20ms延时状态
 165   4                                      Key20msDelay = 0;//结束20ms延时状态
 166   4                              }
 167   3                      }
 168   2                      else
 169   2                      {//未进入20ms延时处理时
 170   3                              KeyDownFlag = 0;//标记按键已经抬起
 171   3                      }
 172   2              }
 173   1      
 174   1              //显示下一个数码位
 175   1              //================
 176   1              DisplayDigit++;//指向新的要显示的数码管
 177   1              if(DisplayDigit>=8) DisplayDigit = 0;
 178   1      
 179   1              XBYTE[DisplaySegmentSelect] = DisplayBuffer[DisplayDigit];//送段显示数据,确定要显示的字型
C51 COMPILER V7.50   GLOBAL                                                                11/12/2006 10:31:38 PAGE 4   

 180   1      
 181   1              //计算位显示锁存器数据
 182   1              //--------------------
 183   1              Digit = 0x01;//0000 0001
 184   1              Digit <<= DisplayDigit;
 185   1              Digit = ~Digit;
 186   1      
 187   1              XBYTE[DisplayDigitSelect] = Digit;//送位显示数据,确定要显示的数码位
 188   1      }
 189          
 190          //完成系统按键值转换成自定义按键值的功能.在main()的主循环中被调用
 191          //===============================================================
 192          void KeyConvert(void)
 193          {
 194   1              if(KeyValue)
 195   1              {
 196   2                      switch(KeyValue)
 197   2                      {
 198   3                              case 1:  MyKey = 1; break;
 199   3                              case 2:  MyKey = 2; break;
 200   3                              case 3:  MyKey = 3; break;
 201   3                              case 4:  MyKey = 4; break;
 202   3                              case 5:  MyKey = 5; break;
 203   3                              case 6:  MyKey = 6; break;
 204   3                              case 7:  MyKey = 7; break;
 205   3                              case 8:  MyKey = 8; break;
 206   3                              case 9:  MyKey = 9; break;
 207   3                              case 10: MyKey = 10;break;
 208   3                              case 11: MyKey = 11;break;
 209   3                              case 12: MyKey = 12;break;
 210   3                              case 13: MyKey = 13;break;
 211   3                              case 14: MyKey = 14;break;
 212   3                              case 15: MyKey = 15;break;
 213   3                              case 16: MyKey = 16;break;
 214   3                      }
 215   2      
 216   2                      KeyValue = 0;
 217   2              }
 218   1      }
C51 COMPILER V7.50   GLOBAL                                                                11/12/2006 10:31:38 PAGE 5   

ASSEMBLY LISTING OF GENERATED OBJECT CODE


             ; FUNCTION DisplayKeyboardControl (BEGIN)
0000 C0D0              PUSH    PSW
0002 75D018            MOV     PSW,#018H
                                           ; SOURCE LINE # 86
                                           ; SOURCE LINE # 96
0005 90FDFF            MOV     DPTR,#0FDFFH
0008 74FF              MOV     A,#0FFH
000A F0                MOVX    @DPTR,A
                                           ; SOURCE LINE # 100
;---- Variable 'KeyScanCode' assigned to Register 'R7' ----
000B E4                CLR     A
000C FF                MOV     R7,A
                                           ; SOURCE LINE # 101
;---- Variable 'i' assigned to Register 'R6' ----
000D FE                MOV     R6,A
000E         ?C0001:
                                           ; SOURCE LINE # 102
                                           ; SOURCE LINE # 105
;---- Variable 'KeyTestCode' assigned to Register 'R5' ----
000E 7D01              MOV     R5,#01H
                                           ; SOURCE LINE # 106
0010 ED                MOV     A,R5
0011 A81E              MOV     R0,AR6
0013 08                INC     R0
0014 8002              SJMP    ?C0040
0016         ?C0039:
0016 C3                CLR     C
0017 33                RLC     A
0018         ?C0040:
0018 D8FC              DJNZ    R0,?C0039
001A FD                MOV     R5,A
                                           ; SOURCE LINE # 107
001B 631DFF            XRL     AR5,#0FFH
                                           ; SOURCE LINE # 111
001E 90FEFF            MOV     DPTR,#0FEFFH
0021 ED                MOV     A,R5
0022 F0                MOVX    @DPTR,A
                                           ; SOURCE LINE # 115
0023 209007            JB      P1_0,?C0004
                                           ; SOURCE LINE # 116
                                           ; SOURCE LINE # 117
0026 EE                MOV     A,R6
0027 25E0              ADD     A,ACC
0029 04                INC     A

⌨️ 快捷键说明

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