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

📄 ps2.lst

📁 通过8x16键盘扫描模拟Ps2键盘通过测试成功 硬件:P1P2接16跟列扫描线 P0接8跟行线 P3.6=PS2_data P3.7=CLK INT0接DATA 修改扫描码就可用 绝对好用~~~
💻 LST
📖 第 1 页 / 共 2 页
字号:
 233   3                              OnPS2SendChar(0xAB);
 234   3                              Delay30us();
 235   3                              OnPS2SendChar(0x83);
 236   3                              PS2RecChar=0xCC;
 237   3                      }
 238   2                      else if(PS2RecChar==0xEF)//5
 239   2                      {
 240   3                              OnPS2SendChar(0xFA);
C51 COMPILER V8.05a   PS2                                                                  04/24/2009 21:28:43 PAGE 5   

 241   3                              Delay30us();
 242   3                              OnPS2SendChar(0xBF);
 243   3                              Delay30us();
 244   3                              OnPS2SendChar(0xB0);
 245   3                              PS2RecChar=0xCC;
 246   3                      }
 247   2                      else if(PS2RecChar==0xF3) //6   主机在这条命令后会发送一个字节的参数来定义机打速率和延
 248   2                      {
 249   3                              OnPS2SendChar(0xFA);
 250   3                              PS2RecChar=0xCC;
 251   3                      }
 252   2                      else if(PS2RecChar==0xFE)//7 //resend
 253   2                      {
 254   3                              PS2RecChar=0xCC;
 255   3                      }
 256   2                      else if(PS2RecChar==0xEE)//8
 257   2                      {
 258   3                              OnPS2SendChar(0xEE);
 259   3                              PS2RecChar=0xCC;
 260   3                      }
 261   2                      else if(PS2RecChar==0xEE)//9
 262   2                      {
 263   3                              OnPS2SendChar(0xEE);
 264   3                              PS2RecChar=0xCC;
 265   3                      }
 266   2                      else if(PS2RecChar==0xF1)//10
 267   2                      {
 268   3                              OnPS2SendChar(0xFA);
 269   3                              PS2RecChar=0xCC;
 270   3                      }
 271   2                      else if(PS2RecChar==0xF4)//11 在用上一条命令禁止键盘后重新使能键盘
 272   2                      {
 273   3                              OnPS2SendChar(0xFA);
 274   3                              PS2RecChar=0xCC;
 275   3                      }
 276   2                      else if(PS2RecChar==0xAA)//12
 277   2                      {
 278   3                              OnPS2SendChar(0xAA);
 279   3                              PS2RecChar=0xCC;
 280   3                      }
 281   2                      else if(PS2RecChar==0xFF)//13 0xFF (Reset) 引起键盘进入Reset 模式见复位部分
 282   2                      {       
 283   3                              OnPS2SendChar(0xFA);
 284   3                              Delay30us();
 285   3                              OnPS2SendChar(0xAA);
 286   3                              Delay30us();
 287   3                              PS2RecChar=0xCC;
 288   3                              fillDogFlag=0; 
 289   3                              printf("Reset HardWare\n");
 290   3      
 291   3                      }
 292   2                      else { 
 293   3                      printf("NC=%x",PS2RecChar);
 294   3                      OnPS2SendChar(0xFA); PS2RecChar=0xCC;}
 295   2              }                                                                                                                                                                                                  
 296   1      EA=1;                                                   
 297   1      }
 298          //---------------------------------------------------------------------------
 299          void PS2Init(void)
 300          {
 301   1              IT0=0;  //低电平触发中断
 302   1              PX0=1;  
C51 COMPILER V8.05a   PS2                                                                  04/24/2009 21:28:43 PAGE 6   

 303   1              EX0=1;
 304   1              EA=1;   
 305   1      }
 306          //---------------------------------------------------------------------------
 307          //用法-以下文件在main.c--------------------------------------------------------------------------
 308          //把PS2.C Delay.asm加入工程
 309          extern void ProcessPS2(void);
 310          extern void PS2Init(void);
 311          sbit nLed1 = P2^2;
 312          sfr WDT_CONTR = 0xe1;
 313          bit temp,temp1;
 314           
 315          char andbit;
 316          unsigned int andbit2;
 317          #ifdef MONITOR51                         /* Debugging with Monitor-51 needs   */
              char code reserve [3] _at_ 0x23;         /* space for serial interrupt if     */
              #endif                                   /* Stop Exection with Serial Intr.   */
 320                                                   /* is enabled                        */
 321          void main(void)                  
 322          {         int i=0; 
 323   1                int j=0;      
 324   1               char pdata Data[16],hsData[16],Data3[16];
 325   1               bit keep; 
 326   1               int k; 
 327   1               char ScanH; 
 328   1              //晶振为18.432 其他的频率需要修改延时程序
 329   1              //往PC上发按键使用OnPS2SendChar();
 330   1              
 331   1        #ifndef MONITOR51
 332   1          SCON  = 0x50;                       /* SCON: mode 1, 8-bit UART, enable rcvr      */
 333   1          TMOD |= 0x20;               /* TMOD: timer 1, mode 2, 8-bit reload        */
 334   1          TH1   = 0xfb;                /* TH1:  reload value for 9600 baud @ 18.43MHz   */
 335   1          TR1   = 1;                  /* TR1:  timer 1 run                          */
 336   1          TI    = 1;                  /* TI:   set TI to send first char of UART    */
 337   1      #endif
 338   1               
 339   1                 //printf("Init PS2");
 340   1                      PS2Init();
 341   1                      
 342   1                      OnPS2SendChar(0xaa); //BAT sucess
 343   1                      //for(j=0;j<10;j++)
 344   1                      for (i=0;i<500;i++)      
 345   1                       {                                
 346   2                                                      // OnPS2SendChar(0x15);//Q//发送通码    
 347   2                                                       OnPS2SendChar(0xf0);//
 348   2                                                      OnPS2SendChar(0x15);//Q//发送断码}
 349   2                                       ProcessPS2();
 350   2                                                              OnPS2SendChar(0xaa);
 351   2                                                      }
 352   1                 WDT_CONTR=0x3f ;//初始化看门狗
 353   1                 fillDogFlag=1;  //允许喂狗
 354   1      while(1)                                                            
 355   1                      
 356   1                                                              
 357   1              {  
 358   2              
 359   2                      
 360   2                      //开机应答,使电脑能识别到键盘   
 361   2                      //other code                    
 362   2                // OnPS2SendChar(0xaa);//Q//发送通码          
 363   2                 ProcessPS2();
 364   2             if       (fillDogFlag==1)WDT_CONTR=0x3f;//喂狗
C51 COMPILER V8.05a   PS2                                                                  04/24/2009 21:28:43 PAGE 7   

 365   2      
 366   2                // nLed1=P00;
 367   2               
 368   2               
 369   2                
 370   2       /* if(~P00)
 371   2               { Delay30us();
 372   2                        if(~P00)
 373   2      
 374   2                                              {       OnPS2SendChar(0x15);//Q//发送通码
 375   2                                 keep =~P00;
 376   2                                                 while(keep)  keep =~P00;
 377   2                                                  Delay30us();
 378   2                                                       OnPS2SendChar(0xF0);//
 379   2                                                       OnPS2SendChar(0x15);//Q//发送断码}
 380   2                                                       
 381   2                                                     //这段为单键扫描                          
 382   2                                                      
 383   2                                               }
 384   2                                        
 385   2                                                      
 386   2              } */
 387   2              andbit2=0x01;
 388   2      for( j=0;j<16;j++)
 389   2        {            
 390   3                          //设置P1口 某根线为低扫描 j行
 391   3                              
 392   3                              P1=~andbit2 &0x00ff;
 393   3                              P2= (~andbit2 & 0xff00)>>8;
 394   3      //      Delay30us();
 395   3      //      Delay30us();      
 396   3              hsData[j]=Data[j];
 397   3              for(k=0;k<2;k++)Delay30us(); //等P0口稳定
 398   3      
 399   3              Data[j]=P0;
 400   3      //      for(k=0;k<10;k++) Delay30us();
 401   3      //      Data3[j]=P0;
 402   3      
 403   3      //if(Data[j]==Data3[j]) //去抖动 P0 稳定了
 404   3      //      {
 405   3              if(Data[j]!=hsData[j])
 406   3              {   for(k=0;k<3;k++);Delay30us(); //100us
 407   4                      Data[j]=P0;   
 408   4                      andbit=0x01;
 409   4                      for(i=0;i<8;i++)
 410   4                      {                  
 411   5                                        ScanH=(SCANCODE[j][i]&0xff00)>>8;//
 412   5                                        if((Data[j]^hsData[j])&andbit&Data[j])
 413   5                                              {       //key i release 
 414   6                                                                                              
 415   6                                               printf("Key %d %d UP\n",j,i); 
 416   6                                      
 417   6                                         if(ScanH) OnPS2SendChar(ScanH);     //先发送高八位扫描码通码
 418   6                                              OnPS2SendChar(0xF0);             //                                                                                                      
 419   6                                              OnPS2SendChar(SCANCODE[j][i]);//发送i键低八位断码}
 420   6                                               }
 421   5                              andbit<<=1;
 422   5                      }                                                               
 423   4                      andbit=0x01;
 424   4                      for(i=0;i<8;i++)           
 425   4                      {             // key i  push down
 426   5                                       ScanH=(SCANCODE[j][i]&0xff00)>>8;//
C51 COMPILER V8.05a   PS2                                                                  04/24/2009 21:28:43 PAGE 8   

 427   5                                      if((Data[j]^hsData[j])&andbit&~Data[j])
 428   5                                       {              
 429   6                                        printf("Key %d %d down\n",j,i);                                                                                          
 430   6                                       if( ScanH ) OnPS2SendChar( ScanH );//先发送高八位扫描码通码
 431   6                                       OnPS2SendChar(SCANCODE[j][i]);////发送i键通码} 
 432   6                                        }
 433   5                       andbit<<=1;    
 434   5                   }                          
 435   4                        
 436   4                      
 437   4              //              if(P00) { nLed1=0;      
 438   4              //                       }
 439   4              //               else 
 440   4              //                       { nLed1=1;     
 441   4                                                 }
 442   3                         
 443   3               //} //end if 
 444   3       
 445   3               andbit2<<=1;
 446   3              } //end for j                                                                                                                                                                                                   
 447   2      } //end while
 448   1              Delay30us();
 449   1      
 450   1              
 451   1              
 452   1      
 453   1                              
 454   1       
 455   1      }
*** WARNING C280 IN LINE 324 OF PS2.C: 'Data3': unreferenced local variable
*** WARNING C280 IN LINE 325 OF PS2.C: 'keep': unreferenced local variable


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1417    ----
   CONSTANT SIZE    =    345    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----      48
   DATA SIZE        =      4      14
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      4       7
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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