原创 USB游戏手柄的实现

2008-8-29 19:35 8042 7 11 分类: MCU/ 嵌入式

经过几天的忙活,终于把GamePad调通了。


硬件用的是电脑圈圈的USB开发板STC89C52+PDIUSBD12.


由于按键有限,所以只用了上、下、左、右四个方向跟四个按键,晚上还玩了会kof97.


首先把hid的子类代码跟协议代码都置为0.


接着,修改HID的报告描述符。


code char JoyStickReportDescriptor[54] = {
    0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)


  //用途,GamePad
    0x09, 0x05,                    // USAGE (Game Pad)


  //集合
    0xa1, 0x01,                    // COLLECTION (Application)


  //指针设备
    0x09, 0x01,                    //   USAGE (Pointer)


  //集合
    0xa1, 0x00,                    //   COLLECTION (Physical)


   //X座标跟Y座标
    0x09, 0x30,                    //     USAGE (X)
    0x09, 0x31,                    //     USAGE (Y)


   //一共有九个方向3*3
    0x15, 0x00,                    //     LOGICAL_MINIMUM (0)
    0x25, 0x02,                    //     LOGICAL_MAXIMUM (2)


   //X/Y各用两位来表示
    0x75, 0x02,                    //     REPORT_SIZE (2)
    0x95, 0x02,                    //     REPORT_COUNT (2)
    0x81, 0x02,                    //     INPUT (Data,Var,Abs)
    0xc0,                          //   END_COLLECTION


   //高四位填充
    0x75, 0x01,                    //   REPORT_SIZE (1)
    0x95, 0x04,                    //   REPORT_COUNT (4)
    0x81, 0x03,                    //   INPUT (Cnst,Var,Abs)


   //四个按键
    0x05, 0x09,                    //   USAGE_PAGE (Button)
    0x19, 0x01,                    //   USAGE_MINIMUM (Button 1)
    0x29, 0x04,                    //   USAGE_MAXIMUM (Button 4)
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
    0x25, 0x01,                    //   LOGICAL_MAXIMUM (1)
    0x75, 0x01,                    //   REPORT_SIZE (1)
    0x95, 0x04,                    //   REPORT_COUNT (4)
    0x81, 0x02,                    //   INPUT (Data,Var,Abs)


    //高四位填充
    0x75, 0x01,                    //   REPORT_SIZE (1)
    0x95, 0x04,                    //   REPORT_COUNT (4)
    0x81, 0x03,                    //   INPUT (Cnst,Var,Abs)
    0xc0                           //   END_COLLECTION
};


 


数据格式:


Byte1    bit7-bit4 常量填充   bi3-bit0 X/Y座标


Byte2    bit7-bit4 常量填充   bi3-bit0 四个按键状态


点击开大图


 

PARTNER CONTENT

文章评论4条评论)

登录后参与讨论

用户377235 2014-4-20 23:21

请问您用的上位机是自己写的吗?能不能把源代码贴出来看看

用户310250 2010-11-4 18:36

您知道有线手柄的数据是如何传到主机里的吗

用户546181 2009-3-30 18:31

USB手柄会以一定的格式发送键值,看一下usb的hid协议吧。

用户1364249 2009-3-27 23:01

您知道普通的USB手柄怎么和单片机通讯吗?现在想用单片机读取USB游戏手柄的键值,不知什么方案比较好,谢谢。
相关推荐阅读
用户546181 2011-12-16 15:23
MIPS 是什么意思? MIPS/MHZ 又是什么意思?
MIPS ( Million Instruction Per Second )表示每秒多少百万条指令,如 10MIPS ,表示每秒一千万条指令。MIPS/MHz 表示 CPU 在每 MHz 的运行...
用户546181 2011-11-23 16:41
APN是什么
对普通用户来说,使用GPRS上网,几乎都要遇到APN 这个概念, 其实,APN就是一个接入点,GPRS上网的接入服务器 ; 一、 APN的概念 APN(Access Poin...
用户546181 2009-06-20 18:01
MMU工作原理
1.MMU的工作原理我这里就不阐述了。网上有篇关于S3C2410 MMU的讲解,很详细。我就看了韦东山大哥的书的实验代码就写一些体会,并把源代码发出来。具体的代码如下:////////////////...
用户546181 2009-06-17 13:49
基于ARM9芯片S3C2410异常中断程序设计
验证的代码详细分析了基于ARM嵌入式系统的异常处理流程。然后阐明关键字“-irq”的作用,设计出中断处理函数。最后,通过设置中断控制寄存器,设计外部中断EINT3的初始化程序,并给出主程序流程图。实践...
用户546181 2009-06-13 15:15
linux下ntp协议的实现
最近公司比较空,花了一些时间学习了一下linux的应用编程,并且在今天下午完成了最后一章socket的实验。内容就是实现ntp协议,使本机的时间与ntp服务器同步。虽然说原理上并不难,但是过程中却也遇...
用户546181 2009-06-02 16:39
ubuntu下安装vmware tools
如果你是在VM下安装 Ubuntu,那么必须安装VMware-tools,才能获得更好的体验,包括屏幕分辨率、声音、和windows共享剪贴板等等。点击VMware菜单的-VM-Install VMw...
我要评论
4
7
关闭 站长推荐上一条 /3 下一条