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

📄 keypad.lst

📁 PID算法 C语言
💻 LST
字号:
C51 COMPILER V7.50   KEYPAD                                                                11/10/2008 14:21:37 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE KEYPAD
OBJECT MODULE PLACED IN keypad.OBJ
COMPILER INVOKED BY: E:\II\Software\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 <rtx51tny.h>
  13          
  14          #include "Typedef.H"
  15          #include "UserDef.H"
  16          
  17          #include "disp.h"
  18          
  19          /* 按键对照表 */
  20          static INT32U code KeyMap[][2] = {
  21          //      扫描码  虚键码
  22                  0xFFFF, VK_NULL,
  23                  0xFFEF, VK_0,
  24                  0xFFFD, VK_1,
  25                  0xFFDF, VK_2,
  26                  0xFDFF, VK_3,
  27                  0xFFFB, VK_4,
  28                  0xFFBF, VK_5,
  29                  0xFBFF, VK_6,
  30                  0xFFF7, VK_7,
  31                  0xFF7F, VK_8,
  32                  0xF7FF, VK_9,
  33                  0xEFFF, VK_ADD,
  34                  0xDFFF, VK_SUB,
  35                  0xBFFF, VK_MUL,
  36                  0x7FFF, VK_DIV,
  37                  0xFEFF, VK_EQU,
  38                  0xFFFE, VK_CLR,
  39          };
  40          
  41          
  42          /* 端口定义 */
  43          sbit KP_Col0 = P1^0;
  44          sbit KP_Col1 = P1^1;
  45          sbit KP_Col2 = P1^2;
  46          sbit KP_Col3 = P1^3;
  47          sbit KP_Row0 = P1^4;
  48          sbit KP_Row1 = P1^5;
  49          sbit KP_Row2 = P1^6;
  50          sbit KP_Row3 = P1^7;
  51          
  52          /*  公共全局变量 */
  53          
  54          /*  私有全局变量 */
  55          static INT8U sig_targ;  // 接收键盘信号的任务
C51 COMPILER V7.50   KEYPAD                                                                11/10/2008 14:21:37 PAGE 2   

  56          
  57          /***************************************************
  58          
  59                          按键任务
  60          
  61          ****************************************************/
  62          static void TaskKey(void) _task_ TASK_KEY
  63          { 
  64   1              INT8U n;
  65   1              INT8U cnt = 0;                          //按键消抖计数器
  66   1              INT16U PrevImg = 0x0FFF;        //上次的扫描码
  67   1              INT8U PrevKey = VK_NULL;
  68   1              INT16U img;
  69   1      
  70   1              float df;
  71   1              INT8U d8;
  72   1              INT16U d16;
  73   1              INT32U d32;
  74   1              INT32S d32S;
  75   1      
  76   1              while (1) 
  77   1              {       
  78   2                      os_wait(K_TMO,10,0);
  79   2      
  80   2                      img = 0;
  81   2      
  82   2                      //获取扫描码
  83   2                      P1 = 0xFF;
  84   2                      KP_Col0 = 0;KP_Col1 = 1;KP_Col2 = 1;KP_Col3 = 1;
  85   2                      img |= (P1>>4); img <<= 4;
  86   2                      KP_Col0 = 1;KP_Col1 = 0;KP_Col2 = 1;KP_Col3 = 1;
  87   2                      img |= (P1>>4); img <<= 4;
  88   2                      KP_Col0 = 1;KP_Col1 = 1;KP_Col2 = 0;KP_Col3 = 1;
  89   2                      img |= (P1>>4); img <<= 4;
  90   2                      KP_Col0 = 1;KP_Col1 = 1;KP_Col2 = 1;KP_Col3 = 0;
  91   2                      img |= (P1>>4);
  92   2      
  93   2                      //按键消抖:连续5次不变的按键扫描值可确认为一个稳定的按键动作
  94   2                      if (PrevImg != img)
  95   2                      {
  96   3                              cnt = 0;
  97   3                              PrevImg = img;
  98   3                              continue;
  99   3                      }
 100   2      
 101   2                      PrevImg = img;
 102   2                      cnt ++;
 103   2                      if (cnt < 5)
 104   2                      {
 105   3                              continue;
 106   3                      }
 107   2      
 108   2                      cnt = 0;
 109   2      
 110   2                      //按键扫描码转换为虚键码
 111   2                      for (n=0;n<(sizeof(KeyMap)/8);n++)
 112   2                      {
 113   3                              if (KeyMap[n][0] == img)
 114   3                              {
 115   4                                      break;
 116   4                              }
 117   3                      }
C51 COMPILER V7.50   KEYPAD                                                                11/10/2008 14:21:37 PAGE 3   

 118   2      
 119   2                      if ( n < (sizeof(KeyMap)/8) )           //检索到匹配值,有合法按键按下,发送按键消息 
 120   2                      {
 121   3                              if (PrevKey != KeyMap[n][1])    //只在按键值变化时发送消息
 122   3                              {
 123   4                                      PrevKey = KeyMap[n][1];
 124   4      
 125   4                                      switch (KeyMap[n][1])
 126   4                                      {
 127   5                                              case VK_0:                      //演示:清屏
 128   5                                                      DISP_REQ;
 129   5                                                      dm.type = DTYPE_CLS;
 130   5                                                      os_send_signal(sig_targ);
 131   5                                                      break;
 132   5                                              case VK_1:                              //演示:显示单个字符
 133   5                                                      DISP_REQ;
 134   5                                                      dm.type = DTYPE_CHAR;
 135   5                                                      dm.font = 1; 
 136   5                                                      dm.x = 4;
 137   5                                                      dm.y = 20;
 138   5                                                      d8 = '*';
 139   5                                                      dm.DData = &d8;
 140   5                                                      os_send_signal(sig_targ);
 141   5                                                      break;
 142   5                                              case VK_2:                              //演示:显示字符串
 143   5                                                      DISP_REQ;
 144   5                                                      dm.type = DTYPE_STR;
 145   5                                                      dm.font = 1; 
 146   5                                                      dm.x = 4;
 147   5                                                      dm.y = 20;
 148   5                                                      dm.DData = "Hello";
 149   5                                                      os_send_signal(sig_targ);
 150   5                                                      break;
 151   5                                              case VK_3:                              //演示:显示汉字
 152   5                                                      DISP_REQ;
 153   5                                                      dm.type = DTYPE_HZ;
 154   5                                                      dm.x = 4;
 155   5                                                      dm.y = 20;
 156   5                                                      d8 = 0;
 157   5                                                      dm.DData = &d8;
 158   5                                                      os_send_signal(sig_targ);
 159   5                                                      break;
 160   5                                              case VK_4:                              //演示:显示浮点数
 161   5                                                      DISP_REQ;
 162   5                                                      dm.type = DTYPE_FLOAT;
 163   5                                                      dm.font = 1; 
 164   5                                                      dm.x = 4;
 165   5                                                      dm.y = 20;
 166   5                                                      dm.len = 6;
 167   5                                                      df = 1.2345;
 168   5                                                      dm.DData = &df;
 169   5                                                      os_send_signal(sig_targ);
 170   5                                                      break;
 171   5                                              case VK_5:                              //演示:显示8位无符号整数
 172   5                                                      DISP_REQ;
 173   5                                                      dm.type = DTYPE_INT8U;
 174   5                                                      dm.font = 1; 
 175   5                                                      dm.x = 4;
 176   5                                                      dm.y = 20;
 177   5                                                      dm.len = 3;
 178   5                                                      d8 = 147;
 179   5                                                      dm.DData = &d8;
C51 COMPILER V7.50   KEYPAD                                                                11/10/2008 14:21:37 PAGE 4   

 180   5                                                      os_send_signal(sig_targ);
 181   5                                                      break;
 182   5                                              case VK_6:                              //演示:显示16位无符号整数
 183   5                                                      DISP_REQ;
 184   5                                                      dm.type = DTYPE_INT16U;
 185   5                                                      dm.font = 1; 
 186   5                                                      dm.x = 4;
 187   5                                                      dm.y = 20;
 188   5                                                      dm.len = 4;
 189   5                                                      d16 = 6789;
 190   5                                                      dm.DData = &d16;
 191   5                                                      os_send_signal(sig_targ);
 192   5                                                      break;
 193   5                                              case VK_7:                              //演示:显示32位无符号整数
 194   5                                                      DISP_REQ;
 195   5                                                      dm.type = DTYPE_INT32U;
 196   5                                                      dm.font = 1; 
 197   5                                                      dm.x = 4;
 198   5                                                      dm.y = 20;
 199   5                                                      dm.len = 8;
 200   5                                                      d32 = 258369;
 201   5                                                      dm.DData = &d32;
 202   5                                                      os_send_signal(sig_targ);
 203   5                                                      break;
 204   5                                              case VK_8:                              //演示:显示32位有符号整数
 205   5                                                      DISP_REQ;
 206   5                                                      dm.type = DTYPE_INT32S;
 207   5                                                      dm.font = 1; 
 208   5                                                      dm.x = 4;
 209   5                                                      dm.y = 20;
 210   5                                                      dm.len = 8;
 211   5                                                      d32S = -69258;
 212   5                                                      dm.DData = &d32S;
 213   5                                                      os_send_signal(sig_targ);
 214   5                                                      break;
 215   5                                      }
 216   4                              }
 217   3                      }
 218   2              } 
 219   1      } 
 220          
 221          
 222          /***************************************************
 223          
 224                          任务创建函数
 225          
 226                          signal_target_task       接收键盘信号的任务编号
 227          
 228          ****************************************************/
 229          void TaskCreate_Key(INT8U signal_target_task)
 230          {
 231   1              sig_targ = signal_target_task;
 232   1              os_create_task(TASK_KEY);
 233   1      }
 234          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    799    ----
   CONSTANT SIZE    =    142    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
C51 COMPILER V7.50   KEYPAD                                                                11/10/2008 14:21:37 PAGE 5   

   DATA SIZE        =      1      22
   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 + -