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

📄 usbkeyboard.lst

📁 51+pdiusbd12做的usb键盘
💻 LST
📖 第 1 页 / 共 3 页
字号:
C51 COMPILER V7.06   USBKEYBOARD                                                           09/03/2008 12:14:08 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE USBKEYBOARD
OBJECT MODULE PLACED IN UsbKeyBoard.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE UsbKeyBoard.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          
   2          #include <AT89x52.H>
   3          #include "USB.H"
   4          #include "PDIUSBD12.H"
   5          #include "My_type.h"
   6          #include "UART.H"
   7          #include "key.h"
   8          #include "keyboard.h"
   9          #include <stdio.h>
  10          
  11          #include <stdio.h>
  12          
  13          #define USB_COMMAND_ADD           1
  14          #define USB_DATA_ADD              0
  15          
  16          //USB芯片连接引脚
  17          #define USB_DATA                  P1
  18          #define USB_A0                    P0_0
  19          #define USB_WR                    WR
  20          #define USB_RD                    RD
  21          #define USB_INT                   INT0
  22          
  23          
  24          #define ENDPOINT_NUMBER           2
  25          #define MAX_CONTROL_DATA_SIZE     16       //重复定义啦  可以不要
  26          
  27          
  28          //控制传输时保存数据
  29          CONTROL_DATA_BUFF Control_Data;
  30          
  31          //缓冲
  32          uint8 idata buffer[64];
  33          
  34          //交换数据时用的指针
  35          uint8 *pData;
  36          
  37          uint8 idle;     //空闲状态
  38          uint8 protocol; //当前协议
  39          
  40          //高低字节交换
  41          
  42          #define SWAP16(x)  ((((uint16)(x))<<8)|(((uint16)(x))>>8))
  43          
  44          //取一个整数的低字节 
  45          #define LSB(x) ((uint8)(x))
  46          
  47          //取一个整数的高字节
  48          #define MSB(x) ((uint8)(((uint16)(x))>>8))                               
  49          
  50          //字符串描述符所用的语言种类 
  51          code uint8 LANGUAGE_ID[4]={0x04,0x03,0x09,0x04};                   
  52          
  53          //设备序列号                                                                            
  54          code uint8 device_serial_number[]=
  55          {22,STRING_DESCRIPTOR,'2',0,'0',0,'0',0,'8',0,'-',0,'0',0,'5',0,'-',0,'2',0,'7',0};
C51 COMPILER V7.06   USBKEYBOARD                                                           09/03/2008 12:14:08 PAGE 2   

  56          
  57          //厂商字符串
  58          code uint8 ManufacturerString[80]=
  59          {80,STRING_DESCRIPTOR,0x61,0x53,0x11,0x81,0x08,0x57,0x08,0x57,0x84,0x76,0xB6,0x5B,
  60           0x53,0x5F,'-',0x00,'-',0x00,'-',0x00,'-',0x00,'@',0,0x20,0x00,'S',0,'H',0,'U',0,
  61           'S',0,'H',0,'I',0,'-',0,'-',0,'-',0,'-',0,'S',0,'H',0,'U',0,'S',0,'H',0,'I',0,
  62           '0',0,'5',0,'-',0,'2',0,'7',0,'-',0,'2',0,'0',0,'0',0,'8',0};
  63          
  64          //产品字符串
  65          code uint8 ProducterString[80]=
  66          {80,STRING_DESCRIPTOR,0x61,0x53,0xC9,0x62,0x47,0x59,0x84,0x76,0xD1,0x8D,0xD1,0x8D, 
  67          0x2E,0x95,0xD8,0x76,'@',0,0x20,0x00,'S',0,'H',0,'U',0,'S',0,'H',0,'I',0,'S',0,'H',0,
  68          'U',0,'S',0,'H',0,'I',0,0x56,0x6E,0x57,0x53,0x06,0x74,0xE5,0x5D,0x66,0x5B, 0x62,0x96,
  69          0x00,0x5F,  /*开*/
  70          0x66,0x8F,  /*车*/
  71          0x9E,0x64,  /*撞*/
  72          0x7B,0x6B,  /*死*/
  73          0x54,0x8D,  /*赔*/
  74          0xB1,0x94,  /*钱*/
  75          0x01,0xFF,  /*!*/
  76          };
  77          
  78          
  79          code DEVICE_DESCRIPTOR_STRUCT device_descriptor=     //设备描述符
  80          {
  81           sizeof(DEVICE_DESCRIPTOR_STRUCT),                   //设备描述符的字节数大小
  82           DEVICE_DESCRIPTOR,                                      //设备描述符类型编号
  83           0x1001,                                             //USB版本号
  84           0x00,                                               //USB分配的设备类代码
  85           0x00,                                               //USB分配的子类代码
  86           0x00,                                               //USB分配的设备协议代码
  87           0x10,                                               //端点0的最大包大小
  88           0x3412,                                             //厂商编号VID,这里只是作为测试用,请使用自己的VID
  89           0x7856,                                             //产品编号PID,这里只是作为测试用,请使用自己的PID
  90           0x0100,                                             //设备出厂编号
  91           0x01,                                               //设备厂商字符串的索引
  92           0x02,                                               //描述产品字符串的索引
  93           0x03,                                               //描述设备序列号字符串的索引
  94           0x01                                                //可能的配置数量
  95          };
  96          
  97          //定义配置,接口,端点等描述符结构体,因为它们是随配置描述符一起返回的
  98          typedef struct _CON_INT_ENDP_DESCRIPTOR_STRUCT
  99          {
 100           CONFIGURATION_DESCRIPTOR_STRUCT configuration_descriptor;   // 09
 101           INTERFACE_DESCRIPTOR_STRUCT  interface_descriptor;          //09
 102           HID_DESCRIPTOR_STRUCT hid_descriptor;     
 103           ENDPOINT_DESCRIPTOR_STRUCT  endpoint_descriptor[ENDPOINT_NUMBER];//两个07
 104          }CON_INT_ENDP_DESCRIPTOR_STRUCT;
 105          
 106          code CON_INT_ENDP_DESCRIPTOR_STRUCT con_int_endp_descriptor=
 107          {
 108          //configuration_descriptor                                          //配置描述符
 109          {
 110           sizeof(CONFIGURATION_DESCRIPTOR_STRUCT),                           //配置描述符的字节数大小
 111           CONFIGURATION_DESCRIPTOR,                                          //配置描述符类型编号
 112           SWAP16(sizeof(CON_INT_ENDP_DESCRIPTOR_STRUCT)),
 113           0x01,                                                            //只包含一个接口
 114           0x01,                                                            //该配置的编号
 115           0x00,                                                            //iConfiguration字段
 116           0xA0,                                                            //采用总线供电,支持远程唤醒
 117           0xC8                                                            //从总线获取最大电流400mA
C51 COMPILER V7.06   USBKEYBOARD                                                           09/03/2008 12:14:08 PAGE 3   

 118          },
 119          //interface_descritor                                             //接口描述符
 120          {
 121           sizeof(INTERFACE_DESCRIPTOR_STRUCT),                             //接口描述符的字节数大小
 122           INTERFACE_DESCRIPTOR,                                            //接口描述符类型编号
 123           0x00,                                                            //接口编号为0
 124           0x00,                                                            //该接口描述符的编号
 125           ENDPOINT_NUMBER,                                                 //非0端点数量为2,只使用端点主端点输入和
             -输出
 126           0x03,                                                            //人机接口设备(HID)类
 127           0x01,                                                            //使用的子类:支持BIOS根启动Boot的子类
 128           0x01,                                                            //使用的协议:键盘
 129           0x00                                                             //接口描述符字符串索引
 130          },
 131          //hid_descriptor
 132          {
 133           sizeof(HID_DESCRIPTOR_STRUCT),                                   //HID描述符的字节数大小
 134           HID_DESCRIPTOR,                                                  //HID描述符类型编号
 135           0x1001,                                                          //HID类协议版本号,为1.1
 136           0x21,                                                            //固件的国家地区代号,0x21为美国
 137           NUM_SUB_DESCRIPTORS,                                             //下级描述符的数量
 138           {
 139            {
 140             REPORT_DESCRIPTOR,                                             //下级描述符为报告描述符
 141             SWAP16(sizeof(KeyBoardReportDescriptor))                       //下级描述符的长度
 142            }
 143           },
 144          },
 145          //endpoint_descriptor[]
 146          {
 147           {                                                                //主端点输入描述
 148            sizeof(ENDPOINT_DESCRIPTOR_STRUCT),                             //端点描述符的字节数大小
 149            ENDPOINT_DESCRIPTOR,                                            //端点描述符类型编号
 150            MAIN_POINT_IN,                                                  //端点号,主输入端点
 151            ENDPOINT_TYPE_INTERRUPT,                                        //使用的传输类型:中断传输
 152            0x4000,                                                         //该端点支持的最大包尺寸,64字节
 153            0x0A                                                            //中断扫描时间:设置为10ms
 154           },
 155            
 156           {                                                                //主端点输出描述
 157            sizeof(ENDPOINT_DESCRIPTOR_STRUCT),                             //端点描述符的字节数大小
 158            ENDPOINT_DESCRIPTOR,                                            //端点描述符类型编号
 159            MAIN_POINT_OUT,                                                 //端点号,主输出端点
 160            ENDPOINT_TYPE_INTERRUPT,                                        //使用的传输类型:中断传输
 161            0x4000,                                                         //该端点支持的最大包尺寸,64字节
 162            0x0A                                                            //中断扫描时间:设置为10ms
 163           }
 164          }
 165          };
 166          
 167          union                                          //程序标志位
 168          {
 169          uint16 Register;
 170          struct 
 171          {
 172           uint8 bus_reset        :1;
 173           uint8 suspend          :1;
 174           uint8 remote_wakeup    :1;
 175           uint8 int_isr          :1;
 176           uint8 not_end          :1;
 177           uint8 usb_idle         :1;
 178           uint8 usb_busy         :1;
C51 COMPILER V7.06   USBKEYBOARD                                                           09/03/2008 12:14:08 PAGE 4   

 179           uint8 setup_packet_in  :1;            //如果为1,表示要发送数据到主机
 180           uint8 setup_packet_out :1;             //如果为1,表示主机要发送数据到设备
 181           uint8 set_addr         :1;
 182           uint8 usb_endp0_in     :1;            //这个IN是对端点而言的即控制输出,主机向端点发送数据
 183           uint8 usb_endp2_in     :1;            //
 184           uint8 usb_endp2_out    :1;
 185          }flags;
 186          }usb_flags;
 187          
 188          union                                           //中断寄存器
 189          {
 190           uint8 Register[2];
 191           struct 
 192            {
 193             uint8 control_out_port  :1;
 194             uint8 control_in_port   :1;
 195             uint8 port_out_1        :1;
 196             uint8 port_in_1         :1;
 197             uint8 main_out_port     :1;
 198             uint8 main_in_port      :1;
 199             uint8 bus_reset         :1;
 200             uint8 suspend_change    :1;
 201             uint8 DMA_EOT           :1;
 202             uint8 not_use           :7;
 203            }Interrupt;
 204          }Interrupt_Register;
 205          
 206          
 207          union                                    //端点最后处理状态
 208          {
 209           uint8 Register;
 210           struct
 211           {
 212            uint8 successful          :1;
 213            uint8 error_code          :4;
 214            uint8 setup_packet        :1;
 215            uint8 data_1              :1;
 216            uint8 prestatus_not_read  :1;
 217           }Status;
 218          }Last_Status;
 219          
 220          
 221          /*****************   延时x毫秒函数 ***********/
 222          void delay(uint16 x)                
 223          {
 224   1       uint16 i;
 225   1       uint16 j;
 226   1       for(i=0;i<x;i++)
 227   1       for(j=0;j<230;j++);
 228   1      }
 229          /********************************************/
 230          
 231          /*******************************写USB命令******************************************/
 232          void write_usb_command(uint8 usb_command)
 233          {
 234   1       USB_A0=USB_COMMAND_ADD;
 235   1       USB_DATA=usb_command;
 236   1       USB_WR=0;
 237   1       USB_WR=1;
 238   1       USB_DATA=0xFF;
 239   1      }
 240          /******************************************************************************/
C51 COMPILER V7.06   USBKEYBOARD                                                           09/03/2008 12:14:08 PAGE 5   

 241          
 242          /*********************写一字节USB数据*******************************************/
 243          void write_a_usb_data(uint8 usb_data)       
 244          {
 245   1       USB_A0=USB_DATA_ADD;
 246   1       USB_DATA=usb_data;
 247   1       USB_WR=0;
 248   1       USB_WR=1;
 249   1       USB_DATA=0XFF;
 250   1      }
 251          /******************************************************************************/
 252          
 253          /****************************读一字节USB数据************************************/
 254          uint8 read_a_usb_data(void)
 255          {
 256   1       uint8 temp;
 257   1       USB_A0=USB_DATA_ADD;

⌨️ 快捷键说明

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