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

📄 keyboard.lst

📁 51实战工程级源码
💻 LST
字号:
C51 COMPILER V9.02   KEYBOARD                                                              11/08/2012 21:34:06 PAGE 1   


C51 COMPILER V9.02, COMPILATION OF MODULE KEYBOARD
OBJECT MODULE PLACED IN ..\output\KeyBoard.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ..\source\KeyBoard.c OPTIMIZE(6,SPEED) BROWSE DEBUG OBJECTEXTEND PRINT(..\o
                    -utput\KeyBoard.lst) OBJECT(..\output\KeyBoard.obj)

line level    source

   1          /*
   2          **********************************************************************************************************
             -***
   3          *                                                Kingst-51
   4          *                                        Development board samples
   5          *
   6          *                                 (c) Copyright 2009-2012, Kingst Studio
   7          *                                           All Rights Reserved
   8          *
   9          *                                          http://www.kingst.org
  10          * 文件名:KeyBoard.c
  11          * 描  述:键盘功能模块
  12          * 版本号:1.0.0
  13          **********************************************************************************************************
             -***
  14          */
  15          #define _KEY_BOARD_C
  16          #include "config.h"
  17          #include "main.h"
  18          #include "UartCom.h"
  19          #include "Lcd1602.h"
  20          #include "KeyBoard.h"
  21          
  22          
  23          /*
  24          ********************************************************************************
  25          * ----------------------- Local defines  ---------------------------------------
  26          ********************************************************************************
  27          */
  28          const uint8 code KeyCodeMap[4][4] = { //矩阵按键编号到PC标准键盘键码的映射表
  29              { '1',  '2',  '3', 0x26 }, //数字键1、数字键2、数字键3、向上键
  30              { '4',  '5',  '6', 0x25 }, //数字键4、数字键5、数字键6、向左键
  31              { '7',  '8',  '9', 0x28 }, //数字键7、数字键8、数字键9、向下键
  32              { '0', 0x1B,  0xC, 0x27 }, //数字键0、ESC键、  回车键、 向右键
  33          };
  34          
  35          
  36          /*
  37          ********************************************************************************
  38          * ----------------------- Local variables  -------------------------------------
  39          ********************************************************************************
  40          */
  41          volatile uint8 KeySta[4][4];  //当前的按键状态
  42          
  43          
  44          /*
  45          ***************************************************************************************************
  46          * ---------------------------------- Source codes  ------------------------------------------------
  47          ***************************************************************************************************
  48          */
  49          
  50          
  51          /*
  52          * 函数名:KeyAction
C51 COMPILER V9.02   KEYBOARD                                                              11/08/2012 21:34:06 PAGE 2   

  53          * 描  述:按键动作的实现函数,根据键码执行相应动作
  54          */
  55          void KeyAction(uint8 keycode)
  56          {
  57   1              uint8 buff[4];
  58   1          
  59   1          /* 判断键码执行相应动作 */
  60   1          switch (keycode) {
  61   2              case 0x0C: //回车键启动/停止秒表计数
  62   2                  KickStopwatch();
  63   2                  break;
  64   2              case 0x1B: //ESC键重置秒表
  65   2                  ResetStopwatch();
  66   2                  break;
  67   2              default:   //其它键均无动作
  68   2                  break;
  69   2          }
  70   1              
  71   1              /* 将键码值按十六进制形式转换为字符串 */
  72   1              buff[0] = (keycode>>4) & 0xF;
  73   1              if (buff[0] <= 9) {
  74   2                      buff[0] += '0';
  75   2              }
  76   1              else {
  77   2                      buff[0] += ('A'-10);
  78   2              }
  79   1              buff[1] = keycode & 0xF;
  80   1              if (buff[1] <= 9) {
  81   2                      buff[1] += '0';
  82   2              }
  83   1              else {
  84   2                      buff[1] += ('A'-10);
  85   2              }
  86   1              
  87   1              /* 键码显示到液晶屏 */
  88   1              buff[2] = '\0';
  89   1              Lcd1602ShowStr(buff, 6, 1);
  90   1          
  91   1              /* 键码由串口发送 */
  92   1              buff[2] = '\r';
  93   1              buff[3] = '\n';
  94   1              UartWrite("key code 0x", sizeof("key code 0x")-1);
  95   1              UartWrite(buff, 4);
  96   1      }
  97          
  98          /*
  99          * 函数名:KeyHandle
 100          * 描  述:按键动作检测,并提供按键动作函数的执行入口
 101          * 备  注:通常本函数需在主循环中调用
 102          */
 103          void KeyHandle(void)
 104          {
 105   1          uint8 i, j;
 106   1          static uint8 bkKey[4][4];
 107   1          
 108   1          /* 检索按键状态的变化 */
 109   1          for (i=0; i<4; i++) {
 110   2              for (j=0; j<4; j++) {
 111   3                  if (bkKey[i][j] != KeySta[i][j]) {
 112   4                      if (bkKey[i][j] == KEY_UP) {
 113   5                          /* 按键按下时的动作 */
 114   5                          KeyAction(KeyCodeMap[i][j]);
C51 COMPILER V9.02   KEYBOARD                                                              11/08/2012 21:34:06 PAGE 3   

 115   5                      }
 116   4                      else {
 117   5                          /* 按键弹起时的动作 */
 118   5                          _nop_();
 119   5                      }
 120   4                      bkKey[i][j] = KeySta[i][j];
 121   4                  }
 122   3              }
 123   2          }
 124   1      }
 125          
 126          
 127          /*
 128          * 函数名:KeyScan
 129          * 描  述:4*4矩阵式按键扫描函数
 130          * 备  注:本函数需在定时中断中调用,其定时时间、矩阵键盘列数及DEBOUNCE_MASK常数共同决定消抖时间;
 131          *         如调用本函数的中断服务函数用using指定了寄存器组,则本函数也需用using指定相同的寄存器组。
 132          */
 133          void KeyScan(void)
 134          {
 135   1          uint8 i;
 136   1          static uint8 iKeyOut=0;
 137   1          static uint8 KeyScanBuff[4][4];
 138   1      
 139   1          /* 扫描按键输入 */
 140   1          KeyScanBuff[iKeyOut][0] = ((KeyScanBuff[iKeyOut][0]<<1) | KEY_IN_1) & DEBOUNCE_MASK;
 141   1          KeyScanBuff[iKeyOut][1] = ((KeyScanBuff[iKeyOut][1]<<1) | KEY_IN_2) & DEBOUNCE_MASK;
 142   1          KeyScanBuff[iKeyOut][2] = ((KeyScanBuff[iKeyOut][2]<<1) | KEY_IN_3) & DEBOUNCE_MASK;
 143   1          KeyScanBuff[iKeyOut][3] = ((KeyScanBuff[iKeyOut][3]<<1) | KEY_IN_4) & DEBOUNCE_MASK;
 144   1      
 145   1          /* 消抖后更新按键状态 */
 146   1          for (i=0; i<4; i++) {
 147   2              if ((KeyScanBuff[iKeyOut][i]&DEBOUNCE_MASK) == DEBOUNCE_MASK) {
 148   3                  KeySta[iKeyOut][i] = KEY_UP;
 149   3              }
 150   2              else if ((KeyScanBuff[iKeyOut][i]&DEBOUNCE_MASK) == 0) {
 151   3                  KeySta[iKeyOut][i] = KEY_DOWN;
 152   3              }
 153   2          }
 154   1          
 155   1          /* 执行下一列按键输出 */
 156   1          iKeyOut = (iKeyOut+1) & 0x3;
 157   1          switch (iKeyOut) {
 158   2              case 0:
 159   2                  KEY_OUT_4 = 1;
 160   2                  KEY_OUT_1 = 0;
 161   2                  break;
 162   2              case 1:
 163   2                  KEY_OUT_1 = 1;
 164   2                  KEY_OUT_2 = 0;
 165   2                  break;
 166   2              case 2:
 167   2                  KEY_OUT_2 = 1;
 168   2                  KEY_OUT_3 = 0;
 169   2                  break;
 170   2              case 3:
 171   2                  KEY_OUT_3 = 1;
 172   2                  KEY_OUT_4 = 0;
 173   2                  break;
 174   2              default:
 175   2                  break;
 176   2          }
C51 COMPILER V9.02   KEYBOARD                                                              11/08/2012 21:34:06 PAGE 4   

 177   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    458    ----
   CONSTANT SIZE    =     28    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     49       7
   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 + -