⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usbkeyboard.lst

📁 51+pdiusbd12做的usb键盘
💻 LST
📖 第 1 页 / 共 3 页
字号:
 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 + -