📄 ps2drv.lst
字号:
C51 COMPILER V6.23a PS2DRV 08/17/2006 16:45:39 PAGE 1
C51 COMPILER V6.23a, COMPILATION OF MODULE PS2DRV
OBJECT MODULE PLACED IN .\Obj\PS2Drv.obj
COMPILER INVOKED BY: C:\KEIL\C51\BIN\C51.EXE ..\..\Driver\PS2\PS2Drv\PS2Drv.c LARGE OPTIMIZE(2,SPEED) MODP2 PRINT(.\Obj\
-PS2Drv.lst) OBJECT(.\Obj\PS2Drv.obj)
stmt level source
1 /*------------------------------------------------------------------
2 * CopyRight (C) 2005,江苏盛唐电子产品有限公司
3 * All Rights Reserved.
4 *
5 * 文件名称:PS2Drv.c
6 * 文件标识:
7 * 摘 要:I/o口线模拟的PS2接口功能函数。
8 *
9 * 当前版本:1.0
10 * 作 者:熊刚
11 * 完成日期:2005年10月7日
12 *
13 * 取代版本:
14 * 原作者 :
15 * 完成日期:
16 --------------------------------------------------------------------*/
17
18 //#include<conio.h>
19 #include "..\..\inc\includes.h"
20
21 sbit PS2Kbd_Data = P1^1;
22 sbit PS2Kbd_Clk = P1^2;
23
24 #define PS2ClkToLow() PS2Kbd_Clk=0
25 #define PS2ClkToHigh() PS2Kbd_Clk=1
26 #define PS2DataToLow() PS2Kbd_Data=0
27 #define PS2DataToHigh() PS2Kbd_Data=1
28
29 #define PS2DataTransEnable() PS2Kbd_Clk = 1
30 #define PS2DataTransDisable() PS2Kbd_Clk = 0
31
32 uchar ucPS2CommErrFlag = 0;
33
34 static bool GetPS2DataStatus(void)
35 {
36 1 // PS2Kbd_Data=1;
37 1 return(PS2Kbd_Data);
38 1 }
39
40 static bool GetPS2ClkStatus(void)
41 {
42 1 // PS2Kbd_Clk=1;
43 1 return(PS2Kbd_Clk);
44 1 }
45
46 static void Delay10Us(uchar ucDelayCount)
47 {
48 1 register uchar uci;
49 1
50 1 if(ucDelayCount == 0)
51 1 {
52 2 return;
53 2 }
54 1 for( ;ucDelayCount>0;ucDelayCount--)
C51 COMPILER V6.23a PS2DRV 08/17/2006 16:45:39 PAGE 2
55 1 {
56 2 for(uci=0; uci<30; uci++)
57 2 {
58 3 _nop_();
59 3 }
60 2 }
61 1 }
62
63 static void CaptureClkLow(void)
64 {
65 1 while(1)
66 1 {
67 2 if(GetPS2ClkStatus() == 1)
68 2 {
69 3 break;
70 3 }
71 2 }
72 1
73 1 while(1)
74 1 {
75 2 if(GetPS2ClkStatus() == 0)
76 2 {
77 3 if(GetPS2ClkStatus() == 0)
78 3 {
79 4 break;
80 4 }
81 3 }
82 2 }
83 1 }
84
85 static void CaptureClkHigh(void)
86 {
87 1 while(1)
88 1 {
89 2 if(GetPS2ClkStatus() == 0)
90 2 {
91 3 break;
92 3 }
93 2 }
94 1
95 1 while(1)
96 1 {
97 2 if(GetPS2ClkStatus() == 1)
98 2 {
99 3 if(GetPS2ClkStatus() == 1)
100 3 {
101 4 break;
102 4 }
103 3 }
104 2 }
105 1 }
106
107 /**************************************************
108 功能介绍:实现向PS2口发送1个字符的功能。
109 入口参数: 待发送的字符
110 返回: 发送是否成功。true 表示成功
111 备注:
112 ***************************************************/
113 bool PS2_SendChar(uchar ucSendChar)
114 {
115 1 uchar ucCount;
116 1 bool ucOddValue;
C51 COMPILER V6.23a PS2DRV 08/17/2006 16:45:39 PAGE 3
117 1 uchar ucTempVal;
118 1
119 1 ucOddValue = true;
120 1 ucTempVal = ucSendChar;
121 1
122 1 // ComShowString(COM_1,"start Test pS2");
123 1
124 1 // printf("start Send char to Ps2 Kbd\n");
125 1
126 1 for(ucCount=0; ucCount<8; ucCount++)
127 1 {
128 2 if(ucTempVal & 0x01)
129 2 {
130 3 ucOddValue = !ucOddValue;
131 3 }
132 2 ucTempVal >>= 1;
133 2 }
134 1
135 1 PS2ClkToLow();
136 1 PS2DataToLow();
137 1 Delay10Us(10);
138 1
139 1 DISABLE;
140 1
141 1 PS2ClkToHigh();
142 1
143 1 ucTempVal = ucSendChar;
144 1 for(ucCount=0; ucCount<8; ucCount++)
145 1 {
146 2 CaptureClkLow();
147 2 if(ucTempVal & 0x01)
148 2 {
149 3 PS2DataToHigh();
150 3 }
151 2 else
152 2 {
153 3 PS2DataToLow();
154 3 }
155 2 ucTempVal >>= 1;
156 2 }
157 1
158 1 CaptureClkLow();
159 1 if(ucOddValue)
160 1 {
161 2 PS2DataToHigh();
162 2 }
163 1 else
164 1 {
165 2 PS2DataToLow();
166 2 }
167 1
168 1 CaptureClkLow();
169 1 PS2DataToHigh();
170 1
171 1 CaptureClkLow();
172 1 if(GetPS2DataStatus() == 0)
173 1 {
174 2 CaptureClkHigh();
175 2 ENABLE;
176 2 return true;
177 2 }
178 1 else
C51 COMPILER V6.23a PS2DRV 08/17/2006 16:45:39 PAGE 4
179 1 {
180 2 CaptureClkHigh();
181 2 ENABLE;
182 2 return false;
183 2 }
184 1 }
185
186 static bool PS2_ReadChar(uchar *ucGetChar)
187 {
188 1 uchar data ucCount;
189 1 bool ucOddValue;
190 1 uchar ucTempVal;
191 1 uchar ucResult;
192 1 uint data uiDelayCount;
193 1
194 1
195 1 ucOddValue = true;
196 1
197 1 DISABLE;
198 1 PS2DataTransEnable();
199 1 PS2Kbd_Data=1;
200 1 PS2Kbd_Clk=1;
201 1 uiDelayCount = 0x1ff; //关键时间
202 1 while(--uiDelayCount)
203 1 {
204 2 if(GetPS2ClkStatus() == 0)
205 2 {
206 3 // DISABLE;
207 3 break;
208 3 }
209 2 }
210 1 if(GetPS2ClkStatus() != 0) //Repeat check
211 1 {
212 2 *ucGetChar = 0;
213 2
214 2 ENABLE;
215 2 return false;
216 2 }
217 1
218 1 if(GetPS2DataStatus())
219 1 {
220 2 if(GetPS2DataStatus())
221 2 {
222 3 *ucGetChar = 0;
223 3
224 3 ucPS2CommErrFlag = 1;
225 3 ComShowString(COM_1,"START BIT ERR");
226 3
227 3 ENABLE;
228 3 return false;
229 3 }
230 2 }
231 1
232 1 ucTempVal = 0x01;
233 1 ucResult = 0;
234 1 for(ucCount=0; ucCount<8; ucCount++)
235 1 {
236 2 CaptureClkLow();
237 2 if(GetPS2DataStatus())
238 2 {
239 3 ucResult |= ucTempVal;
240 3 ucOddValue = !ucOddValue;
C51 COMPILER V6.23a PS2DRV 08/17/2006 16:45:39 PAGE 5
241 3 }
242 2 ucTempVal <<= 1;
243 2 }
244 1
245 1 CaptureClkLow();
246 1 if(GetPS2DataStatus() != ucOddValue)
247 1 {
248 2 if(GetPS2DataStatus() != ucOddValue)
249 2 {
250 3 ucPS2CommErrFlag = 1;
251 3 ComShowString(COM_1,"Odd Check ERR");
252 3
253 3 ENABLE;
254 3 return false;
255 3 }
256 2 }
257 1
258 1 CaptureClkLow();
259 1 if(GetPS2DataStatus() == 0)
260 1 {
261 2 if(GetPS2DataStatus() == 0)
262 2 {
263 3
264 3 ucPS2CommErrFlag = 1;
265 3 ComShowString(COM_1,"STOP BIT ERR");
266 3
267 3 ENABLE;
268 3 return false;
269 3 }
270 2 }
271 1
272 1 *ucGetChar = ucResult;
273 1 ucPS2CommErrFlag = 0;
274 1 CaptureClkHigh();
275 1 PS2DataTransDisable();
276 1
277 1 ENABLE;
278 1 return true;
279 1 }
280
281 /**************************************************
282 功能介绍:实现从PS2口接收1个字符的功能。
283 入口参数: 接收字符存放的缓冲区指针
284 返回: 接收是否成功。true 表示成功
285 备注: 有延时等待发生。
286 ***************************************************/
287 bool PS2_GetChar(uchar *ucGetChar)
288 {
289 1 /*
290 1 if(ucPS2CommErrFlag)
291 1 {
292 1 PS2_SendChar(0xFE);
293 1 BeepShort();
294 1 }
295 1 */
296 1 return (PS2_ReadChar(ucGetChar));
297 1
298 1 }
299
300
C51 COMPILER V6.23a PS2DRV 08/17/2006 16:45:39 PAGE 6
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 684 ----
CONSTANT SIZE = 41 ----
XDATA SIZE = 1 15
PDATA SIZE = ---- ----
DATA SIZE = ---- 3
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 + -