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

📄 key.lst

📁 proteus电子钟(带闹钟数码管显示)
💻 LST
字号:
C51 COMPILER V7.06   KEY                                                                   05/31/2009 01:55:41 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE KEY
OBJECT MODULE PLACED IN key.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE software\key.C BROWSE DEBUG OBJECTEXTEND PRINT(.\key.lst) OBJECT(key.obj)

stmt level    source

   1          /*--------------------------------------------------------------------*-
   2          
   3                  key.C (V1.00)
   4          
   5                   
   6          -*---------------------------------------------------------------------*/
   7          /*
   8           * Copyright (c) 2006,wsl
   9           * All rights reserved
  10           * 
  11           * 文件名称: key.C 
  12           * 功能描述: 
  13           * 其它说明: 
  14           * 
  15           * 当前版本: V1.0                        * 取代版本:
  16           * 作    者: wsl                         * 修    改:  
  17           * 版本信息: 2006-12-16          * 修改信息: :
  18           */
  19          //***********************************************************************
  20          
  21          #include "main.h"
  22          #include "Port.h"
  23          #include "key.h"
  24          #include "OS_Basic_Func.H"
  25          #include "DisplayDir.h"
  26          #include "Menu.h"
  27          
  28          
  29          
  30          //----------------------------------------------------------------------
  31          // 定义键盘扫描程序返回数据类型
  32          typedef struct{
  33                  uint8_t FunctionValue;                  // 存放最后扫描到的功能键键值
  34                  uint8_t FunctionCnt;                    // 统计击键个数
  35          }Str_KeyRet;
  36          
  37          // 定义以下键值允许连击
  38          #define DOUBLE_KEY_1    K_Up
  39          #define DOUBLE_KEY_2    'B'
  40          // 按键年龄上限
  41          #define KEYAGE                  (2)
  42          #define MAXRATE                 (102)           // 重复前的延迟值 1000 MS
  43          #define MINRATE                 (30)            // 连击速度 300 MS
  44          
  45          //-----------------------------------------------------------------------
  46          static uint8_t FunctionBuffer = 0;
  47          static uint8_t KeyAgeCnt;                       // 按键年龄计数器
  48          static bool bKeyState = 1;                      // 按键状态指示: 为 1 时按键处于去抖动期间
  49          static bool bKeyESC;                            // 按键释放标志: 为 0 时已释放
  50          static bool bKeydone = 1;                       // 按键任务完成标志: 为 1 时已完成              
  51          static bool bKeyProcess;                        // 按键有效标志: 为 1 时对按键执行
  52          
  53          // 私有函数
  54          static void KeyPadScan(Str_KeyRet *pKey);
  55          
C51 COMPILER V7.06   KEY                                                                   05/31/2009 01:55:41 PAGE 2   

  56          /*---------------------------------------------------------*-
  57           * 函数名称: KeyPad()
  58           * 参    数: 
  59           * 返    回:
  60           * 函数功能: 按键处理
  61           * 
  62           * 说    明: 
  63           *
  64           * 当前版本: V1.0                        * 取代版本:
  65           * 作    者: wsl                         * 修    改:  
  66           * 版本信息: 2006-12-16          * 修改信息:  
  67          -*---------------------------------------------------------*/
  68          void KeyPad(void)
  69          {
  70   1              Str_KeyRet Keytemp = {0x00, 0x00};
  71   1      
  72   1              if ( !bKeydone )                        //按键任务没有完成
  73   1                      return; 
  74   1      
  75   1              // 扫描按键
  76   1              KeyPadScan(&Keytemp);
  77   1              
  78   1              // 若无键按下或多个键按下,程序将作按键无效处理
  79   1              if ( (0x00 == Keytemp.FunctionCnt) || (Keytemp.FunctionCnt > 0x01) )
  80   1              {
  81   2                      KeyAgeCnt = 0;                  // 按键年龄计数器清"0"
  82   2                      FunctionBuffer = 0;             // 上次功能键缓冲区清"0"
  83   2                      bKeyESC = 0;                    // 清按键释放标志
  84   2                      bKeyState = 1;                  // 置位按键状态
  85   2                      return;
  86   2              }
  87   1                      
  88   1              // 若是上次按键末释放则返回
  89   1              if (bKeyESC)
  90   1                      return;
  91   1              
  92   1              
  93   1              // 若本次键不同,则用本次键值更新上次键值
  94   1              if ( FunctionBuffer != Keytemp.FunctionValue )
  95   1              {
  96   2                      FunctionBuffer = Keytemp.FunctionValue;
  97   2                      KeyAgeCnt = 0;                                          // 按键年龄计数器清"0"
  98   2                      bKeyState = 1;                                          // 置位第一次按下标志
  99   2              }
 100   1              
 101   1              KeyAgeCnt++;                                                    // 键值和上次相同,按键年龄加1
 102   1              
 103   1              if (bKeyState)                                                  // 是单击
 104   1              {       
 105   2                      if ( KeyAgeCnt == KEYAGE )                      // 按键有效?
 106   2                      {                                                                       // 确定有效
 107   3                              bKeyProcess = 1;                                // 对按键解析执行
 108   3                              bKeydone = 0;                                   // 清按键任务完成标志(表当前任务正在执行)
 109   3                              bKeyState = 0;                                  // 清第一次按下标志
 110   3                              KeyAgeCnt = 0;                                  // 置位按键年龄计数器
 111   3      
 112   3                              if ( (Keytemp.FunctionValue == DOUBLE_KEY_1) || (Keytemp.FunctionValue == DOUBLE_KEY_2) )
 113   3                              {       
 114   4                                      bKeyESC = 0;                            // 该功能键允许连击
 115   4                              }
 116   3                              else
 117   3                              {       // 不允许连击
C51 COMPILER V7.06   KEY                                                                   05/31/2009 01:55:41 PAGE 3   

 118   4                                      bKeyESC = 1;                            // 置位bKeyESC标志,等待按键释放
 119   4                              }       
 120   3                      }
 121   2              }
 122   1              else    // 是连击键.判断按键年龄是否等于重复的延缓时间,不等于则返回.
 123   1              {       
 124   2                      if (KeyAgeCnt == MAXRATE)
 125   2                      {       // 进入连击状态 
 126   3                              KeyAgeCnt = KeyAgeCnt - MINRATE;        // 按键年龄减重复速度
 127   3                              bKeyProcess = 1;                                        // 对按键解析执行
 128   3                              bKeydone = 0;                                           // 清按键任务完成标志(表当前任务正在执行)
 129   3                      }
 130   2              }       
 131   1              
 132   1              if (bKeyProcess)
 133   1              {
 134   2                      StartBuzzer();                                                  // 开背光,键音
 135   2              }               
 136   1      }
 137          
 138          /*---------------------------------------------------------*-
 139           * 函数名称: KeyPadScan()
 140           * 参    数: 
 141           * 返    回:
 142           * 函数功能: 按键扫描
 143           * 
 144           * 说    明: 扫描引导键/功能键键值及个数 
 145           *
 146           * 当前版本: V1.0                        * 取代版本:
 147           * 作    者: wsl                         * 修    改:  
 148           * 版本信息: 2006-12-16          * 修改信息:  
 149          -*---------------------------------------------------------*/
 150          void KeyPadScan(Str_KeyRet *pKey)
 151          {
 152   1              K1 = 1;
 153   1              K2 = 1;
 154   1              K3 = 1;
 155   1              K4 = 1;                 
 156   1              if ( !K1 )
 157   1              {       
 158   2                      (*pKey).FunctionValue = K_Set;
 159   2                      (*pKey).FunctionCnt++;
 160   2              }
 161   1      
 162   1              if ( !K2 )
 163   1              {
 164   2                      (*pKey).FunctionValue = K_Enter;
 165   2                      (*pKey).FunctionCnt++;
 166   2              }
 167   1      
 168   1              if ( !K3 )
 169   1              {
 170   2                      (*pKey).FunctionValue = K_Right;
 171   2                      (*pKey).FunctionCnt++;
 172   2              }
 173   1      
 174   1              if ( !K4 )
 175   1              {
 176   2                      (*pKey).FunctionValue = K_Up;
 177   2                      (*pKey).FunctionCnt++;
 178   2              }       
 179   1                              
C51 COMPILER V7.06   KEY                                                                   05/31/2009 01:55:41 PAGE 4   

 180   1      }
 181          
 182          
 183          /*---------------------------------------------------------*-
 184           * 函数名称: KeyProcess()
 185           * 参    数: 
 186           * 返    回:
 187           * 函数功能: 键值处理
 188           * 
 189           * 说    明: 
 190           *
 191           * 当前版本: V1.0                        * 取代版本:
 192           * 作    者: wsl                         * 修    改:  
 193           * 版本信息: 2006-12-16          * 修改信息:  
 194          -*---------------------------------------------------------*/
 195          void KeyProcess(void)
 196          {       
 197   1              // 若无按键请求则返回
 198   1              if ( !bKeyProcess )             
 199   1                      return; 
 200   1              Menu_Change(FunctionBuffer);    
 201   1              bKeyProcess = 0;        // 清按键有效标志
 202   1      
 203   1              bKeydone = 1;           // 置位按键任务完成标志
 204   1              
 205   1              
 206   1      }
 207          /*********************************************************************************************************
             -********/
 208          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    210    ----
   CONSTANT SIZE    =      2    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      2       2
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      4    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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