📄 usbkeyboard.lst
字号:
258 1 USB_RD=0;
259 1 temp=USB_DATA;
260 1 USB_RD=1;
261 1 return temp;
262 1 }
263 /******************************************************************************/
264
265 /************************读USB中断寄存器**************************************/
266 void read_interrupt_register(void)
267 {
268 1 write_usb_command(Read_Interrupt_Register);
269 1 Interrupt_Register.Register[0]=read_a_usb_data();
270 1 Interrupt_Register.Register[1]=read_a_usb_data();
271 1 }
272 /******************************************************************************/
273
274 /************************设置USB地址*******************************************/
275 void set_usb_addr(uint8 addr)
276 {
277 1
278 1 write_usb_command(Set_Address);//Set_Address数值为0xd0
279 1 write_a_usb_data(0x80|addr);//设置地址为0,并且使能地址
280 1 Prints(" 设置地址.....................",1);
281 1 Prints(" 地址为: ",0);
282 1 PrintLongInt(addr);
283 1 Prints("",1);
284 1 }
285 /******************************************************************************/
286
287 /*************************端点使能******************************************/
288 void set_endpoint_enable(void)
289 {
290 1 write_usb_command(Set_Endpoint_Enable);//此命了必须在设置地址使能命令后才能使用
291 1 write_a_usb_data(0x01);//将端点使能
292 1 }
293 /******************************************************************************/
294
295 /****************************选择终端点*************************************/
296 uint8 select_endpoint(uint8 endp)
297 {
298 1 write_usb_command(Select_EndPoint+endp);
299 1 return read_a_usb_data();
300 1 }
301 /******************************************************************************/
302
C51 COMPILER V7.06 USBKEYBOARD 09/03/2008 12:14:08 PAGE 6
303 /****************************读端点最后状态寄存器**********************************/
304 uint8 read_last_status(uint8 endp)
305 {
306 1 write_usb_command(Read_Last_Status+endp);
307 1 return read_a_usb_data();
308 1 }
309 /******************************************************************************/
310
311 /****************************设置端点状态**************************************/
312 void set_endpoint_status(uint8 endp,uint8 status)
313 {
314 1 write_usb_command(0x40+endp);
315 1 write_a_usb_data(!status);
316 1 }
317 /******************************************************************************/
318
319 /*****************************读端点状态**************************************/
320 uint8 read_endpoint_status(uint8 endp)
321 {
322 1 write_usb_command(0x80+endp);
323 1 return read_a_usb_data();
324 1 }
325 /******************************************************************************/
326
327 /************************清缓冲,在读取缓冲数据后调用**************************/
328 void clear_buffer(void)
329 {
330 1 write_usb_command(Clear_Buffer);
331 1 }
332 /******************************************************************************/
333
334 /***********************缓冲区数据有效,在写缓冲后调用**************************/
335 void validate_buffer(void)
336 {
337 1 write_usb_command(Validate_Buffer);
338 1 }
339 /******************************************************************************/
340
341 /***************************应答建立包************************************/
342 void ack_setup(uint8 endp)
343 {
344 1 select_endpoint(endp);
345 1 write_usb_command(Ack_Setup);
346 1 }
347 /******************************************************************************/
348
349 /***********************出错处理******************************************/
350 void error(uint8 number)
351 {
352 1 Prints("有错误发生!!!",1);
353 1 number=0;
354 1 }
355 /******************************************************************************/
356
357 /*************************读终端点缓冲****************************************/
358 uint8 read_endpoint_buff(uint8 endp,uint8 len,uint8 * buff)
359 {
360 1 uint8 i,j;
361 1 read_last_status(endp); //具体作用就是清PD12的中断寄存器
362 1 if(!(select_endpoint(endp))&0x01){error(0); return 0;}//初始化端点缓冲区数据指针到缓冲区的开始
363 1 read_endpoint_status(endp);
364 1 write_usb_command(Read_Buffer);
C51 COMPILER V7.06 USBKEYBOARD 09/03/2008 12:14:08 PAGE 7
365 1 read_a_usb_data(); //第一个字节为任意数
366 1 j=read_a_usb_data(); //第二个字节是数据长度位
367 1 if(j>len)
368 1 j=len;
369 1 for(i=0;i<j;i++)
370 1 {
371 2 USB_RD=0;
372 2 *(buff+i)=USB_DATA;
373 2 USB_RD=1;
374 2 //Prints("读取的数据为 ",0);
375 2 //PrintLongInt(*(buff+i));
376 2 }
377 1 clear_buffer();
378 1 return j; //不仅把数据读到了MCU的缓冲区中,还返回了数据长度值
379 1 }
380 /******************************************************************************/
381
382 /*************************写终端点缓冲*****************************************/
383 uint8 write_endpoint_buff(uint8 endp,uint8 len,uint8 * buff)
384 {
385 1 uint8 i;
386 1 read_last_status(endp); //清PD12的中断寄存器
387 1 select_endpoint(endp); //初始化端点缓冲区数据指针到缓冲区的开始
388 1 write_usb_command(Write_Buffer);
389 1 write_a_usb_data(0); //在读从主机发送到PD12的数据的时候第一个字节是任意的
390 1 write_a_usb_data(len); //第二个字节是数据长度位,发送的时候也要按照这个规则发送数据
391 1 for(i=0;i<len;i++)
392 1 {
393 2 USB_DATA=*(buff+i);
394 2 USB_WR=0;
395 2 USB_WR=1;
396 2 //Prints("数据",1);
397 2 //PrintLongInt(*(buff+i));
398 2 }
399 1 USB_DATA=0XFF;
400 1 validate_buffer();
401 1 return len;
402 1 }
403 /******************************************************************************/
404
405 /***************************断开USB连接****************************************/
406 void disconnect_usb(void)
407 {
408 1 Prints("断开USB连接........................",1);
409 1 write_usb_command(0xf3);//设置命令,设置上拉电阻和分频系数
410 1 write_a_usb_data(0x0e);
411 1 write_a_usb_data(0x47);
412 1 delay(100);
413 1 }
414 /******************************************************************************/
415
416 /*******************************连接USB**************************************/
417 void connect_usb(void)
418 {
419 1 Prints("连接USB...............",1);
420 1 write_usb_command(0xf3); //初始化USBD12
421 1 write_a_usb_data(0x1e); //连接USB
422 1 write_a_usb_data(0x47); //设置频率
423 1 }
424 /******************************************************************************/
425
426 /***************************初始化USB***************************************************/
C51 COMPILER V7.06 USBKEYBOARD 09/03/2008 12:14:08 PAGE 8
427 void init_usb(void)
428 {
429 1 Prints("USBD12芯片初始化",1);
430 1 set_usb_addr(0);
431 1 set_endpoint_enable();
432 1 }
433 /******************************************************************************/
434
435 /****************************USB总线复位处理***********************************/
436 void usb_bus_reset(void)
437 {
438 1 Prints("USB总线复位................................",1);
439 1 usb_flags.Register=0;
440 1 set_endpoint_enable();
441 1 }
442 /******************************************************************************/
443
444 /*****************************USB总线挂起处理**********************************/
445 void usb_bus_suspend(void)
446 {
447 1 Prints("USB总线挂起................................",1);
448 1 }
449 /******************************************************************************/
450
451 /***************************设置地址***************************************/
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472 /*void set_usb_address(void)
473 {
474 usb_flags.flags.set_addr=1;
475 while(select_endpoint(1)&0x01);
476 write_endpoint_buff(1,0,0);
477 set_usb_addr(Control_Data.DeviceRequest.wValue);
478 usb_flags.flags.usb_endp0_in=0;
479 usb_flags.flags.setup_packet_out=0;
480 }*/
481
482 void set_usb_address(void)
483 {
484 1 /*usb_flags.flags.set_addr=1;
485 1 while(select_endpoint(1)&0x01);
486 1 write_endpoint_buff(1,0,0);
487 1 set_usb_addr(Control_Data.DeviceRequest.wValue);
488 1 usb_flags.flags.usb_endp0_in=0;
C51 COMPILER V7.06 USBKEYBOARD 09/03/2008 12:14:08 PAGE 9
489 1 usb_flags.flags.setup_packet_out=0;*/
490 1 usb_flags.flags.set_addr=1;
491 1 set_usb_addr(Control_Data.DeviceRequest.wValue);
492 1 while(select_endpoint(1)&0x01);
493 1 write_endpoint_buff(1,0,0);
494 1 while(select_endpoint(1)&0x01);
495 1 //set_usb_addr(Control_Data.DeviceRequest.wValue);
496 1 usb_flags.flags.usb_endp0_in=0;
497 1 usb_flags.flags.setup_packet_out=0;
498 1
499 1 }
500 /******************************************************************************/
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -