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

📄 usbkeyboard.lst

📁 基于51和D12实现电脑的红外遥控
💻 LST
📖 第 1 页 / 共 5 页
字号:
 238          {
 239   1       USB_A0=USB_COMMAND_ADD;
 240   1       USB_DATA=usb_command;
C51 COMPILER V7.06   USBKEYBOARD                                                           03/23/2007 23:58:29 PAGE 5   

 241   1       USB_WR=0;
 242   1       USB_WR=1;
 243   1       USB_DATA=0xFF;
 244   1      }
 245          /******************************************************************************/
 246          
 247          /*********************写一字节USB数据*******************************************/
 248          void write_a_usb_data(uint8 usb_data)       
 249          {
 250   1       USB_A0=USB_DATA_ADD;
 251   1       USB_DATA=usb_data;
 252   1       USB_WR=0;
 253   1       USB_WR=1;
 254   1       USB_DATA=0XFF;
 255   1      }
 256          /******************************************************************************/
 257          
 258          /****************************读一字节USB数据************************************/
 259          uint8 read_a_usb_data(void)
 260          {
 261   1       uint8 temp;
 262   1       USB_A0=USB_DATA_ADD;
 263   1       USB_RD=0;
 264   1       temp=USB_DATA;
 265   1       USB_RD=1;
 266   1       return temp;
 267   1      }
 268          /******************************************************************************/
 269          
 270          /************************读USB中断寄存器**************************************/
 271          void read_interrupt_register(void)
 272          {
 273   1       write_usb_command(Read_Interrupt_Register);
 274   1       Interrupt_Register.Register[0]=read_a_usb_data();
 275   1       Interrupt_Register.Register[1]=read_a_usb_data();
 276   1      }
 277          /******************************************************************************/
 278          
 279          /************************设置USB地址*******************************************/
 280          void set_usb_addr(uint8 addr)
 281          {
 282   1      
 283   1       write_usb_command(Set_Address);
 284   1       write_a_usb_data(0x80|addr);
 285   1       Prints("   设置地址.....................",1);
 286   1       Prints("       地址为:  ",0);
 287   1       PrintLongInt(addr);
 288   1       Prints("",1);
 289   1      }
 290          /******************************************************************************/
 291          
 292          /*************************端点使能******************************************/
 293          void set_endpoint_enable(void)
 294          {
 295   1       write_usb_command(Set_Endpoint_Enable);
 296   1       write_a_usb_data(0x01);
 297   1      }
 298          /******************************************************************************/
 299          
 300          /****************************选择终端点*************************************/
 301          uint8 select_endpoint(uint8 endp)
 302          {
C51 COMPILER V7.06   USBKEYBOARD                                                           03/23/2007 23:58:29 PAGE 6   

 303   1       write_usb_command(Select_EndPoint+endp);
 304   1       return read_a_usb_data();
 305   1      }
 306          /******************************************************************************/
 307          
 308          /****************************读端点最后状态**********************************/
 309          uint8  read_last_status(uint8 endp)
 310          {
 311   1       write_usb_command(Read_Last_Status+endp);
 312   1       return read_a_usb_data();
 313   1      }
 314          /******************************************************************************/
 315          
 316          /****************************设置端点状态**************************************/
 317          void set_endpoint_status(uint8 endp,uint8 status)  
 318          {
 319   1       write_usb_command(0x40+endp);
 320   1       write_a_usb_data(!status);
 321   1      }
 322          /******************************************************************************/
 323          
 324          /*****************************读端点状态**************************************/
 325          uint8 read_endpoint_status(uint8 endp)
 326          {
 327   1       write_usb_command(0x80+endp);
 328   1       return read_a_usb_data();
 329   1      }
 330          /******************************************************************************/
 331          
 332          /************************清缓冲,在读取缓冲数据后调用**************************/
 333          void clear_buffer(void)
 334          {
 335   1       write_usb_command(Clear_Buffer);
 336   1      }
 337          /******************************************************************************/
 338          
 339          /***********************缓冲区数据有效,在写缓冲后调用**************************/
 340          void validate_buffer(void)
 341          {
 342   1       write_usb_command(Validate_Buffer);
 343   1      }
 344          /******************************************************************************/
 345          
 346          /***************************应答建立包************************************/
 347          void ack_setup(uint8 endp)
 348          {
 349   1       select_endpoint(endp);
 350   1       write_usb_command(Ack_Setup);
 351   1      }
 352          /******************************************************************************/
 353          
 354          /***********************出错处理******************************************/
 355          void error(uint8 number)
 356          {
 357   1       Prints("有错误发生!!!",1);
 358   1       number=0;
 359   1      }
 360          /******************************************************************************/
 361          
 362          /*************************读终端点缓冲****************************************/
 363          uint8 read_endpoint_buff(uint8 endp,uint8 len,uint8 * buff)
 364          {
C51 COMPILER V7.06   USBKEYBOARD                                                           03/23/2007 23:58:29 PAGE 7   

 365   1       uint8 i,j;
 366   1       read_last_status(endp);
 367   1       if(!(select_endpoint(endp))&0x01){error(0); return 0;}
 368   1       read_endpoint_status(endp);
 369   1       write_usb_command(Read_Buffer);
 370   1       read_a_usb_data();
 371   1       j=read_a_usb_data();
 372   1       if(j>len)
 373   1        j=len;
 374   1       for(i=0;i<j;i++)
 375   1        {
 376   2         USB_RD=0;
 377   2         *(buff+i)=USB_DATA;
 378   2         USB_RD=1;
 379   2        }
 380   1       clear_buffer();
 381   1       return j;
 382   1      }
 383          /******************************************************************************/
 384          
 385          /*************************写终端点缓冲*****************************************/
 386          uint8 write_endpoint_buff(uint8 endp,uint8 len,uint8 * buff)
 387          {
 388   1       uint8 i;
 389   1       read_last_status(endp);
 390   1       select_endpoint(endp);
 391   1       write_usb_command(Write_Buffer);
 392   1       write_a_usb_data(0);
 393   1       write_a_usb_data(len);
 394   1       for(i=0;i<len;i++)
 395   1        {
 396   2         USB_DATA=*(buff+i);
 397   2         USB_WR=0;
 398   2         USB_WR=1;
 399   2        }
 400   1       USB_DATA=0XFF;
 401   1       validate_buffer();
 402   1       return len;
 403   1      }
 404          /******************************************************************************/
 405          
 406          /***************************断开USB连接****************************************/
 407          void disconnect_usb(void)
 408          {
 409   1       Prints("断开USB连接........................",1);
 410   1       write_usb_command(0xf3);
 411   1       write_a_usb_data(0x0e);
 412   1       write_a_usb_data(0x47);
 413   1       delay(100);
 414   1      }
 415          /******************************************************************************/
 416          
 417          /*******************************连接USB**************************************/
 418          void connect_usb(void)
 419          {
 420   1       Prints("连接USB...............",1);
 421   1       write_usb_command(0xf3);                         //初始化USBD12
 422   1       write_a_usb_data(0x1e);                          //连接USB
 423   1       write_a_usb_data(0x47);                          //设置频率
 424   1      }
 425          /******************************************************************************/
 426          
C51 COMPILER V7.06   USBKEYBOARD                                                           03/23/2007 23:58:29 PAGE 8   

 427          /***************************初始化USB***************************************************/
 428          void init_usb(void)               
 429          {
 430   1       Prints("USBD12芯片初始化",1);
 431   1       set_usb_addr(0);
 432   1       set_endpoint_enable();
 433   1      }
 434          /******************************************************************************/
 435          
 436          /****************************USB总线复位处理***********************************/
 437          void usb_bus_reset(void)
 438          {
 439   1       Prints("USB总线复位................................",1);
 440   1       usb_flags.Register=0;
 441   1       set_endpoint_enable();
 442   1      }
 443          /******************************************************************************/
 444          
 445          /*****************************USB总线挂起处理**********************************/
 446          void usb_bus_suspend(void)
 447          {
 448   1       Prints("USB总线挂起................................",1);
 449   1      }
 450          /******************************************************************************/
 451          
 452          /***************************设置地址***************************************/
 453          void set_usb_address(void)
 454          {
 455   1       usb_flags.flags.set_addr=1;
 456   1       while(select_endpoint(1)&0x01);
 457   1       write_endpoint_buff(1,0,0);
 458   1       set_usb_addr(Control_Data.DeviceRequest.wValue);
 459   1       usb_flags.flags.usb_endp0_in=0;
 460   1       usb_flags.flags.setup_packet_out=0;
 461   1      }
 462          /******************************************************************************/
 463          
 464          /**************************获取状态响应*****************************************/
 465          void get_status(uint8 receiver)
 466          {
 467   1       uint8 status[2];
 468   1       switch (receiver)
 469   1        {
 470   2         case 0:                        //获取设备状态
 471   2          status[0]=0x00;
 472   2          status[1]=0x00;
 473   2          break;
 474   2         case 1:                        //获取接口状态
 475   2          status[0]=0x00;
 476   2          status[0]=0x00;
 477   2          break;
 478   2         case 2:                        //获取端点状态
 479   2          status[0]=0x00;
 480   2          status[1]=0x00;
 481   2          break;
 482   2         }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -