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

📄 main.lst

📁 USB键盘驱动代码,做键盘的可以参考下.
💻 LST
字号:
C51 COMPILER V7.50   MAIN                                                                  09/29/2007 10:43:26 PAGE 1   


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

line level    source

   1          
   2          #include "usb_task.h"
   3          #include "usb_kbd_enum.h"
   4          #include "ext_5131.h"
   5          #include "reg_5131.h"
   6          //////////////////////////////
   7          code struct usb_st_device_descriptor usb_device_descriptor =
   8          {
   9            sizeof(usb_device_descriptor), 0x01, 0x1001, 0,
  10            0, 0, 32, 0xeb03, 0x0320,
  11            0x0001, 0x01, 0x02, 0x03, 1
  12          };
  13          /*STRING描述符*/
  14          code struct usb_st_manufacturer usb_manufacturer =
  15          { sizeof(usb_manufacturer),  0x03, {'X'<<8, 'I'<<8, 'N'<<8, 'Z'<<8, 'X'<<8} };
  16          
  17          code struct usb_st_product usb_product =
  18          { sizeof(usb_product),       0x03, {'A'<<8, 'T'<<8, '8'<<8, '9'<<8, 'C'<<8, '5'<<8, '1'<<8, \
  19                                         '3'<<8, '1'<<8, ' '<<8, \
  20                                         'H'<<8, 'I'<<8, 'D'<<8, ' '<<8, \
  21                                         'K'<<8, 'e'<<8, 'y'<<8, 'b'<<8, 'o'<<8, 'a'<<8, 'r'<<8,'d'<<8} };
  22          
  23          code struct usb_st_serial_number usb_serial_number =
  24          { sizeof(usb_serial_number), 0x03, {'1'<<8, '.'<<8, '2'<<8, '.'<<8, '3'<<8} };
  25          
  26          code struct usb_st_language_descriptor usb_language =
  27          { sizeof(usb_language),      STRING, 0x0904 };
  28          /*配置描述符集合*/
  29          code struct  
  30          { struct usb_st_configuration_descriptor  cfg;
  31            struct usb_st_interface_descriptor      ifc;
  32            struct usb_st_hid_descriptor            hid ;
  33            struct usb_st_endpoint_descriptor       ep1 ;
  34            unsigned char                           rep[0x3b] ;
  35          }
  36          usb_configuration =
  37            {
  38              { 9, 0x02, 0x2200, 1, 1,0, 0x80, 50},
  39              { 9, 0x04, 1, 0, 1, 0x03, 0, 0, 0 },
  40              { 9, 0x21, 0x1101, 8, 1, 0x22, 0x3B00 },
  41              { 7, 0x05, 0x81, 0x03, 32, 0x20 },
  42              { 0x05,0x01,          /* Usage Page (Generic Desktop)      */        
  43                0x09,0x06,          /* Usage (Keyboard)                  */
  44                0xA1,0x01,          /* Collection (Application)          */
  45                0x05,0x07,          /* Usage Page (Keyboard)             */
  46                0x19,224,           /* Usage Minimum (224)               */
  47                0x29,231,           /* Usage Maximum (231)               */
  48                0x15,0x00,          /* Logical Minimum (0)               */
  49                0x25,0x01,          /* Logical Maximum (1)               */
  50                0x75,0x01,          /* Report Size (1)                   */
  51                0x95,0x08,          /* Report Count (8)                  */
  52                0x81,0x02,          /* Input (Data, Variable, Absolute)  */
  53                0x81,0x01,          /* Input (Constant)                  */
  54                0x19,0x00,          /* Usage Minimum (0)                 */
  55                0x29,101,           /* Usage Maximum (101)               */
C51 COMPILER V7.50   MAIN                                                                  09/29/2007 10:43:26 PAGE 2   

  56                0x15,0x00,          /* Logical Minimum (0)               */
  57                0x25,101,           /* Logical Maximum (101)             */
  58                0x75,0x08,          /* Report Size (8)                   */
  59                0x95,0x06,          /* Report Count (6)                  */
  60                0x81,0x00,          /* Input (Data, Array)               */
  61                0x05,0x08,          /* Usage Page (LED)                  */
  62                0x19,0x01,          /* Usage Minimum (1)                 */
  63                0x29,0x05,          /* Usage Maximum (5)                 */
  64                0x15,0x00,          /* Logical Minimum (0)               */
  65                0x25,0x01,          /* Logical Maximum (1)               */
  66                0x75,0x01,          /* Report Size (1)                   */
  67                0x95,0x05,          /* Report Count (5)                  */
  68                0x91,0x02,          /* Output (Data, Variable, Absolute) */
  69                0x95,0x03,          /* Report Count (3)                  */
  70                0x91,0x01,          /* Output (Constant)                 */
  71                0xC0                /* End Collection                    */  
  72                }
  73            };
  74          unsigned char key[4][4]={HID_W,HID_E,HID_L,HID_C,
  75                           HID_O,HID_M,HID_E,HID_U,
  76                           HID_S,HID_B,HID_R,HID_D,
  77                           HID_C,HID_A,HID_B,HID_SPACEBAR};
  78          unsigned char usb_kbd_state;
  79          unsigned char  transmit_no_key;
  80          typedef union 
  81          {
  82           unsigned int w;
  83            unsigned char  b[2];
  84          } Union16;
  85          
  86          Union16 scan_key;
  87          unsigned char   usb_key;
  88          unsigned char  key_hit;
  89          unsigned char  shift_key;
  90          static  unsigned char   endpoint_status[2];
  91          static  unsigned char   hid_idle_duration;
  92          static  unsigned char   *pbuffer;
  93          static  unsigned char   bmRequestType;
  94          unsigned char   usb_configuration_nb;
  95          extern  bit     usb_connected;
  96          bit   usb_connected_stored;
  97          bit   usb_configured_stored;
  98          /////////////////////////////
  99          void main (void)
 100          {
 101   1        EA = 1;                 //使能中断
 102   1        init_timer0();         //定时器初始化
 103   1        delay(10);
 104   1        usb_task_init();       //usb控制器初始化
 105   1        while(1)               //任务循环
 106   1        {
 107   2        usb_task();           //usb任务处理子程序  
 108   2        usb_kbd_task();        //键盘任务处理
 109   2        delay(256);            //延时
 110   2        }
 111   1      }
 112          
 113          void init_timer0()
 114          {
 115   1        TMOD=0x05;
 116   1        TH0=0;
 117   1        TL0=0;
C51 COMPILER V7.50   MAIN                                                                  09/29/2007 10:43:26 PAGE 3   

 118   1      }
 119          void delay(int n)
 120          {
 121   1        TH0=n;
 122   1        TL0=0;
 123   1        TR0=1;
 124   1        if(TH0>1);
 125   1        return;
 126   1      }
 127          
 128          void usb_task_init(void)
 129          { 
 130   1        USBCON |= 0x80; //使能USB控制器
 131   1        USBCON |= 0x10; /*USB软件插拔*/
 132   1        delay(100);
 133   1        USBCON &= ~0x10;
 134   1        PLLDIV = 32; //配置控制器时钟
 135   1        PLLCON |= 0x02;//使能PLL
 136   1        //usb_configure_endpoint(EP_CONTROL, CONTROL);//配置控制端口
 137   1        UEPNUM = 0;//复位控制端口
 138   1        UEPCONX = 0;
 139   1        /*初始化状态变量*/
 140   1        usb_connected = 0;
 141   1        usb_connected_stored = 1;
 142   1        usb_configured_stored = 0;
 143   1        transmit_no_key = 0;
 144   1        key_hit = 0;
 145   1        usb_kbd_state = 0;
 146   1        shift_key = 0;
 147   1        endpoint_status[0] = 0x00;
 148   1        endpoint_status[1] = 0x00;
 149   1        usb_connected = 0;
 150   1        usb_configuration_nb = 0x00;
 151   1      }
 152          /////////////////////////////////
 153          void usb_task(void)
 154          {
 155   1      
 156   1        if (USBINT & 0x01)    //如果处于挂起状态
 157   1        {
 158   2          if (usb_connected == 1)
 159   2          { 
 160   3            usb_connected = 0;
 161   3           }
 162   2      
 163   2          if (USBINT & 0x20)//当接受到唤醒指令时
 164   2          {
 165   3            usb_connected = 1;//设置连接标志
 166   3            USBINT =USBINT & ~0x01;//清除挂起标志
 167   3            USBINT =USBINT & ~0x20;//清除唤醒标志
 168   3            USBINT =USBINT & ~0x08;
 169   3            }
 170   2        }
 171   1        else         
 172   1        {
 173   2          usb_connected = 1;
 174   2          if (USBINT & 0x10) //复位中断;

⌨️ 快捷键说明

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