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

📄 keyscan.lst

📁 RA8806底层驱动
💻 LST
字号:
C51 COMPILER V7.09   KEYSCAN                                                               02/09/2009 16:04:55 PAGE 1   


C51 COMPILER V7.09, COMPILATION OF MODULE KEYSCAN
OBJECT MODULE PLACED IN KeyScan.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE KeyScan.C OPTIMIZE(2,SPEED) BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /***************************************************************************************************
   2          **
   3          **                   按键查询扫描软件子程序
   4          **     该程序采用在定时器中每间隔10ms扫描一次按键状态,并且通过特定在按键“年份”计数器把每次的次数记录
   5          ** 下来,然后在GetKey_Value中进行相应的处理,进而得到相应的键值。
   6          ** 内存占用:2个字节的按键状态KeyDownF_Flag、KeyDownM_Flag
   7                       n个按键的字节个“年份”计数器KeyYearCnt[KeyMaxNum]
   8          ** 适用范围:该子程序使用于按键接在同一个端口上,并且是连续的情况
   9          ** 返回键值:返回的按键的键值和按键连接的端口相对应
  10          **----------------------------------------------------------------------------------------------------
  11          ** 作 者  : 严俊生
  12          ** 日 期  : 2007-07-06  
  13          ** 版本号  :V1.0 
  14          **----------------------------------------------------------------------------------------------------
  15          ** 修改人  :
  16          ** 日 期  :   
  17          ** 版本号  :
  18          **
  19          ****************************************************************************************************/
  20           #include "KeyScan.H" 
  21          
  22                                                                  
  23           #define Key_Scan_EN          1
  24           #define KeyDown_Value_EN     1
  25          
  26           static _KeyScanStatus KeyScanStatus; 
  27           
  28          /*******************************************************************************************************
  29          ** 名    称:Key_Scan
  30          ** 功    能:本程序是采用查询的方式来扫描按键的,此处是假定KEY键全部接在P0口上的,在使用的时候要根据
  31                       实际的情况更改。由于此程序是在定时器0#中断中被调用,所以此处把它定义为可重入函数
  32          ** 入口参数:PinValue 按键实际连接的物理端口
  33          ** 出口参数:无
  34          ** 注    意:该程序执行时间的长短与所需要扫描的按键数目有关系;
  35                       如果在强实时系统上,可以把该定时器0#中断设为最低优先级;需要强实时的处理在更高的优先级
  36                                   中断中进行。
  37          **----------------------------------------------------------------------------------------------------
  38          ** 作 者  : 严俊生
  39          ** 日 期  : 2007-07-06
  40          **----------------------------------------------------------------------------------------------------
  41          ** 修改人  :
  42          ** 日 期  :
  43          *******************************************************************************************************/
  44          #if Key_Scan_EN
  45           void Key_Scan(unsigned char PinValue) reentrant
  46           { unsigned char i,keycurval;
  47   1         // 暂定为P0口接按键
  48   1         keycurval = PinValue;
  49   1        /*============================= 按键扫描处理程序 ==============================*/
  50   1         for(i=0;i<KeyMaxNum;i++)
  51   1            {
  52   2              if(keycurval&0x01) 
  53   2                        {
  54   3                            KeyScanStatus.KeyYearCnt[i]   = 0;           // 按键“年份”计数器清0
  55   3                            KeyScanStatus.KeyDownF_Flag  &= ( ~(1<<i) ); // 清零单次按键状态  
C51 COMPILER V7.09   KEYSCAN                                                               02/09/2009 16:04:55 PAGE 2   

  56   3                            KeyScanStatus.KeyDownM_Flag  &= ( ~(1<<i) ); // 清零多次按键状态                            
  57   3                         }                                     
  58   2                         else KeyScanStatus.KeyYearCnt[i]++;                     // 按键“年份”计数器加1
  59   2                      keycurval = keycurval>>1; 
  60   2                }
  61   1       }
  62          #endif  
  63          
  64          /*******************************************************************************************************
  65          ** 名    称:GetKey_Value
  66          ** 功    能:本程序根据扫描的结果来判断按键的状态,是第一次按键,还是连击
  67          ** 入口参数:无
  68          ** 出口参数:返回按键的键号,支持多个按键同时按下
  69          **----------------------------------------------------------------------------------------------------
  70          ** 作 者  : 严俊生
  71          ** 日 期  : 2007-07-06
  72          **----------------------------------------------------------------------------------------------------
  73          ** 修改人  :
  74          ** 日 期  :
  75          *******************************************************************************************************/
  76          #if     KeyDown_Value_EN
  77           unsigned char GetKey_Value(void)
  78           {      unsigned char i, mm, nn=0, keydownstatus = 0;
  79   1          for(i=0;i<KeyMaxNum;i++)
  80   1                 {
  81   2                if(  ( (KeyScanStatus.KeyYearCnt[i] > KeyDelayTime)&&((KeyScanStatus.KeyDownF_Flag&(1<<i))==0) )
             - ||           
  82   2                         ( (KeyScanStatus.KeyYearCnt[i] > KeyMaxTime) && ((KeyScanStatus.KeyDownM_Flag&(1<<i))==0) ) ||
             -  
  83   2                         ( (KeyScanStatus.KeyYearCnt[i] > KeyMinTime)  &&(KeyScanStatus.KeyDownM_Flag&(1<<i))  )       
             - )
  84   2                      {  
  85   3                               keydownstatus |= (1<<i);
  86   3                                   // 第一次进入按键按下的状态
  87   3                           if( (KeyScanStatus.KeyYearCnt[i]>KeyDelayTime)&&((KeyScanStatus.KeyDownF_Flag&(1<<i))==0) )
  88   3                                 {
  89   4                                           KeyScanStatus.KeyYearCnt[i]   = 0;                   
  90   4                                       KeyScanStatus.KeyDownF_Flag  |= (1<<i);
  91   4                                                       continue;       // 退出本次循环
  92   4                                      }  
  93   3                                   // 多次进入按键按下的状态
  94   3                           if( (KeyScanStatus.KeyYearCnt[i]>KeyMaxTime)&&((KeyScanStatus.KeyDownM_Flag&(1<<i))==0) )
  95   3                                 {
  96   4                                           KeyScanStatus.KeyYearCnt[i]   = 0;                   
  97   4                                       KeyScanStatus.KeyDownM_Flag  |= (1<<i);
  98   4                                                       continue;        // 退出本次循环
  99   4                                      }
 100   3                                       // 已经连击时候的处理
 101   3                                   KeyScanStatus.KeyYearCnt[i] = 0;
 102   3                       }
 103   2                   }
 104   1          // 进行多个按键的判断,如果已经有多个按键处于按下状态,则返回多个按键的键号 
 105   1              mm = KeyScanStatus.KeyDownF_Flag;   
 106   1              for(i=0;i<KeyMaxNum;i++)
 107   1                 {
 108   2                         if(mm&0x01) nn++;            
 109   2                         mm = (mm>>1);
 110   2                 }
 111   1              if(nn>1) return KeyScanStatus.KeyDownF_Flag;
 112   1            else return keydownstatus;
 113   1       }
 114          #endif
C51 COMPILER V7.09   KEYSCAN                                                               02/09/2009 16:04:55 PAGE 3   

 115          
 116                       /********************************* End *************************************/


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    523    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     10       4
   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 + -