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

📄 keypad.lst

📁 在keil和proteus中实现两片51单片机的通信。。。
💻 LST
字号:
C51 COMPILER V7.50   KEYPAD                                                                01/04/2009 21:53:54 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          #include<rtx51tny.h>
  11          #include <reg52.H>
  12          #include "Typedef.H"
  13          #include "UserDef.H"
  14          #include "Keypad.h"
  15          #include "Disp_drive.h"
  16          #include "chuankou_drive.h"
  17          
  18          INT8U key_value,key_value_flag=0;
  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          
C51 COMPILER V7.50   KEYPAD                                                                01/04/2009 21:53:54 PAGE 2   

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

 118   3                              }
 119   2                      else
 120   2                              return VK_NULL;
 121   2                      }
 122   1              else 
 123   1                      return VK_INVALID;
 124   1              }
 125          
 126          
 127           /*************************************
 128                            键盘扫描任务
 129           
 130           *************************************/
 131          
 132            
 133          key() _task_ TASK_KEYSCAN
 134                  {         
 135   1      
 136   1          
 137   1      
 138   1      
 139   1              while(1)
 140   1                      { 
 141   2                      key_value=Keypad_GetKey();
 142   2      
 143   2              if(key_value!=VK_NULL)    //仅在数字按键按下时才允许动作
 144   2                  {
 145   3                      key_value_flag=key_value;
 146   3      
 147   3                      
 148   3                      os_send_signal(TASK_DISP);
 149   3                      key_value_flag=key_value;
 150   3                      os_send_signal(TASK_0);
 151   3      
 152   3                      SBUF=key_value;         //通过串口发送按键值
 153   3                      while(!TI);
 154   3                      TI=0;
 155   3                 
 156   3                      TEST=0;                           //通信指示灯
 157   3                  os_wait(K_TMO,100,0);
 158   3                  TEST=1;
 159   3              
 160   3                  }
 161   2              if(key_value==20)
 162   2              { DispStr("ABCDEFG",1,0,0);
 163   3                Str_send("ABCDEFG",7);
 164   3              
 165   3               
 166   3              }
 167   2                      if(key_value==21)
 168   2              {
 169   3               
 170   3                Int_send(2012311);
 171   3      
 172   3                }
 173   2      
 174   2                if(key_value==22)
 175   2              {
 176   3               
 177   3                      Str_send("*",1);                //通过串口发送按键值    
 178   3              }
 179   2                 
C51 COMPILER V7.50   KEYPAD                                                                01/04/2009 21:53:54 PAGE 4   

 180   2                if(key_value==24)
 181   2              {
 182   3      
 183   3              DispCls();
 184   3              DispStr("0.",1,14,0);   
 185   3              }
 186   2      
 187   2      
 188   2      
 189   2            } 
 190   1      
 191   1      
 192   1      
 193   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    414    ----
   CONSTANT SIZE    =    149    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      6       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 + -