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

📄 key.lst

📁 按键程序讨论
💻 LST
字号:
C51 COMPILER V7.06   KEY                                                                   09/14/2012 23:36:51 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE KEY
OBJECT MODULE PLACED IN .\obj\key.obj
COMPILER INVOKED BY: D:\Program Files (x86)\keil\C51\BIN\C51.EXE key.c BROWSE DEBUG OBJECTEXTEND PRINT(.\lis\key.lst) OB
                    -JECT(.\obj\key.obj)

stmt level    source

   1          //
   2          //  名称:
   3          //  编写:niechao
   4          //  日期:2012.08
   5          //  修改:无
   6          //  内容:按键操作程序
   7          #include<reg52.h>
   8          #include"timer0_1ms.h"
   9          #include"led.h"
  10          //按键端口定义
  11          sbit io_set_key = P1^0 ;
  12          sbit io_sht_key = P1^1 ;
  13          sbit io_add_key = P1^2 ;
  14          sbit io_sub_key = P1^3 ;
  15          
  16          //按键初始化 主函数调用
  17          void KeyInit(void)
  18          { 
  19   1           io_set_key = 1 ;
  20   1           io_sht_key = 1 ;
  21   1           io_add_key = 1 ;
  22   1           io_sub_key = 1 ; 
  23   1      }
  24          
  25          //按键键码值
  26          #define set_key_value    10         
  27          #define sht_key_value    20          
  28          #define add_key_value    30          
  29          #define sub_key_value    40         
  30          #define     key_null     50             
  31          
  32          
  33          
  34          unsigned char a=0;    //短按状态反馈给led。c
  35          unsigned char *Pflag; //短按状态
  36          unsigned char b=0;    //长按状态反馈给led。c
  37          unsigned char *Lflag; //长按状态
  38          
  39          
  40          
  41          
  42          //------------------------------------------------
  43          //         判断哪个按键按的
  44          //------------------------------------------------ 
  45           unsigned char  KeyScan(void)
  46          {
  47   1          if(io_set_key == 0)return set_key_value ;
  48   1          if(io_sht_key == 0)return sht_key_value ;
  49   1          if(io_add_key == 0)return add_key_value ;
  50   1          if(io_sub_key == 0)return sub_key_value ;
  51   1          return key_null ;  
  52   1      }
  53          
  54          
C51 COMPILER V7.06   KEY                                                                   09/14/2012 23:36:51 PAGE 2   

  55          //------------------------------------------------
  56          //    长按短按键值返回   
  57          //------------------------------------------------ 
  58          
  59          static state(unsigned char *PKeyValue,unsigned char *LKeyValue )
  60                     //指向短按                             指向长按
  61                     {  
  62   1                           static unsigned char count ;
  63   1                
  64   1                        if (KeyScan()!=50 )
  65   1                                  
  66   1                                   {
  67   2                         if (OUT1) 
  68   2                                        
  69   2                            { 
  70   3                                                    
  71   3                               OUT1=0;                //系统160MS时标到复位
  72   3                                                 
  73   3                                                   if (KeyScan()!=50 )     //是否有按键按下 
  74   3                                                 
  75   3                                  { 
  76   4                                                                
  77   4      
  78   4                                                                *PKeyValue = 1 ;    //返回短按
  79   4                                                                                                      
  80   4                                                                count++;                                                                                                                                                      
  81   4                                                                
  82   4                                                                led_show();         //短按复位前先显示
  83   4                                                                *PKeyValue = 0 ;
  84   4                                                          }
  85   3                  
  86   3                               if (OUT2 == 1 )            //2S时标到
  87   3                                                 
  88   3                                  {
  89   4                                                      
  90   4                                                            if (count > 12 )        //2S时标到内大于12次计数为长按 
  91   4                                                            //不可能有2S按12次的按神?
  92   4                                       {
  93   5      
  94   5                                                                 *LKeyValue = 1 ;    //返回长按                                                                                               
  95   5                                                                  
  96   5                                                               }      
  97   4                                                                
  98   4                                   }                                                          
  99   3       
 100   3                                             }
 101   2      
 102   2                         }                       
 103   1      
 104   1                                 if ((count >= 0) && (*LKeyValue ==1)  )        //每40ms查询当长按按键按下后释放
 105   1                                                                                                 
 106   1                                                                                                  //用于复位短按计数和长按标志
 107   1                         {
 108   2                                                      
 109   2                                                 if (KeyScan()==50 )                  //按键是否释放
 110   2                                                                          
 111   2                                   {
 112   3                                       count = 0 ;
 113   3                                                                         
 114   3                                                               *LKeyValue = 0 ;                                                                                               
 115   3                                                                   
 116   3                                                                OUT2 = 0 ;
C51 COMPILER V7.06   KEY                                                                   09/14/2012 23:36:51 PAGE 3   

 117   3                                       }      
 118   2                                   
 119   2                          }
 120   1      
 121   1      
 122   1                     }
 123          
 124          //------------------------------------------------
 125          //       通过指针间接赋值短按状态 长按状态
 126          //------------------------------------------------ 
 127          
 128          void getkey(void)
 129          
 130          {
 131   1      
 132   1          
 133   1      
 134   1        Pflag = &a;        //短按状态通过将 短按状态a地址 赋值 给 指针 Pflag
 135   1                           //在state(unsigned char *PKeyValue,unsigned char *LKeyValue )函数间接修改短按状态a值
 136   1        Lflag = &b;        //长按状态通过将 长按状态a地址 赋值 给 指针 Lflag
 137   1                           //在state(unsigned char *PKeyValue,unsigned char *LKeyValue )函数间接修改短按状态b值
 138   1        state(Pflag,Lflag); 
 139   1      
 140   1       
 141   1      }
 142          
 143          
 144          
 145          
 146          
 147          
 148          
 149          
 150          
 151          
 152          
 153          
 154          //------------------------------------------------
 155          //         判断哪个按键按下返回对应码值 
 156          //         此程序模版是在第二次调用时
 157          //         无法复位20MS等时间标志位或复位标志位
 158          //         影响使用其他时间标志 后发现可通过多 计时器时间标志求余
 159          //         如想得到10Ms  通过现用20MS ( (20MS计数常量 % 2) >0 )结果为真
 160          //         就是10ms的计数
 161          //------------------------------------------------ 
 162          /*void state(unsigned int *PKeyValue,unsigned int *LKeyValue )
 163                     //指向短按                             指向长按
 164                     {  
 165                               static  unsigned char count ;
 166                        
 167                        if (KeyScan()!=50 )
 168                                      
 169                                       {
 170                             if (OUT) 
 171                                            
 172                                { 
 173                                  StateChange();                             //系统20MS时标到复位
 174                                                     
 175                                                     if (KeyScan()!=50 )                         //是否有按键按下 
 176                                                     
 177                                    {
 178                                                          PKeyValue = KEY_STATE_PRESS ;          //返回短按
C51 COMPILER V7.06   KEY                                                                   09/14/2012 23:36:51 PAGE 4   

 179                                                         
 180                                                              if (OUT)                               //20ms到了是否还有按键按下
 181                                                                  
 182                                                                    {
 183                                                                      if (KeyScan()!=50)                 //是否有按键按下
 184                                                              
 185                                                                       {
 186                                                                        count++;
 187                                                                            if (count > 40)                  
 188                                                                                 
 189                                                                                {
 190                                                  count = 0;
 191          
 192                                                 LKeyValue = KEY_STATE_LONG; //返回长按
 193                                                                                     
 194                                                                                    }
 195                                                                             }  
 196                                          }
 197                                                             }
 198          
 199                                 }
 200          
 201                                             }
 202          
 203                        }
 204                                   
 205          */               
 206          
 207          
 208                     
 209                     
 210                     


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    190    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      9       6
   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 + -