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

📄 keypad.lst

📁 基于单片机的电子计算器的硬件原理图和程序
💻 LST
字号:
C51 COMPILER V7.50   KEYPAD                                                                07/01/2008 10:35:01 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE KEYPAD
OBJECT MODULE PLACED IN keypad.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE keypad.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          
   2          /*
   3          ****************************************************
   4          
   5                          键盘
   6          
   7          ****************************************************
   8          */
   9          
  10          
  11          #include <reg52.H>
  12          #include "Typedef.H"
  13          #include "UserDef.H"
  14          #include "Keypad.h"
  15          
  16          
  17          //==============================<< 修改1 >>===============================================================
             -======
  18          //                                              修改KeyMap,给出正确的按键扫描码
  19          //                                              可在程序的第118行处设断点,并观察按键按下后变量img的值来确定对应的扫描码
  20          //========================================================================================================
             -=====
  21          /* 按键对照表 */
  22          static INT32U code KeyMap[][2] = {
  23          //      扫描码  虚键码
  24                  0xFFFF, VK_NULL,
  25                  0xF7FF, VK_0,
  26                  0xBFFF, VK_1,
  27                  0xFBFF, VK_2,
  28                  0xFFBF, VK_3,
  29                  0xDFFF, VK_4,
  30                  0xFDFF, VK_5,
  31                  0xFFDF, VK_6,
  32                  0xEFFF, VK_7,
  33                  0xFEFF, VK_8,
  34                  0xFFEF, VK_9,
  35                  0xFFF7, VK_ADD,
  36                  0xFFFB, VK_SUB,
  37                  0xFFFD, VK_MUL,
  38                  0xFFFE, VK_DIV,
  39                  0xFF7F, VK_EQU,
  40                  0x7FFF, VK_CLR,
  41                  };
  42          
  43          
  44          /* 端口定义 */
  45          sbit KP_Col0 = P1^0;
  46          sbit KP_Col1 = P1^1;
  47          sbit KP_Col2 = P1^2;
  48          sbit KP_Col3 = P1^3;
  49          sbit KP_Row0 = P1^4;
  50          sbit KP_Row1 = P1^5;
  51          sbit KP_Row2 = P1^6;
  52          sbit KP_Row3 = P1^7;
  53          
C51 COMPILER V7.50   KEYPAD                                                                07/01/2008 10:35:01 PAGE 2   

  54          
  55          /*  全局变量 */
  56          
  57          
  58          /***************************************************
  59          
  60                          按键扫描程序  
  61          
  62          ****************************************************/
  63          INT8U Keypad_GetKey(void)
  64                  {
  65   1              static INT8U cnt = 0;                   //按键消抖计数器
  66   1              static INT16U PrevImg = 0x0FFF; //上次的扫描码
  67   1              static INT16U PrevKey = VK_NULL;        //上次有效按键的虚键码
  68   1              INT16U img;
  69   1              INT8U n;
  70   1              BOOLEAN find;
  71   1      
  72   1              img = 0;
  73   1              find = FALSE;
  74   1      
  75   1              //获取扫描码
  76   1              P1 = 0xFF;
  77   1              KP_Col0 = 0;KP_Col1 = 1;KP_Col2 = 1;KP_Col3 = 1;
  78   1              img |= (P1>>4); img <<= 4;
  79   1              KP_Col0 = 1;KP_Col1 = 0;KP_Col2 = 1;KP_Col3 = 1;
  80   1              img |= (P1>>4); img <<= 4;
  81   1              KP_Col0 = 1;KP_Col1 = 1;KP_Col2 = 0;KP_Col3 = 1;
  82   1              img |= (P1>>4); img <<= 4;
  83   1              KP_Col0 = 1;KP_Col1 = 1;KP_Col2 = 1;KP_Col3 = 0;
  84   1              img |= (P1>>4);
  85   1      
  86   1              //消抖
  87   1              if (PrevImg != img)
  88   1                      {
  89   2                      cnt = 0;
  90   2                      PrevImg = img;
  91   2                      return VK_NULL;
  92   2                      }
  93   1      
  94   1              PrevImg = img;
  95   1              cnt ++;
  96   1              if (cnt < 5)
  97   1                      {
  98   2                      return VK_NULL;
  99   2                      }
 100   1      
 101   1              //本次消抖完毕,计数器清零,为下次消抖做准备
 102   1              cnt = 0;
 103   1      
 104   1              //获取按键的虚键码
 105   1              for (n=0;n<(sizeof(KeyMap)/8);n++)
 106   1                      {
 107   2                      if (KeyMap[n][0] == img)
 108   2                              {
 109   3                              find = TRUE;
 110   3                              break;
 111   3                              }
 112   2                      }
 113   1      
 114   1              if (find == TRUE)
 115   1                      {
C51 COMPILER V7.50   KEYPAD                                                                07/01/2008 10:35:01 PAGE 3   

 116   2                      if (KeyMap[n][1] != PrevKey)    //只识别改变的按键动作
 117   2                              {
 118   3                              PrevKey = KeyMap[n][1];
 119   3                              return KeyMap[n][1];
 120   3                              }
 121   2                      else
 122   2                              return VK_NULL;
 123   2                      }
 124   1              else 
 125   1                      return VK_INVALID;
 126   1              }
 127          
 128          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    293    ----
   CONSTANT SIZE    =    136    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      5       3
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----       1
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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