📄 ps2.lst
字号:
C51 COMPILER V7.06 PS2 03/11/2009 16:59:41 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE PS2
OBJECT MODULE PLACED IN PS2.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE PS2.C BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include <reg51.h>
2 #include "PS2.H"
3
4 BYTE PS2RecChar=0xCC;
5 BOOL KeyBoardFlag=FALSE;
6
7 void OnKeyBoardOnline(BOOL i)
8 {
9 1 KeyBoardFlag=i;
10 1 }
11 //---------------------------------------------------------------------------
12 void OnPS2ReceiveChar(BYTE ReceChar,BOOL P)
13 {
14 1 BOOL ParityBit=0;
15 1 ACC=ReceChar;
16 1 CY=P;
17 1 ParityBit=(BOOL)(CY?0x00:0x80);//奇校验位
18 1 if(P==ParityBit);
19 1 PS2RecChar=ReceChar;
20 1 }
21 //---------------------------------------------------------------------------
22 void OnPS2SendChar(BYTE dat)
23 {
24 1 BOOL ParityBit;
25 1 BYTE i;
26 1 ACC=dat;
27 1 CY=P;
28 1 ParityBit=(BOOL)(CY?0x00:0x80);//奇校验位
29 1
30 1 CLSSIGNAL();
31 1
32 1 EX0=0;
33 1
34 1 H_DATA=0;
35 1 Delay10us();//start bit
36 1 H_CLK=1;
37 1 Delay10us();
38 1 H_CLK=0;
39 1 Delay30us();
40 1
41 1 for(i=0;i<8;i++)
42 1 {
43 2 if(dat&0x01==0x01){H_DATA=1;Delay10us();}
44 2 else {H_DATA=0;Delay10us();}
45 2 dat>>=1;
46 2 H_CLK=1;
47 2 Delay10us();
48 2 H_CLK=0;
49 2 Delay30us();
50 2 }
51 1
52 1 H_DATA=ParityBit;
53 1 Delay10us();//parity bit
54 1 H_CLK=1;
55 1 Delay10us();
C51 COMPILER V7.06 PS2 03/11/2009 16:59:41 PAGE 2
56 1 H_CLK=0;
57 1 Delay30us();
58 1
59 1 H_DATA=1;
60 1 Delay10us();//stop bit
61 1 H_CLK=1;
62 1 Delay10us();
63 1 H_CLK=0;
64 1 Delay30us();
65 1
66 1 IE0=0;
67 1 EX0=1;
68 1 H_CLK=1;
69 1 H_DATA=1;
70 1 Delay30us();
71 1 }
72 //---------------------------------------------------------------------------
73 void ExternInterrupt0(void) interrupt 0
74 {
75 1 BOOL ParityBit=0,CLKFlag=1;
76 1 BYTE i=0,j=8,dat=0x00;
77 1
78 1 EX0=0;
79 1
80 1 while(CLKFlag)
81 1 {
82 2 i++;
83 2 if(H_CLK==1)CLKFlag=0;
84 2 if(i>0xEE)
85 2 {
86 3 IE0=0;
87 3 EX0=1;
88 3 return ;
89 3 }
90 2 }
91 1 while(j--)//延时等待大键盘的动作
92 1 {
93 2 for(i=0;i<0x88;i++)//检查是否有数据处理 0x88
94 2 {
95 3 if(H_CLK==0)//有动作则是大键盘存在
96 3 {
97 4 OnKeyBoardOnline(TRUE);//大键盘存在,开机由大键盘应答
98 4 IE0=0;
99 4 EX0=1;
100 4 return ;//存在的话置标志位,并返回
101 4 }
102 3 }
103 2 }
104 1 OnKeyBoardOnline(FALSE);//大键盘不存在,由小键盘应答
105 1
106 1 //转到接收
107 1 for(i=0;i<8;i++)//read 8bit
108 1 {
109 2 Delay30us();
110 2 H_CLK=0;
111 2 Delay30us();
112 2 H_CLK=1;
113 2 dat=dat>>1;
114 2 if(H_DATA)dat|=0x80;
115 2
116 2 if(H_CLK==0){ return; }//如果时钟被拉低,则有错误发生
117 2 }
C51 COMPILER V7.06 PS2 03/11/2009 16:59:41 PAGE 3
118 1
119 1 Delay30us();
120 1 H_CLK=0;
121 1 Delay30us();
122 1 H_CLK=1;
123 1 if(H_DATA)ParityBit=1;
124 1 else ParityBit=0;
125 1
126 1 Delay30us();
127 1 H_CLK=0;
128 1 Delay30us();
129 1 H_CLK=1;//STOP BIT H_DATA 0 ERR
130 1
131 1 Delay10us();
132 1 H_DATA=0; //ACK bit
133 1 Delay10us();
134 1 H_CLK=0;
135 1 Delay30us();Delay30us();
136 1 H_CLK=1;
137 1 Delay30us();
138 1 H_DATA=1;
139 1
140 1 OnPS2ReceiveChar(dat,ParityBit);
141 1
142 1 IE0=0;
143 1 EX0=1;
144 1 return ;
145 1 }
146 //---------------------------------------------------------------------------
147 void ProcessPS2(void)
148 {
149 1 if(KeyBoardFlag==FALSE)//大键盘不存在
150 1 {
151 2 if(PS2RecChar==0xF3)//1
152 2 {
153 3 OnPS2SendChar(0xFA);
154 3 PS2RecChar=0xCC;
155 3 }
156 2 else if(PS2RecChar==0x00)//11
157 2 {
158 3 OnPS2SendChar(0xFA);
159 3 PS2RecChar=0xCC;
160 3 }
161 2 else if(PS2RecChar==0x02)//111
162 2 {
163 3 OnPS2SendChar(0xFA);
164 3 PS2RecChar=0xCC;
165 3 }
166 2 else if(PS2RecChar==0x20)//1111
167 2 {
168 3 OnPS2SendChar(0xFA);
169 3 PS2RecChar=0xCC;
170 3 }
171 2 else if(PS2RecChar==0xED)//2
172 2 {
173 3 OnPS2SendChar(0xFA);
174 3 PS2RecChar=0xCC;
175 3 }
176 2 else if(PS2RecChar==0xF0)//3
177 2 {
178 3 OnPS2SendChar(0xFA);
179 3 PS2RecChar=0xCC;
C51 COMPILER V7.06 PS2 03/11/2009 16:59:41 PAGE 4
180 3 }
181 2 else if(PS2RecChar==0xF2)//4
182 2 {
183 3 OnPS2SendChar(0xFA);
184 3 Delay30us();
185 3 OnPS2SendChar(0xAB);
186 3 Delay30us();
187 3 OnPS2SendChar(0x83);
188 3 PS2RecChar=0xCC;
189 3 }
190 2 else if(PS2RecChar==0xEF)//5
191 2 {
192 3 OnPS2SendChar(0xFA);
193 3 Delay30us();
194 3 OnPS2SendChar(0xBF);
195 3 Delay30us();
196 3 OnPS2SendChar(0xB0);
197 3 PS2RecChar=0xCC;
198 3 }
199 2 else if(PS2RecChar==0xF3)//6
200 2 {
201 3 OnPS2SendChar(0xFA);
202 3 PS2RecChar=0xCC;
203 3 }
204 2 else if(PS2RecChar==0xFE)//7 //resend
205 2 {
206 3 PS2RecChar=0xCC;
207 3 }
208 2 else if(PS2RecChar==0xEE)//8
209 2 {
210 3 OnPS2SendChar(0xEE);
211 3 PS2RecChar=0xCC;
212 3 }
213 2 else if(PS2RecChar==0xEE)//9
214 2 {
215 3 OnPS2SendChar(0xEE);
216 3 PS2RecChar=0xCC;
217 3 }
218 2 else if(PS2RecChar==0xF1)//10
219 2 {
220 3 OnPS2SendChar(0xFA);
221 3 PS2RecChar=0xCC;
222 3 }
223 2 else if(PS2RecChar==0xF4)//11
224 2 {
225 3 OnPS2SendChar(0xFA);
226 3 PS2RecChar=0xCC;
227 3 }
228 2 else if(PS2RecChar==0xAA)//12
229 2 {
230 3 OnPS2SendChar(0xAA);
231 3 PS2RecChar=0xCC;
232 3 }
233 2 else if(PS2RecChar==0xFF)//13
234 2 {
235 3 OnPS2SendChar(0xFA);
236 3 Delay30us();
237 3 OnPS2SendChar(0xAA);
238 3 Delay30us();
239 3 PS2RecChar=0xCC;
240 3 }
241 2 else ;
C51 COMPILER V7.06 PS2 03/11/2009 16:59:41 PAGE 5
242 2 }
243 1 }
244 //---------------------------------------------------------------------------
245 void PS2Init(void)
246 {
247 1 IT0=0; //低电平触发中断
248 1 PX0=1;
249 1 EX0=1;
250 1 }
251 //---------------------------------------------------------------------------
252
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 576 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 1 5
IDATA SIZE = ---- ----
BIT SIZE = 1 6
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -