最近为了HID类设备弄了半个把月。终于完成这个无线(红外)多媒体键盘,带鼠标功能。难就难在描述符上,不过在近4天的资料翻阅及多次的测试下,电脑不知道重启了多少次啊,的情况下

搞定了这个东西,大家可以看看图片:

下面为键盘的电路图,仅为一个遥控器!

M48接收器的电路就用USBASP的电路即可,但在PD3口加一个红外一体接收头!

遥控器大家可以自己做一个即可,NEC格式,客户码0x00ff,data从00--ff,自己定义,同时可以修改的可以自己改!以适应自己的遥控。

下面是源码: ourdev_401421.rar(文件大小:212K) (原文件名:KIE-PC KEYBOARD(M48).rar)

这是我鼠标与键盘都OK的,键盘带modifierkey的描述:

static const char hidReportDescriptor0[] PROGMEM = {

0x05, 0x01, // Usage Page (Generic Desktop),
0x09, 0x06, //Usage (Keyboard),
0xA1, 0x01, // Collection (Application),
0x85, 0x01, // Report Id (1) //报告类型为1
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, 0x04, // Report Count (4), // 一共4位+1
0x75, 0x08, // Report Size (8), // 每位8位
0x15, 0x00, // Logical Minimum (0), //从0--ff
0x25, 0xff, // Logical Maximum(101),
0x05, 0x07, // Usage Page (Key Codes),
0x19, 0x00, // Usage Minimum (0),
0x29, 0xff, // Usage Maximum (101),
0x81, 0x00, // Input (Data, Array), ;Key arrays (4 bytes)
0xC0, //

// mouse
0x05, 0x01,
0x09, 0x02,
0xA1, 0x01,
0x09, 0x01,
0xA1, 0x00,
0x05, 0x09,
0x19, 0x01,
0x29, 0x03,
0x15, 0x00,
0x25, 0x01,
0x85, 0x02,
0x95, 0x03,
0x75, 0x01,
0x81, 0x02,
0x95, 0x01,
0x75, 0x05,
0x81, 0x01,
0x05, 0x01,
0x09, 0x30,
0x09, 0x31,
0x15, 0x81,
0x25, 0x7F,
0x75, 0x08,
0x95, 0x02,
0x81, 0x06,
0xC0,
0xC0,
};

这个键盘带有鼠标功能。然后在这个基础上修改,我先仅仅实现多媒体按键,看了 computer00的代码。
static const char hidReportDescriptor0[] PROGMEM = {

0x05, 0x0c, // USAGE_PAGE (Consumer Page)
0x09, 0x01, // USAGE (Consumer Control)
0xa1, 0x01, // COLLECTION (Application)
0x09, 0xea, // USAGE (Volume Decrement)
0x09, 0xe9, // USAGE (Volume Increment)
0x09, 0xe2, // USAGE (Mute)
0x09, 0xcd, // USAGE (Play/Pause)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x95, 0x07, // REPORT_COUNT (4)
0x75, 0x01, // REPORT_SIZE (1)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x75, 0x01, // REPORT_SIZE (1)
0x95, 0x01, // REPORT_COUNT (4)
0x81, 0x03, // INPUT (Cnst,Var,Abs)
0xc0 // END_COLLECTION
};

其他地方也适当修改,没有问题,这样修改后能出现 HID 用户控制设备。这就是多媒体键盘会出现的。

static const char hidReportDescriptor0[] PROGMEM = {

0x05, 0x01, // Usage Page (Generic Desktop),
0x09, 0x06, //Usage (Keyboard),
0xA1, 0x01, // Collection (Application),
0x85, 0x01, // Report Id (1) //报告类型为1
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, 0x04, // Report Count (4), // 一共4位+1
0x75, 0x08, // Report Size (8), // 每位8位
0x15, 0x00, // Logical Minimum (0), //从0--ff
0x25, 0xff, // Logical Maximum(101),
0x05, 0x07, // Usage Page (Key Codes),
0x19, 0x00, // Usage Minimum (0),
0x29, 0xff, // Usage Maximum (101),
0x81, 0x00, // Input (Data, Array), ;Key arrays (4 bytes)
0xC0, //

0x05, 0x0c, // USAGE_PAGE (Consumer Page)
0x09, 0x01, // USAGE (Consumer Control)
0xa1, 0x01, // COLLECTION (Application)
0x85, 0x02,
0x09, 0xea, // USAGE (Volume Decrement)
0x09, 0xe9, // USAGE (Volume Increment)
0x09, 0xe2, // USAGE (Mute)
0x09, 0xcd, // USAGE (Play/Pause)
0x0a, 0x83, 0x01, //USAGE (Windows Media Player(0x183))
0x0a, 0x23, 0x02, //USAGE (AC Home(0x0223))
0x0a, 0x92, 0x01, //USAGE (AL Calculator(0x192))
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x95, 0x07, // REPORT_COUNT (7)
0x75, 0x01, // REPORT_SIZE (1)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x75, 0x01, // REPORT_SIZE (1)
0x95, 0x01, // REPORT_COUNT (1)
0x81, 0x03, // INPUT (Cnst,Var,Abs)
0xc0, // END_COLLECTION

// mouse
0x05, 0x01,
0x09, 0x02,
0xA1, 0x01,
0x09, 0x01,
0xA1, 0x00,
0x05, 0x09,
0x19, 0x01,
0x29, 0x03,
0x15, 0x00,
0x25, 0x01,
0x85, 0x03,
0x95, 0x03,
0x75, 0x01,
0x81, 0x02,
0x95, 0x01,
0x75, 0x05,
0x81, 0x01,
0x05, 0x01,
0x09, 0x30,
0x09, 0x31,
0x15, 0x81,
0x25, 0x7F,
0x75, 0x08,
0x95, 0x02,
0x81, 0x06,
0xC0, 

0xC0
};

一个AVRUSB作品HID类的更多相关文章

  1. Ubuntu/Windows下利用“HIDAPI”库函数实现与Hid类USB设备通信

    一.背景: 最近在做的一个项目需要使用USB传递数据,对USB理解不是很深,USB的系统驱动编写则更是天方 夜谭,因此将设备配置成HID类设备成为了首选.其最大的好处在于,LINUX/Windows系 ...

  2. USB学习小记-HID类键盘的报告描述符的理解

    前言 断断续续的学习了将近三个月,才把USB的HID类搞明白,速度真是够慢的.利用晚上+周末的时间学习自己的东西确实是必要的,不过效率是有点低,以后要更专注一些才行,希望自己能做到吧. 在学习过程中, ...

  3. STM32 使用Cubemx 建一个USB(HID)设备下位机,实现数据收发

    这里我主要说一下如何做一个USB下位机,这里主要分3部分:1.建立工程:2.添加报文描述符:3.数据的传输.这里就不讲USB的理论知识了,有想要了解的自行百度一下就可以了. 建立工程:工程建立参考:h ...

  4. 转载 STM32 使用Cubemx 建一个USB(HID)设备下位机,实现数据收发

    STM32 使用Cubemx 建一个USB(HID)设备下位机,实现数据收发  本文转载自 https://www.cnblogs.com/xingboy/p/9913963.html 这里我主要说一 ...

  5. VC++ 一个简单的Log类

    在软件开发中,为程序建立Log日志是很必要的,它可以记录程序运行的状态以及出错信息,方便维护和调试. 下面实现了一个简单的Log类,使用非常简单,仅供参考. // CLogHelper.h : hea ...

  6. Android 分享一个SharedPreferences的工具类,方便保存数据

    我们平常保存一些数据,都会用到SharedPreferences,他是保存在手机里面的,具体路径是data/data/你的包名/shared_prefs/保存的文件名.xml, SharedPrefe ...

  7. Hibernate的多表查询,分装到一个新的实体类中的一个方法

    不知道是否还有其他方法实现,请高人指点. 如果涉及到多张表多字段查询,并且想利用查询出来的字段在界面层构建一个新的实体类,可以使用这种方法: 如果查询出来的多字段中,有多个字段的名字都相同(如想查询出 ...

  8. 一个通用数据库访问类(C#,SqlClient)

    本文转自:http://www.7139.com/jsxy/cxsj/c/200607/114291.html使用ADO.NET时,每次数据库操作都要设置connection属性.建立connecti ...

  9. 编辑一个小的smarty类

    首先先建立两个文件夹,一个temp,存储编译前的文件,一个comp,存储编译后的文件,编译前的文件使用{$title}代替<?php echo $title; ?>,然后将前者编译成后者再 ...

随机推荐

  1. mysql不能链接远程,报(Host '***.***.***.***' is not allowed to connect to this MySQL server)

    Host '***.***.***.***' is not allowed to connect to this MySQL server 其中***...是本机公网ip; 解决办法: 首先看报错窗口 ...

  2. OS-MAC: An Efficient MAC Protocol for Spectrum-Agile Wireless Networks

    IEEE TRANSACTIONS ON MOBILE COMPUTING, VOL. 7, NO. 8, AUGUST 2008 正如之前所说的,这是一个out-of-band local cove ...

  3. Ring3下Hook NtQueryDirectoryFile隐藏文件

    NTSTATUS WINAPI Hook_NtQueryDirectoryFile(IN HANDLE FileHandle,IN HANDLE Event OPTIONAL,IN PIO_APC_R ...

  4. UESTC_吴队长征婚 2015 UESTC Training for Search Algorithm & String<Problem E>

    E - 吴队长征婚 Time Limit: 10000/4000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submi ...

  5. FZU 1856 The Troop (JAVA高精度)

    Problem 1856 The Troop Accept: 72    Submit: 245Time Limit: 1000 mSec    Memory Limit : 32768 KB Pro ...

  6. Canvas API -- JavaScript 标准参考教程(alpha)

    Canvas API -- JavaScript 标准参考教程(alpha) Canvas API

  7. 回溯算法-C#语言解决八皇后问题的写法与优化

    结合问题说方案,首先先说问题: 八皇后问题:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 嗯,这个问题已经被使用各种语言解 ...

  8. Unity 编辑器扩展自定义窗体

    这次看见Unity还可以自定义弹出窗体,让我很好奇.于是就去网上找文章看了看. 如果想自定义窗体需要把类放入Editor文件夹下面. 代码如下: using UnityEngine; using Un ...

  9. 所闻所获6:meditashayne项目总结

    项目源码下载地址: https://github.com/ShayneYeorg/Meditashayne 1.首先一开始设计这个App的时候,我就希望它能比系统自带的备忘录更方便:比如备忘录需要手动 ...

  10. .Net+MySQL

    网上很少用.Net+MySQL的组合的,所以资料比较少,发现一个赶紧分享给大家. 通常数据库连接字符串为:Database=dbname;Data Source=192.168.1.1;Port=33 ...