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

📄 ps2.lst

📁 通过8x16键盘扫描模拟Ps2键盘通过测试成功 硬件:P1P2接16跟列扫描线 P0接8跟行线 P3.6=PS2_data P3.7=CLK INT0接DATA 修改扫描码就可用 绝对好用~~~
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V8.05a   PS2                                                                  04/24/2009 21:28:43 PAGE 1   


C51 COMPILER V8.05a, COMPILATION OF MODULE PS2
OBJECT MODULE PLACED IN PS2.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE PS2.C OPTIMIZE(4,SPEED) DEBUG OBJECTEXTEND

line level    source

   1          #include <reg51.h>
   2          #include "PS2.H"
   3          #include <stdio.h>
   4          
   5          BYTE PS2RecChar=0xCC;
   6          BOOL KeyBoardFlag=FALSE;                        //scan code  
   7                                   //     DB      0C0H,0F9H,0A4H,0B0H     ;0-3 
   8                                                  //      DB      099H,092H,082H,0F8H     ;4-7 
   9                                          //      DB      080H,090H,088H,083H     ;8-B 
  10                                                  //      DB      0A7H,0A1H,086H,08EH     ;C-F 
  11          unsigned int code SCANCODE[16][8]={ 0xe06b,0xe074,0xe075,0x23,0x3c,0x33,0x42,0x43,          //1 行
  12                                                                                  0x15,0xe074,0xe075,0xe06b,0xe072,0x3c,0x33,0x43,        //2     
  13                                                                                  0x15,0xe074,0xe075,0xe06b,0xe072,0x3c,0x33,0x43,                //3       
  14                                                                                  0x15,0xe074,0xe075,0xe06b,0xe072,0x3c,0x33,0x43,    //4
  15                                                                      0x15,0xe074,0xe075,0xe06b,0xe072,0x3c,0x33,0x43,                //5
  16                                                                                  0x15,0xe074,0xe075,0xe06b,0xe072,0x3c,0x33,0x43,    //6
  17                                                                                  0x15,0xe074,0xe075,0xe06b,0xe072,0x3c,0x33,0x43,                //7
  18                                                                                  0x15,0xe074,0xe075,0xe06b,0xe072,0x3c,0x33,0x43,           //8
  19                                                                                  0x15,0xe074,0xe075,0xe06b,0xe072,0x3c,0x33,0x43,                   //9
  20                                                                                  0x15,0xe074,0xe075,0xe06b,0xe072,0x3c,0x33,0x43,  //10
  21                                                                          0x15,0xe074,0xe075,0xe06b,0xe072,0x3c,0x33,0x43,            //11
  22                                                                                  0x15,0xe074,0xe075,0xe06b,0xe072,0x3c,0x33,0x43,        //12                                                                                                                                                               
  23                                                                                  0x15,0xe074,0xe075,0xe06b,0xe072,0x3c,0x33,0x43,                  //13
  24                                                                                  0x15,0xe074,0xe075,0xe06b,0xe072,0x3c,0x33,0x43,   //14
  25                                                                          0x15,0xe074,0xe075,0xe06b,0xe072,0x3c,0x33,0x43,        //15
  26                                                                                  0x15,0xe074,0xe075,0xe06b,0xe072,0x3c,0x33,0x43,    //16                                                                                                                                                                           
  27                                                                                                                                                                                                                                     
  28                                                   
  29                                                   };
  30          sbit P00=P0^0;
  31          sbit P01=P0^1;
  32          sbit P02=P0^2;
  33          sbit P03=P0^3;
  34          sbit P04=P0^4;
  35          sbit P05=P0^5;
  36          sbit P06=P0^6;
  37          sbit P07=P0^7;
  38          bit fillDogFlag;
  39          
  40          void OnKeyBoardOnline(BOOL i)
  41          {
  42   1              KeyBoardFlag=i;
  43   1      }       
  44          //---------------------------------------------------------------------------
  45          void OnPS2ReceiveChar(BYTE ReceChar,BOOL P)
  46          {
  47   1              BOOL ParityBit=0;
  48   1              ACC=ReceChar;
  49   1              CY=P;
  50   1              ParityBit=(BOOL)(CY?0x00:0x80);//奇校验位
  51   1              if(P==ParityBit);
  52   1              PS2RecChar=ReceChar;
  53   1      }
  54          //---------------------------------------------------------------------------
  55          int OnPS2SendChar(BYTE dat)
C51 COMPILER V8.05a   PS2                                                                  04/24/2009 21:28:43 PAGE 2   

  56          {       int temp;
  57   1              BOOL ParityBit;
  58   1              BYTE i;
  59   1              ACC=dat;
  60   1              CY=P;
  61   1         
  62   1              ParityBit=(BOOL)(CY?0x00:0x80); //奇校验位
  63   1              
  64   1              
  65   1              CLSSIGNAL();
  66   1      
  67   1              CT_KB=OFF;
  68   1              EA=0;   //Int0 disable
  69   1      
  70   1              H_DATA=0;Delay10us();//start bit
  71   1              H_CLK=1;
  72   1              if(H_CLK==1)
  73   1              {
  74   2              Delay10us();
  75   2              H_CLK=0;
  76   2              Delay30us();
  77   2              
  78   2              for(i=0;i<8;i++)
  79   2              {
  80   3                      if(dat&0x01==0x01){H_DATA=1;Delay10us();}
  81   3                      else {H_DATA=0;Delay10us();}
  82   3                      dat>>=1;
  83   3                      H_CLK=1;
  84   3                      Delay10us();
  85   3                      H_CLK=0;
  86   3                      Delay30us();
  87   3              }
  88   2      
  89   2              H_DATA=ParityBit;Delay10us();//parity bit
  90   2              H_CLK=1;
  91   2              Delay10us();
  92   2              H_CLK=0;
  93   2              Delay30us();
  94   2      
  95   2              H_DATA=1;Delay10us();//stop bit
  96   2              H_CLK=1;
  97   2              Delay10us();
  98   2              H_CLK=0;
  99   2              Delay30us();
 100   2              temp=0x0000;
 101   2              }
 102   1              else  temp=0xffff;// Pc封锁发送 发送失败 errcode 0xfff
 103   1              
 104   1              IE0=0; //  cls INt0 ID
 105   1      
 106   1              H_CLK=1;
 107   1              H_DATA=1;
 108   1              
 109   1              CT_KB=ON;  //大键盘闭合 pc clk  Data  连接大键盘
 110   1              Delay30us();
 111   1                      EA=1;   // eanble int0
 112   1              return temp;
 113   1      }
 114          
 115          
 116          
 117          //---------------------------------------------------------------------------
C51 COMPILER V8.05a   PS2                                                                  04/24/2009 21:28:43 PAGE 3   

 118          void ExternInterrupt0(void) interrupt 0 
 119          {
 120   1              BOOL ParityBit=0,CLKFlag=1;
 121   1              BYTE i=0,j=8,dat=0x00;
 122   1      
 123   1              EA=0;
 124   1      
 125   1              while(CLKFlag)
 126   1              {
 127   2                      i++;
 128   2                      if(H_CLK==1)CLKFlag=0;
 129   2                      if(i>0xEE)
 130   2                      {       printf("Rcv err At Flag\n");  
 131   3                              IE0=0;
 132   3                              EX0=1;
 133   3                              return ;
 134   3                      }
 135   2              } 
 136   1              //while(j--)//延时等待大键盘的动作
 137   1              //{
 138   1              //      for(i=0;i<0x88;i++)//检查是否有数据处理 0x88
 139   1              //      {
 140   1              //              if(H_CLK==0)//有动作则是大键盘存在
 141   1              //              {
 142   1              //                      OnKeyBoardOnline(TRUE);//大键盘存在,开机由大键盘应答
 143   1              //                      IE0=0;
 144   1              //                      EX0=1;
 145   1              ////                    return ;//存在的话置标志位,并返回
 146   1              //              }
 147   1              //      }
 148   1              //}
 149   1      
 150   1              OnKeyBoardOnline(FALSE);//大键盘不存在,由小键盘应答
 151   1      
 152   1              
 153   1              //转到接收
 154   1              for(i=0;i<8;i++)//read 8bit
 155   1              {
 156   2                      Delay30us();
 157   2                      H_CLK=0;            
 158   2                      Delay30us();
 159   2                      H_CLK=1;
 160   2                      dat=dat>>1; 
 161   2                      if(H_DATA)dat|=0x80;
 162   2                       
 163   2                      if(H_CLK==0){ printf("Rcv Err\n");      return ;        }//如果时钟被拉低,则有错误发生
 164   2              }
 165   1                                                                                       
 166   1              Delay30us();
 167   1              H_CLK=0;            
 168   1              Delay30us();
 169   1              H_CLK=1;
 170   1              if(H_DATA)ParityBit=1;
 171   1              else ParityBit=0; 
 172   1      
 173   1              Delay30us();
 174   1              H_CLK=0;            
 175   1              Delay30us();
 176   1              H_CLK=1;//STOP BIT H_DATA 0 ERR
 177   1              
 178   1              Delay10us();                                                                                                                                                                      
 179   1              H_DATA=0;       //ACK bit
C51 COMPILER V8.05a   PS2                                                                  04/24/2009 21:28:43 PAGE 4   

 180   1              Delay10us();
 181   1              H_CLK=0;
 182   1              Delay30us();Delay30us();
 183   1              H_CLK=1;
 184   1              Delay30us();
 185   1              H_DATA=1;
 186   1              
 187   1              OnPS2ReceiveChar(dat,ParityBit); // 记录到PS2Recchar 中
 188   1              printf("RcvDat %x\n",(unsigned int)PS2RecChar);
 189   1              IE0=0;   //Cls Biao ji
 190   1              EA=1;           //允许中断
 191   1              return ;
 192   1      }
 193          //---------------------------------------------------------------------------
 194          void ProcessPS2(void)
 195          {       EA=0;
 196   1              if(PS2RecChar!=0xCC )//大键盘不存在
 197   1              {
 198   2                      if(PS2RecChar==0xF3)//1
 199   2                      {
 200   3                              OnPS2SendChar(0xFA);
 201   3                              PS2RecChar=0xCC;
 202   3                      }
 203   2                      else if(PS2RecChar==0x00)//11
 204   2                      {
 205   3                              OnPS2SendChar(0xFA);
 206   3                              PS2RecChar=0xCC;
 207   3                      }
 208   2                      else if(PS2RecChar==0x02)//111
 209   2                      {
 210   3                              OnPS2SendChar(0xFA);
 211   3                              PS2RecChar=0xCC;
 212   3                      }
 213   2                      else if(PS2RecChar==0x20)//1111
 214   2                      {
 215   3                              OnPS2SendChar(0xFA);
 216   3                              PS2RecChar=0xCC;
 217   3                      }
 218   2                      else if(PS2RecChar==0xED)//2  0xED (Set/Reset LEDs) 主机在本命令后跟随一个参数字节用于指示键盘上Num Lock
             -, Caps Lock,
 219   2                                                                      //      and Scroll Lock LED 的状态这个参数字节的定义如下
 220   2                      {
 221   3                              OnPS2SendChar(0xFA);
 222   3                              PS2RecChar=0xCC;
 223   3                      }
 224   2                      else if(PS2RecChar==0xF0) //3
 225   2                      {
 226   3                              OnPS2SendChar(0xFA);
 227   3                              PS2RecChar=0xCC;
 228   3                      }
 229   2                      else if(PS2RecChar==0xF2)//4  *0xF2 (Read ID) 键盘回应两个字节的设备ID 0xAB 0x83
 230   2                      {
 231   3                              OnPS2SendChar(0xFA);
 232   3                              Delay30us();

⌨️ 快捷键说明

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