📄 hello.lst
字号:
196 说明:键盘发送一个字节
197 参数:unsigned char
198 返回:无
199 功能:键盘发送数据
200 ------------------------------------------------*/
201 void SendByte(unsigned char scanCode){
202 1
203 1 int i;
204 1 int ood;
205 1 CLK =1;
206 1
207 1 wait: while(!CLK);
208 1
209 1 //等待时钟为高
210 1 Delay50us();
211 1 if(!CLK)
212 1 goto wait;
213 1
214 1 if(!DATA) //数据线不为高就退出
215 1 return;
216 1
217 1 Delay20us(); //延时20us
218 1
219 1
220 1 DATA =0;
221 1 Delay20us();//延时20us
222 1 if(!CLK)
223 1 return ; //主机阻止发送
224 1 CLK =0; //输出起始位
225 1 Delay40us();//延时40us
226 1 CLK =1;
227 1 Delay20us();//延时20us
228 1
229 1
230 1 for(i = 0; i < 8; i++){ //循环输出八位数据
231 2 while(CLK){
232 3 if(scanCode&0x01)
233 3 { DATA =1; ood++;}
234 3 else
235 3 DATA =0;
236 3
237 3 scanCode >>=1;
238 3 Delay20us();//延时20us
239 3 if(!CLK)
240 3 return ; //主机阻止发送
241 3 CLK =0;
C51 COMPILER V8.05a HELLO 12/18/2006 18:13:10 PAGE 5
242 3 Delay40us();//延时40us
243 3
244 3
245 3 }
246 2 CLK =1; //输出脉冲
247 2 Delay20us();//延时20us
248 2
249 2 } //八位输出完毕
250 1
251 1
252 1 if(ood%2) //奇校验位如果有偶数个1则输出为1
253 1 DATA = 1;
254 1 else
255 1 DATA =0; //输出脉冲
256 1 Delay20us();//延时40us
257 1 if(!CLK)
258 1 return ; //主机阻止发送
259 1 CLK =0;
260 1 Delay40us();//延时40us
261 1 CLK = 1;
262 1 Delay20us();//延时20us
263 1
264 1 DATA =1; //输出结束位
265 1 Delay20us();//延时20us
266 1 CLK = 0;
267 1 Delay40us();//延时40us
268 1 CLK =1;
269 1 Delay20us();//延时20us
270 1
271 1
272 1 Delay15us(); //延时30us
273 1 Delay15us();
274 1
275 1 return;
276 1
277 1
278 1 }
279 /*-----------------------------------------------
280 unsigned char ReceieveByte()
281 说明:键盘接收一个字节
282 参数:无
283 返回:unsigned char
284 功能:键盘接收数据
285 ------------------------------------------------*/
286 unsigned char RecieveByte(){
287 1
288 1 unsigned char recieveData =0x00;
289 1 unsigned char i;
290 1 unsigned char ood;
291 1 unsigned char oodRight;
292 1
293 1 while(!CLK); //等待时钟为高
294 1
295 1 if(DATA) //等待数据为低
296 1 {return 0xfe;}
297 1
298 1 /*DelayNus(30); //延时20us
299 1 CLK = 0; // 将时钟线拉低
300 1 DelayNus(59); //延时40us
301 1 CLK =1; //释放时钟线
302 1 DelayNus(30); //延时20us
303 1
C51 COMPILER V8.05a HELLO 12/18/2006 18:13:10 PAGE 6
304 1 //接收起始位 */
305 1 for(i = 0;i <8;i++){
306 2 Delay20us(); //延时20us
307 2 CLK = 0; // 将时钟线拉低
308 2 Delay40us(); //延时40us
309 2 CLK =1; //释放时钟线
310 2 Delay20us(); //延时20us
311 2 recieveData>>=1;
312 2 /*读八位数据*/
313 2 if(DATA){
314 3 recieveData = recieveData | 0x80;
315 3 ood++;
316 3 }
317 2 else
318 2 recieveData = recieveData &0x7F;
319 2 if(!CLK)
320 2 return 0xfe;
321 2 }
322 1
323 1
324 1 Delay20us(); //延时20us
325 1 CLK = 0; // 将时钟线拉低
326 1 Delay40us(); //延时40us
327 1 CLK =1; //释放时钟线
328 1 Delay20us(); //延时20us
329 1
330 1 if(ood == DATA)
331 1 oodRight =1;
332 1 else
333 1 oodRight =0; //接收校验位
334 1 if(!CLK)
335 1 return 0xfe;
336 1
337 1 Delay20us(); //延时20us
338 1 CLK = 0; // 将时钟线拉低
339 1 Delay40us(); //延时40us
340 1 CLK =1; //释放时钟线
341 1 Delay20us(); //延时20us
342 1
343 1 //接收结束位
344 1 if(!DATA)
345 1 return 0xfe;
346 1
347 1 // if(!DATA) //如果数据线还为0高,等待主机拉高
348 1 // return 0; //发生了错误
349 1
350 1 //发送应答位
351 1 Delay15us(); //延时15us
352 1 DATA =0; //把数据线拉低
353 1 Delay5us(); //延时5us
354 1 CLK =0;
355 1 Delay40us(); // 延时40us
356 1 CLK =1;
357 1 Delay5us(); //延时5us
358 1 DATA =1;
359 1
360 1
361 1 /*检验校验位是否正确,不正确就产生一个错误*/
362 1 if(!oodRight)
363 1 error = 1;
364 1
365 1 Delay40us(); //延时45us
C51 COMPILER V8.05a HELLO 12/18/2006 18:13:10 PAGE 7
366 1 Delay5us();
367 1 return recieveData;
368 1 }
369 /*-----------------------------------------------
370 unsigned char C_Command()
371 说明:判断主机是否要发送命令
372 参数:无
373 返回:unsigned char
374 功能:判断主机是否要发送命令
375 --------------------------------------------------*/
376 unsigned char C_Command(){
377 1 DATA =1;
378 1 CLK =1;
379 1 if(!DATA)
380 1 return 1;
381 1 else
382 1 return 0;
383 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 517 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 8 9
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 + -