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