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

📄 复件 30日精简容易识别usbkeyboard.c

📁 此程序能实现PIC16F877A与D12实现USB通讯
💻 C
📖 第 1 页 / 共 2 页
字号:
/******************************************************************
 
*******************************************************************/

#include <pic.h>
#include "USB.h"
#include "PDIUSBD12.h"
#include "my_type.h"
#include "877init.c"
//#include "keyboard.h"

#define USB_COMMAND_ADD           1
#define USB_DATA_ADD              0

//USB芯片连接引脚
#define USB_DATA                  PORTD
#define USB_A0                    RA5
#define USB_WR                    RA3
#define USB_RD                    RA2
#define USB_INT                   RB0
#define SUSPEND                   RB4
#define RDIO                      TRISD
#define ENDPOINT_NUMBER           2
#define MAX_CONTROL_DATA_SIZE     16
//---------------------


//交换数据时用的指针
 uint8 *pData;
 const uint8 *ptr_const;   //用来访问常量数组
uint8 const_flag_d=0;
uint8 const_flag_i=0;
 uint8 idle;     //空闲状态
 uint8 protocol; //当前协议

//高低字节交换

//#define SWAP16(x)  ((((uint16)(x))<<8)|(((uint16)(x))>>8))

//取一个整数的低字节 
#define LSB(x) ((uint8)(x))

//取一个整数的高字节
#define MSB(x) ((uint8)(((uint16)(x))>>8))     
                          
//字符串描述符所用的语言种类 
bank1 const uint8 LANGUAGE_ID[4]={0x04,0x03,0x09,0x04};                   

//设备序列号            							
bank1 const uint8 device_serial_number[]=
{22,STRING_DESCRIPTOR,'2',0,'0',0,'0',0,'7',0,'-',0,'0',0,'3',0,'-',0,'2',0,'3',0};

//厂商字符串
bank1 const uint8 ManufacturerString[14]=
{14,STRING_DESCRIPTOR,'P',0,'A',0,'N',0,'S',0,'O',0,'N',0};

//产品字符串
 bank1 const uint8 ProducterString[14]={14,STRING_DESCRIPTOR,'P',0,'A',0,'N',0,'S',0,'O',0,'N',0};

//控制传输时保存数据
bank1 CONTROL_DATA_BUFF  Control_Data;

//缓冲
// bank1 uint8  buffer[16];
//用来返回数据的缓冲
//uint8  InBuffer[8];

//该报告描述符号由HID Descriptor tool生成

  const char  KeyBoardReportDescriptor[63] = {
     0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)
    0x09, 0x06,                    // USAGE (Keyboard)
    0xa1, 0x01,                    // COLLECTION (Application)

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

    0x19, 0xe0,                    //   USAGE_MINIMUM (Keyboard LeftControl)
    0x29, 0xe7,                    //   USAGE_MAXIMUM (Keyboard Right GUI)
    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, 0x01,                    //   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 (255)
    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
};



 DEVICE_DESCRIPTOR_STRUCT device_descriptor=     //设备描述符
{
 sizeof(DEVICE_DESCRIPTOR_STRUCT),                   //设备描述符的字节数大小
 DEVICE_DESCRIPTOR,                                  //设备描述符类型编号
 0x0110,                                        //USB版本号
 0x00,                                               //USB分配的设备类代码
 0x00,                                               //USB分配的子类代码
 0x00,                                               //USB分配的设备协议代码
 0x10,                                               //端点0的最大包大小
0x1234,
 //0x413c,                                             //厂商编号VID,这里只是作为测试用,请使用自己的VID
 //0x2003,                                             //产品编号PID,这里只是作为测试用,请使用自己的PID
0x5678,
 0x0001,                                             //设备出厂编号
 0x01,                                               //设备厂商字符串的索引
 0x02,                                               //描述产品字符串的索引
 0x03,                                               //描述设备序列号字符串的索引
 0x01                                                //可能的配置数量
};

//定义配置,接口,端点等描述符结构体,因为它们是随配置描述符一起返回的
typedef struct _CON_INT_ENDP_DESCRIPTOR_STRUCT
{
 CONFIGURATION_DESCRIPTOR_STRUCT configuration_descriptor;
 INTERFACE_DESCRIPTOR_STRUCT  interface_descriptor;
 HID_DESCRIPTOR_STRUCT hid_descriptor;
 ENDPOINT_DESCRIPTOR_STRUCT  endpoint_descriptor[ENDPOINT_NUMBER];
}CON_INT_ENDP_DESCRIPTOR_STRUCT;

bank1  CON_INT_ENDP_DESCRIPTOR_STRUCT con_int_endp_descriptor=
{
//configuration_descriptor                                          //配置描述符
{
 sizeof(CONFIGURATION_DESCRIPTOR_STRUCT),                           //配置描述符的字节数大小
 CONFIGURATION_DESCRIPTOR,                                          //配置描述符类型编号
 sizeof(CON_INT_ENDP_DESCRIPTOR_STRUCT),
 0x01,                                                            //只包含一个接口
 0x01,                                                            //该配置的编号
 0x00,                                                            //iConfiguration字段
 0xa0,                                                            //采用总线供电,支持远程唤醒
 0xc8                                                            //从总线获取最大电流400mA
},
//interface_descritor                                             //接口描述符
{
 sizeof(INTERFACE_DESCRIPTOR_STRUCT),                             //接口描述符的字节数大小
 INTERFACE_DESCRIPTOR,                                            //接口描述符类型编号
 0x00,                                                            //接口编号为0
 0x00,                                                            //该接口描述符的编号
 ENDPOINT_NUMBER,                                                 //非0端点数量为2,只使用端点主端点输入和输出
 0x03,                                                            //人机接口设备(HID)类
 0x00,                                                            //使用的子类:支持BIOS根启动Boot的子类
 0x01,                                                            //使用的协议:键盘
 0x00                                                             //接口描述符字符串索引
},
//hid_descriptor
{
 sizeof(HID_DESCRIPTOR_STRUCT),                                   //HID描述符的字节数大小
 HID_DESCRIPTOR,                                                  //HID描述符类型编号
 0x0110,                                                          //HID类协议版本号,为1.1
 
 0x21,                                                            //固件的国家地区代号,0x21为美国
 NUM_SUB_DESCRIPTORS,                                             //下级描述符的数量
 {
  {
   REPORT_DESCRIPTOR,                                             //下级描述符为报告描述符
  sizeof(KeyBoardReportDescriptor)                                //下级描述符的长度
  }
 },
},
//endpoint_descriptor[]
{
 {                                                                //主端点输入描述
  sizeof(ENDPOINT_DESCRIPTOR_STRUCT),                             //端点描述符的字节数大小
  ENDPOINT_DESCRIPTOR,                                            //端点描述符类型编号
  MAIN_POINT_IN,                                                  //端点号,主输入端点2
  ENDPOINT_TYPE_INTERRUPT,                                        //使用的传输类型:中断传输
  //0x4000,                                                         //该端点支持的最大包尺寸,64字节
0x0040,
  0x0A                                                            //中断扫描时间:设置为10ms
 },
  
 {                                                                //主端点输出描述
  sizeof(ENDPOINT_DESCRIPTOR_STRUCT),                             //端点描述符的字节数大小
  ENDPOINT_DESCRIPTOR,                                            //端点描述符类型编号
  MAIN_POINT_OUT,                                                 //端点号,主输出端点2
  ENDPOINT_TYPE_INTERRUPT,                                        //使用的传输类型:中断传输
0x0040,
 // 0x4000,                                                         //该端点支持的最大包尺寸,64字节
  0x0A                                                            //中断扫描时间:设置为10ms
 }
}
};

bank1 union                                                            //程序标志位
{
uint16 Register;
struct 
{
 uint8 bus_reset        :1;
 uint8 suspend          :1;
 uint8 remote_wakeup    :1;
 uint8 int_isr          :1;
 uint8 not_end          :1;
 uint8 usb_idle         :1;
 uint8 usb_busy         :1;
 uint8 setup_packet_in  :1;
 uint8 setup_packet_out :1;
 uint8 set_addr         :1;
 uint8 usb_endp0_in     :1;
 uint8 usb_endp2_in     :1;
 uint8 usb_endp2_out    :1;
}flags;
}usb_flags;

bank1 union                                         //中断寄存器
{
 uint8 Register[2];
 struct 
  {
   uint8 control_out_port  :1;

⌨️ 快捷键说明

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