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

📄 ps-2keyboard.lst

📁 EDN板之PS2键盘接口程序-- 单片机殿堂
💻 LST
字号:
C51 COMPILER V7.06   PS_2KEYBOARD                                                          08/31/2006 21:32:01 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE PS_2KEYBOARD
OBJECT MODULE PLACED IN PS-2KEYBOARD.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE PS-2KEYBOARD.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          /********************************************************************************************************
   2          原理:每次按键,键盘会向单片机发脉冲使单片机发生外部中断,数据有p3.4口一位位传进来
   3          接口:键盘时钟接在p3.2口,即8051的外部中断int1上,键盘数据接到p3.4上,外部中断使用边沿触发方式
   4          键盘返回数据格式:1位开始位(0),8位数据位(所按按键的通码,用来识别按键),1位校验位(奇校验)
   5          *********************************************************************************************************/
   6          
   7          #include "ScanCode.h" //按键通码与ascii对照表
   8          #include "ps2KEYBOARD.h"
   9          #include "lcdapi.h"
  10          #include "3310.h"
  11          
  12          uchar InIndex=0,OutIndex=0;
  13          uchar KeyBuff[BUFF_SIZE];
  14          
  15          /*功能:通过外部中断1读取键盘发送回来的数据位
  16           *性质:中断调用
  17           *参数:无
  18           *返回:无
  19           */
  20          void KeyBoardISR() interrupt 2 //外部中断1 用来接受键盘发来的数据
  21          {
  22   1              static uchar BitCount=11,KeyData;
  23   1              if(BitCount<11 && BitCount>2)
  24   1              {
  25   2                      KeyData>>=1;
  26   2                      if(KeyBoardSda)
  27   2                              KeyData|=0x80;
  28   2              }
  29   1              if(--BitCount==0)
  30   1              {
  31   2                      BitCount=11;
  32   2                      KeyBuff[InIndex]=KeyData;
  33   2                      if(++InIndex==BUFF_SIZE)
  34   2                              InIndex=0;
  35   2                      KeyData=0;
  36   2              }
  37   1      }
  38          
  39          /*功能:通过串口或其它方式显示键盘值(自定义)
  40           *性质:外部调用
  41           *参数:键盘按键值
  42           *返回:无
  43           */
  44          void Send(uchar d)
  45          {
  46   1              static uchar i,j;
  47   1              
  48   1          if(i!=80)
  49   1                 {
  50   2                  DispAsc(i,2,&d);
  51   2              i+=8;
  52   2                      }
  53   1               else if(i==80)
  54   1                 {
  55   2                  DispAsc(j,4,&d);
C51 COMPILER V7.06   PS_2KEYBOARD                                                          08/31/2006 21:32:01 PAGE 2   

  56   2                  j+=8;
  57   2                      if(j==80)
  58   2                {
  59   3                i=0;
  60   3                j=0;
  61   3                        LCD_Clr2();
  62   3                        DispString(16,0,"零距离");
  63   3                }
  64   2                }
  65   1      }
  66          
  67          /*功能:通过中断程序的数据位从数组中取出键值
  68           *性质:外部调用
  69           *参数:无
  70           *返回:无
  71           */
  72          void KeyBoardDecode(void)
  73          {
  74   1              static bit ShiftFlg,CapsFlg,NumFlg,BreakFlg,ExtendFlg;
  75   1              uchar ArrayIndex;
  76   1              uchar ScanCode;
  77   1      
  78   1              while(InIndex != OutIndex)
  79   1              {
  80   2                      if(!BreakFlg)
  81   2                      {
  82   3                              switch(KeyBuff[OutIndex])
  83   3                              {
  84   4                                      case 0x12:                                                              //左SHIFT
  85   4                                      case 0x59:
  86   4                                              ShiftFlg = 1;                   //右SHIFT
  87   4                                              break;
  88   4                                      case 0x58:
  89   4                                              if(CapsFlg)                             //Caps
  90   4                                              {
  91   5                                                      CapsFlg = 0;
  92   5                                              }
  93   4                                              else if(!CapsFlg)       
  94   4                                              {
  95   5                                                      CapsFlg = 1;
  96   5                                              }
  97   4                                              break;
  98   4                                      case 0x77:
  99   4                                              if(NumFlg)                              //切换Num
 100   4                                              {
 101   5                                                      NumFlg = 0;
 102   5                                              }
 103   4                                              else if(!NumFlg)        
 104   4                                              {
 105   5                                                      NumFlg = 1;
 106   5                                              }
 107   4                                              break;
 108   4                                      case 0xe0 :
 109   4                                              if(!ExtendFlg)
 110   4                                              {
 111   5                                                      ExtendFlg = 1; 
 112   5                                              }
 113   4                                              else if(ExtendFlg)
 114   4                                              {
 115   5                                                      ExtendFlg = 0;
 116   5                                              }                       
 117   4                                              break;
C51 COMPILER V7.06   PS_2KEYBOARD                                                          08/31/2006 21:32:01 PAGE 3   

 118   4                                      case 0xf0 :
 119   4                                              BreakFlg = 1;
 120   4                                              break;                                                                  
 121   4                                      default:                
 122   4                                              if(ShiftFlg)            
 123   4                                              {
 124   5                                                      for(ArrayIndex = 0;shifted[ArrayIndex][0] != 0 ;ArrayIndex++)
 125   5                                                      {
 126   6                                                              
 127   6                                                              if(KeyBuff[OutIndex] == shifted[ArrayIndex][0])
 128   6                                                              {
 129   7                                                                      ScanCode = shifted[ArrayIndex][1];
 130   7                                                                      Send(ScanCode);
 131   7                                                                      break;
 132   7                                                              }       
 133   6                                                      }
 134   5                                              
 135   5                                              }
 136   4                                              else    if(CapsFlg)
 137   4                                              {
 138   5                                                      for(ArrayIndex = 0;unshifted[ArrayIndex][0] != 0 ;ArrayIndex++)
 139   5                                                      {
 140   6                                                              
 141   6                                                              if(KeyBuff[OutIndex] == unshifted[ArrayIndex][0])
 142   6                                                              {
 143   7                                                                      ScanCode = unshifted[ArrayIndex][1];
 144   7                                                                      if((ScanCode >= 'a')&&(ScanCode <= 'z'))
 145   7                                                                      {
 146   8                                                                              ScanCode -= 0x20;
 147   8                                                                      }
 148   7                                                                      Send(ScanCode);
 149   7                                                                      break;
 150   7                                                              }       
 151   6                                                      }
 152   5                                              }
 153   4                                              else    if(!ShiftFlg)
 154   4                                              {
 155   5                                                      for(ArrayIndex = 0;unshifted[ArrayIndex][0] != 0;ArrayIndex++)  
 156   5                                                      {
 157   6                                                              if(KeyBuff[OutIndex] == unshifted[ArrayIndex][0])
 158   6                                                              {
 159   7                                                                      ScanCode = unshifted[ArrayIndex][1];
 160   7                                                                      Send(ScanCode);
 161   7                                                                      break;
 162   7                                                              }       
 163   6                                                      }
 164   5                                              }
 165   4                              }
 166   3                      }
 167   2                      else    
 168   2                      {
 169   3                              BreakFlg = 0;                                                                   //break code received
 170   3                              switch(KeyBuff[OutIndex])
 171   3                              {
 172   4                                      case 0x12       :                                                               //lshft
 173   4                                      case 0x59       :       ShiftFlg = 0; //rshft
 174   4                                                                              break;
 175   4                              }
 176   3                      }
 177   2                      OutIndex ++;
 178   2                      if(OutIndex == BUFF_SIZE)       OutIndex =0;  //循环 outpointer
 179   2              }
C51 COMPILER V7.06   PS_2KEYBOARD                                                          08/31/2006 21:32:01 PAGE 4   

 180   1       }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    482    ----
   CONSTANT SIZE    =    279    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     14       3
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      5    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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