📄 keyread.lst
字号:
C51 COMPILER V8.02 KEYREAD 04/10/2008 10:43:46 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE KEYREAD
OBJECT MODULE PLACED IN .\xiazai\keyread.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE daima\keyread.c BROWSE DEBUG OBJECTEXTEND PRINT(.\keyread.lst) OBJECT(.\xia
-zai\keyread.obj)
line level source
1 #include"reg51.h"
2 sbit KEY_CLK=P3^6;
3 sbit KEY_DATA=P3^7;
4 //PS2每次发送11个数据位分别为起始位+八个数据位+奇偶校验位+停止位
5 bit keyread(unsigned char *keyborad);
6
7
8 bit keyread(unsigned char *keyborad)
9 {
10 1 static unsigned char passnumber=0;
11 1 xdata unsigned char key;
12 1 xdata unsigned int wi=0;
13 1 xdata unsigned char i=0;
14 1 EA=0; //每次扫描PS2协议时,都要关总中断允许位,PS2通信时不能被中断,否则会读错数据
15 1 KEY_CLK=1;
16 1 while(KEY_CLK){if(++wi>50) { KEY_CLK=0; EA=1;return(0);} } //拉高时钟线,如果键盘有数据要发,要在50微秒
-内拉低时钟线
17 1 while(!KEY_CLK){if(++wi>500) { KEY_CLK=0;EA=1;return(0);}} //跳过始位
18 1
19 1 for(i=0;i<10;i++)
20 1 { while(KEY_CLK){if(++wi>500) { KEY_CLK=0;EA=1; return(0); }} //return(0);
21 2 if(i>=0&&i<=7) //只接收八位数据位,跳过奇偶校验位和停止位
22 2 { key=key>>1;
23 3 if(KEY_DATA)
24 3 key=key|0x80;}
25 2 while(!KEY_CLK)
26 2 {
27 3 if(++wi>500) { KEY_CLK=0;EA=1;return(0);}
28 3 }
29 2 }
30 1
31 1
32 1 KEY_CLK=0;EA=1; //拉低时钟线,抑制键盘发送数据,再开总中断允许位
33 1 if(key==0xE1) //第三类键
34 1 passnumber=passnumber+2;
35 1 if(key==0xE0) //第二类键
36 1 ++passnumber; //这里有passnumber是为了只接后一组数据中的第一个,屏蔽每两个
37 1 if(key==0xF0)
38 1 passnumber=passnumber+2;
39 1 if(passnumber==0)
40 1 { *keyborad=key;
41 2 return(1); //如果成功接收一个键盘通码,就把flagre置1
42 2 }
43 1 else
44 1 {
45 2 --passnumber;
46 2 return(0);
47 2
48 2 }
49 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 210 ----
C51 COMPILER V8.02 KEYREAD 04/10/2008 10:43:46 PAGE 2
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- 4
PDATA SIZE = ---- ----
DATA SIZE = 1 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -