使用Proteus仿真HID USB 键盘

  1. 介绍

使用Proteus仿真PIC的P18F2550芯片,利用MikroC Pro for PIC软件编写PIC芯片固件,实现USB HID Keyboard功能。

1.安装Proteus8.9和MicroC Pro for PIC 7.2

MikroC 7.2下载链接如下

https://drive.google.com/file/d/13h_AZg2iz8p9TbDjfSOTVsux-VSJJfBv/view?usp=sharing

使用默认路径安装,提示要安装驱动要留下来,安装后不要马上运行,将HIDDongleDLL.dll文件复制到安装文件夹下替换

2.使用MicroC建立一个P18F2550芯片项目

选择P18F2550芯片,时钟选为48MHz进入项目后编辑

项目选项并进行相应设置

工具选项进入HID Terminal并进行相应设置

会自动生成USBdsc.C文件,然后修改代码

///USBdsc.C

const unsigned int USB_VENDOR_ID = 0x1234;

const unsigned int USB_PRODUCT_ID = 0x1017;

const char USB_SELF_POWER = 0x80;          // Self powered 0xC0,  0x80 bus powered

const char USB_MAX_POWER = 50;             // Bus power required in units of 2 mA

const char HID_INPUT_REPORT_BYTES = 8;

const char HID_OUTPUT_REPORT_BYTES = 8;

const char USB_TRANSFER_TYPE = 0x03;       //0x03 Interrupt

const char EP_IN_INTERVAL = 1;

const char EP_OUT_INTERVAL = 1;

const char USB_INTERRUPT = 1;

const char USB_HID_IN_EP = 1;

const char USB_HID_OUT_EP = 1;

//CANMBIAR A 63

const char USB_HID_RPT_SIZE = 63;

/* Device Descriptor */

const struct {

    char bLength;               // bLength         - Descriptor size in bytes (12h)

    char bDescriptorType;       // bDescriptorType - The constant DEVICE (01h)

    unsigned int bcdUSB;        // bcdUSB          - USB specification release number (BCD)

    char bDeviceClass;          // bDeviceClass    - Class Code

    char bDeviceSubClass;       // bDeviceSubClass - Subclass code

    char bDeviceProtocol;       // bDeviceProtocol - Protocol code

    char bMaxPacketSize0;       // bMaxPacketSize0 - Maximum packet size for endpoint 0

    unsigned int idVendor;      // idVendor        - Vendor ID

    unsigned int idProduct;     // idProduct       - Product ID

    unsigned int bcdDevice;     // bcdDevice       - Device release number (BCD)

    char iManufacturer;         // iManufacturer   - Index of string descriptor for the manufacturer

    char iProduct;              // iProduct        - Index of string descriptor for the product.

    char iSerialNumber;         // iSerialNumber   - Index of string descriptor for the serial number.

    char bNumConfigurations;    // bNumConfigurations - Number of possible configurations

} device_dsc = {

      0x12,                   // bLength

      0x01,                   // bDescriptorType

      0x0200,                 // bcdUSB

      0x00,                   // bDeviceClass

      0x00,                   // bDeviceSubClass

      0x00,                   // bDeviceProtocol

      8,                      // bMaxPacketSize0

      USB_VENDOR_ID,          // idVendor

       USB_PRODUCT_ID,         // idProduct

      0x0001,                 // bcdDevice                // CAMBIAR

      0x01,                   // iManufacturer

      0x02,                   // iProduct

      0x00,                   // iSerialNumber

      0x01                    // bNumConfigurations

  };

/* Configuration 1 Descriptor */

const char configDescriptor1[]= {

    // Configuration Descriptor

    0x09,                   // bLength             - Descriptor size in bytes

    0x02,                   // bDescriptorType     - The constant CONFIGURATION (02h)

    0x29,0x00,              // wTotalLength        - The number of bytes in the configuration descriptor and all of its subordinate descriptors

    1,                      // bNumInterfaces      - Number of interfaces in the configuration

    1,                      // bConfigurationValue - Identifier for Set Configuration and Get Configuration requests

    0,                      // iConfiguration      - Index of string descriptor for the configuration

    USB_SELF_POWER,         // bmAttributes        - Self/bus power and remote wakeup settings

    USB_MAX_POWER,          // bMaxPower           - Bus power required in units of 2 mA

    // Interface Descriptor

    0x09,                   // bLength - Descriptor size in bytes (09h)

    0x04,                   // bDescriptorType - The constant Interface (04h)

    0,                      // bInterfaceNumber - Number identifying this interface

    0,                      // bAlternateSetting - A number that identifies a descriptor with alternate settings for this bInterfaceNumber.

    2,                      // bNumEndpoint - Number of endpoints supported not counting endpoint zero

    0x03,                   // bInterfaceClass - Class code

    0,                      // bInterfaceSubclass - Subclass code

    0,                      // bInterfaceProtocol - Protocol code

    0,                      // iInterface - Interface string index

    // HID Class-Specific Descriptor

    0x09,                   // bLength - Descriptor size in bytes.

    0x21,                   // bDescriptorType - This descriptor's type: 21h to indicate the HID class.

    0x01,0x01,              // bcdHID - HID specification release number (BCD).

    0x00,                   // bCountryCode - Numeric expression identifying the country for localized hardware (BCD) or 00h.

    1,                      // bNumDescriptors - Number of subordinate report and physical descriptors.

    0x22,                   // bDescriptorType - The type of a class-specific descriptor that follows

    USB_HID_RPT_SIZE,0x00,  // wDescriptorLength - Total length of the descriptor identified above.

    // Endpoint Descriptor

    0x07,                   // bLength - Descriptor size in bytes (07h)

    0x05,                   // bDescriptorType - The constant Endpoint (05h)

    USB_HID_IN_EP | 0x80,   // bEndpointAddress - Endpoint number and direction

    USB_TRANSFER_TYPE,      // bmAttributes - Transfer type and supplementary information

    0x40,0x00,              // wMaxPacketSize - Maximum packet size supported

    EP_IN_INTERVAL,         // bInterval - Service interval or NAK rate

    // Endpoint Descriptor

    0x07,                   // bLength - Descriptor size in bytes (07h)

    0x05,                   // bDescriptorType - The constant Endpoint (05h)

    USB_HID_OUT_EP,         // bEndpointAddress - Endpoint number and direction

    USB_TRANSFER_TYPE,      // bmAttributes - Transfer type and supplementary information

    0x40,0x00,              // wMaxPacketSize - Maximum packet size supported    

    EP_OUT_INTERVAL         // bInterval - Service interval or NAK rate

};

const struct {

  char report[USB_HID_RPT_SIZE];

}hid_rpt_desc =

  {

     0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)

    0x09, 0x06,                    // USAGE (Keyboard)

    0xA1, 0x01,                    // COLLECTION (Application)

    0x05, 0x07,                    //   USAGE_PAGE (Keyboard)

    0x19, 0xE0,                    //   USAGE_MINIMUM 224(Keyboard LeftControl)

    0x29, 0xE7,                    //   USAGE_MAXIMUM 231(Keyboard Right GUI)    (left and right: alt, shift, ctrl and win)

    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)

    0x25, 0x01,                    //   LOGICAL_MAXIMUM (1)

    0x75, 0x01,                    //   REPORT_SIZE (1)

    0x95, 0x08,                    //   REPORT_COUNT (8)

    0x81, 0x02,                    //   INPUT (Data,Var,Abs)

    0x95, 0x01,                    //   REPORT_COUNT (1)

    0x75, 0x08,                    //   REPORT_SIZE (8)

    0x81, 0x03,                    //   INPUT (Cnst,Var,Abs)

    0x95, 0x05,                    //   REPORT_COUNT (5)

    0x75, 0x01,                    //   REPORT_SIZE (1)

    0x05, 0x08,                    //   USAGE_PAGE (LEDs)

    0x19, 0x01,                    //   USAGE_MINIMUM (Num Lock)

    0x29, 0x05,                    //   USAGE_MAXIMUM (Kana)

    0x91, 0x02,                    //   OUTPUT (Data,Var,Abs)

    0x95, 0x01,                    //   REPORT_COUNT (1)

    0x75, 0x03,                    //   REPORT_SIZE (3)

    0x91, 0x03,                    //   OUTPUT (Cnst,Var,Abs)

    0x95, 0x06,                    //   REPORT_COUNT (6)

    0x75, 0x08,                    //   REPORT_SIZE (8)

    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)

    0x25, 0x65,                    //   LOGICAL_MAXIMUM (101)

    0x05, 0x07,                    //   USAGE_PAGE (Keyboard)

    0x19, 0x00,                    //   USAGE_MINIMUM (Reserved (no event indicated))

    0x29, 0x65,                    //   USAGE_MAXIMUM (Keyboard Application)

    0x81, 0x00,                    //   INPUT (Data,Ary,Abs)

    0xC0                          // END_COLLECTION      */

  };

//Language code string descriptor

const struct {

  char bLength;

  char bDscType;

  unsigned int string[1];

  } strd1 = {

      4,

      0x03,

      {0x0409}

    };

//Manufacturer string descriptor

const struct{

  char bLength;

  char bDscType;

  unsigned int string[13];

  }strd2={

    28,           //sizeof this descriptor string

    0x03,

    {'A','L','C','I','D','E','S',' ','R','A','M','O','S'}

  };

//Product string descriptor

const struct{

  char bLength;

  char bDscType;

  unsigned int string[3];

}strd3={

    8,          //sizeof this descriptor string

    0x03,

    {'A','R','Z'}

 };

//Array of configuration descriptors

const char* USB_config_dsc_ptr[1];

//Array of string descriptors

const char* USB_string_dsc_ptr[3];

void USB_Init_Desc(){

  USB_config_dsc_ptr[0] = &configDescriptor1;

  USB_string_dsc_ptr[0] = (const char*)&strd1;

  USB_string_dsc_ptr[1] = (const char*)&strd2;

  USB_string_dsc_ptr[2] = (const char*)&strd3;

}

编写主程序仿真键盘,默认功能不停发送字符“C”

//Main.C不停发送“C”

unsigned char readbuff[8] absolute 0x500;

unsigned char writebuff[8] absolute 0x509;

void interrupt()

{

     USB_Interrupt_Proc();        // INTERRPCION POR USB

}

void main()

{

//Initialize ports

     ADCON1=0b1111;   // todo digital

      TRISB=0x0F;//  RB0 -RB7 ENTRADAS

      NOT_RBPU_bit=0; //HABILITA PULL UPS

      HID_Enable(readbuff,writebuff);

     LATB=0;

    while(1)

      {

        memset(writebuff,0,8);      /// borra buffer

         writebuff[0]=0;  // mofificador modifier keys (SHIFT, CTRL, etc)

         writebuff[1]=0;  //releno o  padding  siempre cero

         

         writebuff[2]=6;   //发送 'C'

         while(!HID_Write(writebuff,8));

         Delay_ms(500);

          writebuff[2]=0;

         while(!HID_Write(writebuff,8));   // 停止发送

         LATB7_bit=~LATB7_bit;

         Delay_ms(100);

        }

}

全部构建生成HEX固件

3.Proteus建立一个P18F2550芯片项目并仿真

绘制原理图

编辑原件属性,将MicroC编译的HEX文件放进去

开始仿真,将仿真的USB口插入,提示没有驱动

在C:\Program Files\Mikroelektronika\mikroC PRO for PIC\mikroProg Suite installer\Drivers\Win 2000, XP, 2003 32-bit目录下找到驱动安装后,仿真正常

参考链接

PIC USB HID (Human Interface Device) Interfacing

LibStock - EMULATE A HID USB KEYBOARD WITH PIC

  • 7
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值