📄 usbkeyboard.lst
字号:
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 + -