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

📄 key.lst

📁 《时间触发嵌入式系统设计模式》一书中的合作式调度器的算法
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V8.08   KEY                                                                   10/02/2007 07:17:26 PAGE 1   


C51 COMPILER V8.08, COMPILATION OF MODULE KEY
OBJECT MODULE PLACED IN key.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE key.C BROWSE DEBUG OBJECTEXTEND

line 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"SCH51.H"
  24          #include "MMI.h"
  25          #include"Uart.h"
  26          #include"LedDisp.h"
  27          #include"key.h"
  28          #include"LedDispInterface.h"
  29          
  30          //----------------------------------------------------------------------
  31          // 定义键盘扫描程序返回数据类型
  32          typedef struct
  33          {
  34                  unsigned char ShiftValue;               // 存放最后扫描到的引导键键值
  35                  unsigned char ShiftCnt;                 // 统计上档键的个数
  36                  unsigned char FunctionValue;    // 存放最后扫描到的功能键键值
  37                  unsigned char FunctionCnt;              // 统计功能键的个数
  38          }keyret;
  39          
  40          // 定义以下键值允许连击
  41          #define DOUBLE_KEY_1    K_Up
  42          #define DOUBLE_KEY_2    'B'
  43          // 按键年龄上限
  44          #define KEYAGE                  (2)
  45          #define MAXRATE                 (50)    // 重复前的延迟值 600 MS
  46          #define MINRATE                 (20)    // 连击速度 240 MS
  47          
  48          //----------------------------------------------------------------------
  49          // 私有函数
  50          static void KeyPadScan(keyret *pKey);
  51          
  52          unsigned char i = 0;
  53          
  54          //-----------------------------------------------------------------------
  55          // 存放上次功能键和引导档的键值(keybuffer[0]存放功能键值)
C51 COMPILER V8.08   KEY                                                                   10/02/2007 07:17:26 PAGE 2   

  56          static unsigned char keybuffer[2]={0, 0};       
  57          static unsigned char keyagecnt; // 按键年龄计数器
  58          static bit Flag_keystate;               // 按键状态指示: 为 1 时按键处于去抖动期间
  59          static bit Flag_keyesc;                 // 按键释放标志: 为 0 时已释放
  60          static bit Flag_keydone;                // 按键任务完成标志: 为 1 时已完成              
  61          static bit Flag_keyprocess;             // 按键有效标志: 为 1 时对按键执行
  62          
  63          /*---------------------------------------------------------*-
  64           * 函数名称: KeyPadScan()
  65           * 参    数: 
  66           * 返    回:
  67           * 函数功能: 按键扫描
  68           * 
  69           * 说    明: 扫描引导键/功能键键值及个数 
  70           *
  71           * 当前版本: V1.0                        * 取代版本:
  72           * 作    者: wsl                         * 修    改:  
  73           * 版本信息: 2006-12-16          * 修改信息:  
  74          -*---------------------------------------------------------*/
  75          void KeyPadScan(keyret *pKey)
  76          {
  77   1              if ( 0 == Shift )
  78   1              {       // 此键为引导键
  79   2                      (*pKey).ShiftValue = K_Shift;
  80   2                      (*pKey).ShiftCnt++;
  81   2              }
  82   1              if ( 0 == Up )
  83   1              {
  84   2                      (*pKey).FunctionValue = K_Up;
  85   2                      (*pKey).FunctionCnt++;
  86   2              }
  87   1              if ( 0 == LoopRight )
  88   1              {
  89   2                      (*pKey).FunctionValue = K_LoopRight;
  90   2                      (*pKey).FunctionCnt++;
  91   2              }
  92   1              if ( 0 == Enter )
  93   1              {
  94   2                      (*pKey).FunctionValue = K_Enter;
  95   2                      (*pKey).FunctionCnt++;
  96   2              }
  97   1      }
  98          
  99          /*---------------------------------------------------------*-
 100           * 函数名称: KeyPad()
 101           * 参    数: 
 102           * 返    回:
 103           * 函数功能: 按键处理
 104           * 
 105           * 说    明: 
 106           *
 107           * 当前版本: V1.0                        * 取代版本:
 108           * 作    者: wsl                         * 修    改:  
 109           * 版本信息: 2006-12-16          * 修改信息:  
 110          -*---------------------------------------------------------*/
 111          void KeyPad(void)
 112          {
 113   1              static bit Flag_key_init = 0;   // 按键初始化标志,为1时初始化已完成
 114   1              keyret keytemp = {0x00, 0x00, 0x00, 0x00};
 115   1              // 按键初始化
 116   1              if ( !Flag_key_init )
 117   1              {       // 每次开机按键初始化只运行一次
C51 COMPILER V8.08   KEY                                                                   10/02/2007 07:17:26 PAGE 3   

 118   2                      //KEYPAD_PORT = 0xFF;
 119   2                      Flag_keystate = 1;
 120   2                      Flag_keyprocess = 0;
 121   2                      Flag_keydone = 1;
 122   2                      // 按键初始化完成,将此标志置位
 123   2                      Flag_key_init = 1;
 124   2              }
 125   1      
 126   1              if ( Flag_keydone )
 127   1              {       // 扫描按键
 128   2                      KeyPadScan(&keytemp);
 129   2                      // 若无功能键按下或多于一个功能键及引导键按下,程序将作按键无效处理
 130   2                      if ( (0x00 == keytemp.FunctionCnt) || (keytemp.FunctionCnt > 0x01) || (keytemp.ShiftCnt > 0x01) )
 131   2                      {
 132   3                              keyagecnt = 0;                  // 按键年龄计数器清"0"
 133   3                              keybuffer[0] = 0;               // 上次功能键缓冲区清"0"
 134   3                              keybuffer[1] = 0;               // 上次引导键缓冲区清"0"
 135   3                              Flag_keyesc = 0;                // 清按键释放标志
 136   3                              Flag_keystate = 1;              // 置位按键状态
 137   3                              return;
 138   3                      }
 139   2                      // 若是上次按键末释放则返回
 140   2                      if (Flag_keyesc)
 141   2                      {
 142   3                              return;
 143   3                      }
 144   2                      // 若本次功能键/引导键不同,则用本次键值更新上次键值
 145   2                      if ( (keybuffer[0] != keytemp.FunctionValue) || (keybuffer[1] != keytemp.ShiftValue) )
 146   2                      {
 147   3                              keybuffer[0] = keytemp.FunctionValue;
 148   3                              keybuffer[1] = keytemp.ShiftValue;
 149   3                              keyagecnt = 0;                                          // 按键年龄计数器清"0"
 150   3                              Flag_keystate = 1;                                      // 置位第一次按下标志
 151   3                              return;
 152   3                      }
 153   2                      // 键值和上次相同,按键年龄加1
 154   2                      keyagecnt++;
 155   2                      // 是第一次按下吗?
 156   2                      if (Flag_keystate)
 157   2                      {       // 是第一按下
 158   3                              if ( keyagecnt == KEYAGE )
 159   3                              {       // 确定按键按下
 160   4                                      Flag_keyprocess = 1;                    // 对按键解析执行
 161   4                                      Flag_keydone = 0;                               // 清按键任务完成标志(表当前任务正在执行)
 162   4                                      Flag_keystate = 0;                              // 清第一次按下标志
 163   4                                      keyagecnt = 0;                                  // 置位按键年龄计数器
 164   4                                      /*键音提示*/
 165   4                                      OpenBuzzer();
 166   4                                      SCH_Add_Task(CloseBuzzer, 10, 0);       // 提示音长10毫秒
 167   4                                      // 是功能键还是复合键
 168   4                                      if (0 != keytemp.ShiftCnt)
 169   4                                      {       // 是复合键,等待按键释放
 170   5                                              Flag_keyesc = 1;                        // 置位Flag_keyesc标志,等待按键释放
 171   5                                              return;
 172   5                                      }
 173   4                                      else
 174   4                                      {       // 是功能键
 175   5                                              if ( (keytemp.FunctionValue == DOUBLE_KEY_1) || (keytemp.FunctionValue == DOUBLE_KEY_2) )
 176   5                                              {       // 该功能键允许连击
 177   6                                                      return;
 178   6                                              }
 179   5                                              else
C51 COMPILER V8.08   KEY                                                                   10/02/2007 07:17:26 PAGE 4   

 180   5                                              {       // 不允许连击
 181   6                                                      Flag_keyesc = 1;                // 置位Flag_keyesc标志,等待按键释放
 182   6                                                      return;
 183   6                                              }
 184   5                                      }
 185   4                              }
 186   3                              else
 187   3                              {       // 是抖动就返回
 188   4                                      return;
 189   4                              }
 190   3                      }
 191   2                      else
 192   2                      {       // 是连击键.不是第一次按下则判断按键年龄是否等于重复的延缓时间,不等于则返回.
 193   3                              if (keyagecnt == MAXRATE)
 194   3                              {       // 进入连击状态 
 195   4                                      keyagecnt = keyagecnt - MINRATE;        // 按键年龄减重复速度
 196   4                                      Flag_keyprocess = 1;                            // 对按键解析执行
 197   4                                      Flag_keydone = 0;                                       // 清按键任务完成标志(表当前任务正在执行)
 198   4                                      return;
 199   4                              }
 200   3                              else
 201   3                              {       // 不等于重复的延缓时间返回
 202   4                                      return;
 203   4                              }
 204   3                      }
 205   2              }
 206   1      }
 207          

⌨️ 快捷键说明

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