📄 ps2.lst
字号:
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 + -