📄 ps2.lst
字号:
C51 COMPILER V7.50 PS2 05/22/2008 08:53:59 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE PS2
OBJECT MODULE PLACED IN PS2.OBJ
COMPILER INVOKED BY: D:\Program Files\Keil2\C51\BIN\C51.EXE PS2.C BROWSE DEBUG OBJECTEXTEND
line 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 CT_KB=OFF;
33 1 EX0=0;
34 1
35 1 H_DATA=0;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;Delay10us();//parity bit
53 1 H_CLK=1;
54 1 Delay10us();
55 1 H_CLK=0;
C51 COMPILER V7.50 PS2 05/22/2008 08:53:59 PAGE 2
56 1 Delay30us();
57 1
58 1 H_DATA=1;Delay10us();//stop bit
59 1 H_CLK=1;
60 1 Delay10us();
61 1 H_CLK=0;
62 1 Delay30us();
63 1
64 1 IE0=0;
65 1 EX0=1;
66 1 H_CLK=1;
67 1 H_DATA=1;
68 1 CT_KB=ON;
69 1 Delay30us();
70 1 }
71 //---------------------------------------------------------------------------
72 void ExternInterrupt0(void) interrupt 0
73 {
74 1 BOOL ParityBit=0,CLKFlag=1;
75 1 BYTE i=0,j=8,dat=0x00;
76 1
77 1 EX0=0;
78 1
79 1 while(CLKFlag)
80 1 {
81 2 i++;
82 2 if(H_CLK==1)CLKFlag=0;
83 2 if(i>0xEE)
84 2 {
85 3 IE0=0;
86 3 EX0=1;
87 3 return ;
88 3 }
89 2 }
90 1 while(j--)//延时等待大键盘的动作
91 1 {
92 2 for(i=0;i<0x88;i++)//检查是否有数据处理 0x88
93 2 {
94 3 if(H_CLK==0)//有动作则是大键盘存在
95 3 {
96 4 OnKeyBoardOnline(TRUE);//大键盘存在,开机由大键盘应答
97 4 IE0=0;
98 4 EX0=1;
99 4 return ;//存在的话置标志位,并返回
100 4 }
101 3 }
102 2 }
103 1 OnKeyBoardOnline(FALSE);//大键盘不存在,由小键盘应答
104 1
105 1 //转到接收
106 1 for(i=0;i<8;i++)//read 8bit
107 1 {
108 2 Delay30us();
109 2 H_CLK=0;
110 2 Delay30us();
111 2 H_CLK=1;
112 2 dat=dat>>1;
113 2 if(H_DATA)dat|=0x80;
114 2
115 2 if(H_CLK==0){ return; }//如果时钟被拉低,则有错误发生
116 2 }
117 1
C51 COMPILER V7.50 PS2 05/22/2008 08:53:59 PAGE 3
118 1 Delay30us();
119 1 H_CLK=0;
120 1 Delay30us();
121 1 H_CLK=1;
122 1 if(H_DATA)ParityBit=1;
123 1 else ParityBit=0;
124 1
125 1 Delay30us();
126 1 H_CLK=0;
127 1 Delay30us();
128 1 H_CLK=1;//STOP BIT H_DATA 0 ERR
129 1
130 1 Delay10us();
131 1 H_DATA=0; //ACK bit
132 1 Delay10us();
133 1 H_CLK=0;
134 1 Delay30us();Delay30us();
135 1 H_CLK=1;
136 1 Delay30us();
137 1 H_DATA=1;
138 1
139 1 OnPS2ReceiveChar(dat,ParityBit);
140 1
141 1 IE0=0;
142 1 EX0=1;
143 1 return ;
144 1 }
145 //---------------------------------------------------------------------------
146 void ProcessPS2(void)
147 {
148 1 if(KeyBoardFlag==FALSE)//大键盘不存在
149 1 {
150 2 if(PS2RecChar==0xF3)//1
151 2 {
152 3 OnPS2SendChar(0xFA);
153 3 PS2RecChar=0xCC;
154 3 }
155 2 else if(PS2RecChar==0x00)//11
156 2 {
157 3 OnPS2SendChar(0xFA);
158 3 PS2RecChar=0xCC;
159 3 }
160 2 else if(PS2RecChar==0x02)//111
161 2 {
162 3 OnPS2SendChar(0xFA);
163 3 PS2RecChar=0xCC;
164 3 }
165 2 else if(PS2RecChar==0x20)//1111
166 2 {
167 3 OnPS2SendChar(0xFA);
168 3 PS2RecChar=0xCC;
169 3 }
170 2 else if(PS2RecChar==0xED)//2
171 2 {
172 3 OnPS2SendChar(0xFA);
173 3 PS2RecChar=0xCC;
174 3 }
175 2 else if(PS2RecChar==0xF0)//3
176 2 {
177 3 OnPS2SendChar(0xFA);
178 3 PS2RecChar=0xCC;
179 3 }
C51 COMPILER V7.50 PS2 05/22/2008 08:53:59 PAGE 4
180 2 else if(PS2RecChar==0xF2)//4
181 2 {
182 3 OnPS2SendChar(0xFA);
183 3 Delay30us();
184 3 OnPS2SendChar(0xAB);
185 3 Delay30us();
186 3 OnPS2SendChar(0x83);
187 3 PS2RecChar=0xCC;
188 3 }
189 2 else if(PS2RecChar==0xEF)//5
190 2 {
191 3 OnPS2SendChar(0xFA);
192 3 Delay30us();
193 3 OnPS2SendChar(0xBF);
194 3 Delay30us();
195 3 OnPS2SendChar(0xB0);
196 3 PS2RecChar=0xCC;
197 3 }
198 2 else if(PS2RecChar==0xF3)//6
199 2 {
200 3 OnPS2SendChar(0xFA);
201 3 PS2RecChar=0xCC;
202 3 }
203 2 else if(PS2RecChar==0xFE)//7 //resend
204 2 {
205 3 PS2RecChar=0xCC;
206 3 }
207 2 else if(PS2RecChar==0xEE)//8
208 2 {
209 3 OnPS2SendChar(0xEE);
210 3 PS2RecChar=0xCC;
211 3 }
212 2 else if(PS2RecChar==0xEE)//9
213 2 {
214 3 OnPS2SendChar(0xEE);
215 3 PS2RecChar=0xCC;
216 3 }
217 2 else if(PS2RecChar==0xF1)//10
218 2 {
219 3 OnPS2SendChar(0xFA);
220 3 PS2RecChar=0xCC;
221 3 }
222 2 else if(PS2RecChar==0xF4)//11
223 2 {
224 3 OnPS2SendChar(0xFA);
225 3 PS2RecChar=0xCC;
226 3 }
227 2 else if(PS2RecChar==0xAA)//12
228 2 {
229 3 OnPS2SendChar(0xAA);
230 3 PS2RecChar=0xCC;
231 3 }
232 2 else if(PS2RecChar==0xFF)//13
233 2 {
234 3 OnPS2SendChar(0xFA);
235 3 Delay30us();
236 3 OnPS2SendChar(0xAA);
237 3 Delay30us();
238 3 PS2RecChar=0xCC;
239 3 }
240 2 else ;
241 2 }
C51 COMPILER V7.50 PS2 05/22/2008 08:53:59 PAGE 5
242 1 }
243 //---------------------------------------------------------------------------
244 void PS2Init(void)
245 {
246 1 IT0=0; //低电平触发中断
247 1 PX0=1;
248 1 EX0=1;
249 1 }
250 //---------------------------------------------------------------------------
251 /*
252 //用法-以下文件在main.c--------------------------------------------------------------------------
253 //把PS2.C Delay.asm加入工程
254 extern void ProcessPS2(void);
255 extern void PS2Init(void)
256 void main(void)
257 {
258 //晶振为18.432 其他的频率需要修改延时程序
259 //往PC上发按键使用OnPS2SendChar();
260 //OnPS2SendChar(0x15);//Q//发送通码
261
262 //OnPS2SendChar(0xF0);
263 //OnPS2SendChar(0x15);//Q//发送断码
264 PS2Init();
265 while(1)
266 {
267 ProcessPS2();//开机应答,使电脑能识别到键盘
268 //other code
269 }
270 }
271
272 */
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 580 ----
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 + -