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

📄 keyled.lst

📁 在keil平台下用c语言开发的基于89c2051的小程序
💻 LST
字号:
C51 COMPILER V7.02a   KEYLED                                                               04/25/2006 13:40:53 PAGE 1   


C51 COMPILER V7.02a, COMPILATION OF MODULE KEYLED
OBJECT MODULE PLACED IN KeyLed.OBJ
COMPILER INVOKED BY: E:\Program Files\Keil\C51\BIN\C51.EXE KeyLed.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          #include <stdio.h>
   2          #include <reg51all.h>
   3          #include <intrins.h>
   4          
   5          #define SEGCODE    P1                                   // 数码管字型码由P1输出,A~H对应D7~D0,0点亮,1熄灭
   6          #define POSCTRL0   P34                                  
   7          #define POSCTRL1   P35
   8          #define LS0                P30                                  // 位置码同时作为键盘列扫描码,共8列,2行
   9          #define LS1                P31                                  // 行扫描由P36,P37完成,D0~D7对应1~8列,为0表示有键按下
  10          #define JCON0      P32                  //继电器选通
  11          #define JCON1      P33                  //继电器选通
  12          #define BRAY       P37 
  13          
  14          
  15          unsigned char Row,Col;                                  // 按键的行列值
  16          unsigned char ucTH,ucTL;                // 定时器初值
  17          unsigned char start,set,position,ii;    //按键设置标记和选路标记
  18          unsigned char hnum,lnum;                //定时数的高位和低位
  19          
  20          unsigned char count[2];                 //定时数
  21          int jj;                                 //中断计数
  22          unsigned char logo;                     //倒计时时间到标记
  23          /*******************************************************************************
  24          键盘连接方式:
  25                          C0      C1
  26                  R0 -|---|-      P30
  27                  R1 -|---|-      P31
  28                          P34     P35     
  29          *******************************************************************************/
  30          
  31          
  32          // 根据A~H对应D7~D0的关系设定0~F的字形码
  33          unsigned char code SEGTABLE[] = {
  34                  0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x5f,0x7c,0x58,0x5e,0x79,0x71};
  35          
  36          unsigned char CurrRow[2],CurrCol[2],LastRow[2],LastCol[2];              // 存放当前和前次两行和两列扫描码
  37          
  38          //******************************************************************************
  39          // 函数名:T0ISR
  40          // 功  能:2.5ms中断服务程序
  41          // 作  者:mudfish 2005-10-31 10:12
  42          // 注  释:
  43          //******************************************************************************
  44          void T0ISR(void) interrupt 1
  45          {
  46   1              unsigned char i,j,k;
  47   1      
  48   1              // 重新设置定时常数
  49   1              TH0 = ucTH;
  50   1              TL0 = ucTL;
  51   1              TR0 = 1;
  52   1      
  53   1              if(logo==1)        //倒计时时间到标记
  54   1                      BRAY=1;       //鸣叫1秒
  55   1              else BRAY=0;      //关闭鸣叫
C51 COMPILER V7.02a   KEYLED                                                               04/25/2006 13:40:53 PAGE 2   

  56   1              
  57   1              // 先进行键盘扫描
  58   1              SEGCODE = 0xff;                                         // 关闭所有段显示
  59   1              CurrRow[0] = 0;
  60   1              CurrRow[1] = 0;
  61   1              CurrCol[0] = 0;
  62   1              CurrCol[1] = 0;
  63   1      
  64   1                      POSCTRL0 = 0;                           // 当前扫描列送0
  65   1                      POSCTRL1 = 1;
  66   1                      LS0 = 1;
  67   1                      _nop_();_nop_();_nop_();_nop_();
  68   1                      if(LS0 == 0) 
  69   1                      {
  70   2                              CurrRow[0] =1;
  71   2                              CurrCol[0]=1;   // 该位置0
  72   2                      }
  73   1      
  74   1                      LS1 = 1;
  75   1                      _nop_();_nop_();_nop_();_nop_();
  76   1                      if(LS1 == 0) 
  77   1                      {
  78   2                              CurrRow[1] =1;
  79   2                              CurrCol[0]=1;   // 该位置1
  80   2                      }
  81   1      
  82   1      
  83   1      
  84   1                      POSCTRL0 = 1;
  85   1                      POSCTRL1 = 0;                           // 当前扫描列送0
  86   1                      LS0 = 1;
  87   1                      _nop_();_nop_();_nop_();_nop_();
  88   1                      if(LS0 == 0) 
  89   1                      {
  90   2                              CurrRow[0] =1;
  91   2                              CurrCol[1]=1;   // 该位置1
  92   2                      }
  93   1      
  94   1                      LS1 = 1;
  95   1                      _nop_();_nop_();_nop_();_nop_();
  96   1                      if(LS1 == 0) 
  97   1                      {
  98   2                              CurrRow[1] =1;
  99   2                              CurrCol[1]=1;   // 该位置1
 100   2                      }
 101   1      
 102   1      
 103   1                      
 104   1              // 扫描完成                                                             
 105   1      
 106   1              // 开始按键处理
 107   1      
 108   1              Row = 0xff;                                             // 缺省无按键状态
 109   1              Col = 0xff;
 110   1              for(j=0;j<2;j++)
 111   1              {
 112   2                      if( (CurrRow[j]^LastRow[j]) != 0)               // 按键状态有变化
 113   2                      {
 114   3                              for(i=0;i<2;i++)
 115   3                              {
 116   4                                      if( LastCol[i]== 1 )
 117   4                                      {
C51 COMPILER V7.02a   KEYLED                                                               04/25/2006 13:40:53 PAGE 3   

 118   5                                              Row = j;                // 本次扫描按键状态有变化且上次为按下
 119   5                                              Col = i;                // 说明本次为按键松开,有效
 120   5                                              break;                  // 每次只处理一个按键
 121   5                                      }
 122   4                              }
 123   3                      }
 124   2                      if( (Row!=0xff) && (Col!=0xff) ) break;         // 每次只处理一个按键
 125   2              }
 126   1              
 127   1              for(j=0;j<2;j++) 
 128   1              {
 129   2                      LastRow[j] = CurrRow[j];
 130   2                      LastCol[j]=CurrCol[j];         // 将本次扫描码保存到上次扫描码
 131   2              }
 132   1      
 133   1      
 134   1      //加法按键
 135   1              if(Row==0 && Col==0)              
 136   1              {
 137   2                      count[position]=count[position]+1;           //加1
 138   2                      if(count>99)
 139   2                              count[position]=0;                       //值0~99
 140   2              BRAY=1;                                      //鸣叫
 141   2              }
 142   1      
 143   1      //减法按键
 144   1              if(Row==0 && Col==1)              
 145   1              {
 146   2                      count[position]=count[position]-1;            //减1
 147   2                      if(count<0)                                   //值0~99
 148   2                              count[position]=99;
 149   2                      BRAY=1;                                       //鸣叫
 150   2              }
 151   1      
 152   1      //选路按键
 153   1              if(Row==1 && Col==0)              
 154   1              {
 155   2                      set=1;                        //设置标志
 156   2                      start=0;
 157   2                      position=(position+1)%2;      //选路
 158   2              BRAY=1;                       //鸣叫
 159   2              }
 160   1      
 161   1      //开始倒计时按键
 162   1              if(Row==1 && Col==1)              
 163   1              {
 164   2                      set=0;
 165   2                      start=1;                    //开始标记
 166   2                      JCON0=1;                    //继电器0选通
 167   2                      JCON1=1;                    //继电器1选通
 168   2                      BRAY=1;                     //鸣叫
 169   2              }
 170   1      
 171   1      //设置倒计时间时数码管的显示处理
 172   1              if(set==1)
 173   1              {
 174   2                      hnum=count[position]/10;    //高位
 175   2                      lnum=count[position]%10;    //低位
 176   2                      POSCTRL0=1;                   //显示高位
 177   2                      POSCTRL1=0;
 178   2                      SEGCODE=SEGTABLE[hnum];
 179   2                      _nop_();_nop_();_nop_();_nop_();
C51 COMPILER V7.02a   KEYLED                                                               04/25/2006 13:40:53 PAGE 4   

 180   2                      POSCTRL0=0;
 181   2                      POSCTRL1=1;                  //显示低位
 182   2                      SEGCODE=SEGTABLE[lnum];
 183   2                      
 184   2              }
 185   1      
 186   1      //开始倒计后的显示处理和计时到处理
 187   1              if(start==1)
 188   1              {               
 189   2                      hnum=count[ii]/10;              //高位
 190   2                      lnum=count[ii]%10;              //低位
 191   2      
 192   2                      POSCTRL0=1;                     //显示高位
 193   2                      POSCTRL1=0;
 194   2                      SEGCODE=SEGTABLE[hnum];
 195   2                      _nop_();_nop_();_nop_();_nop_();
 196   2      
 197   2                      POSCTRL0=0;
 198   2                      POSCTRL1=1;                     //显示低位
 199   2                      SEGCODE=SEGTABLE[lnum];
 200   2                              
 201   2                      jj++;
 202   2                      if(jj>200) ii=(ii+1)%2;         //0.5秒 显示另外一路
 203   2                      if(jj>400)                      //1秒 
 204   2                  {
 205   3                              jj=1;
 206   3                              logo=0;                      //1秒重设标记
 207   3                              for(k=0;k<2;k++)
 208   3                              {
 209   4                                              count[k]=count[k]-1;     //1秒 减1
 210   4                                              if(count[k]==0)          //计时到
 211   4                                                      {
 212   5                                                              logo=1;          //倒计时间到标记
 213   5                                                              if(k==0)      
 214   5                                                                      JCON0=0;     //继电器0该路关闭
 215   5                                                              if(k==1)
 216   5                                                                      JCON1=0;     //继电器1该路关闭
 217   5                                                              
 218   5                                                      }
 219   4                                      
 220   4                              }
 221   3      
 222   3                              
 223   3                              
 224   3                      }
 225   2      
 226   2                              
 227   2                      
 228   2              }
 229   1      
 230   1      }
 231          
 232          
 233          void main(void)
 234          {
 235   1              
 236   1              position=0;      //选第一路
 237   1              count[0]=0;      //第一路初值为0
 238   1              count[1]=0;      //第二路初值为0
 239   1              JCON0=0;         //关闭继电器0
 240   1              JCON1=0;         //关闭继电器1
 241   1              ii=1;            
C51 COMPILER V7.02a   KEYLED                                                               04/25/2006 13:40:53 PAGE 5   

 242   1              jj=1;            
 243   1      
 244   1              EA = 0;                                                 // 停止所有中断
 245   1                              
 246   1              ucTH = (65536-22118400/12/400)/256;                             // 计算2.5ms定时的时间常数(22.1184M OSC)
 247   1              ucTL = (65536-22118400/12/400)%256;
 248   1              
 249   1              TMOD = 0x01;                                 // T0:模式1,16位定时器           
 250   1                                                                      
 251   1              TH0 = ucTH;                      //定时器赋初值
 252   1              TL0 = ucTL;
 253   1              
 254   1              ET0 = 1;                                                 // T0允许中断
 255   1              
 256   1              TR0 = 1;                         //开始计数
 257   1      
 258   1              EA = 1;                          //开所有的中断
 259   1      
 260   1              while(1);
 261   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    563    ----
   CONSTANT SIZE    =     16    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     23    ----
   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 + -