Microchip PIC 16F1455 USB 堆栈 (第二部分)






4.93/5 (28投票s)
本文将继续介绍 Microchip PIC 16F1455 的 HID USB 堆栈以及在 Windows 平台上与之通信的方式。
引言
本文将继续介绍 Microchip PIC16F1455 的 HID USB 堆栈以及在 Windows 平台上与之通信的方式。要查看第一部分,请单击此处 此处
背景
在第一部分中,我演示了如何使用 Microchip PIC 16F1455 构建和编程一个通用的 HID 设备,以及如何使用一组用 C# 编写的组件与 Windows 进行通信。
本文将展示如何将该芯片用作键盘、鼠标以及所有这些功能集成在一个混合设备中,涵盖以下内容:
- 创建具有按键和“Num Lock”状态 LED 的 HID 键盘
- 创建 HID 鼠标
- 创建一台芯片上集成了通用 HID、键盘和鼠标的混合设备。
所有代码均在 MPLAB-X 2.10 和编译器 XC8 v1.30 下编写。
使用代码
键盘
首先,我们将从键盘开始。设置完全相同,因此相同的原理图和设计也适用。我们将要更改的是芯片上的固件。
下载以下文件
- 16F1455Keyboard.zip -> 这是 MPLABX 项目。
- 16F1455KeyboardHex.zip -> 这是编译后的 Hex 文件。
构建项目或使用 hax 文件并将其烧录到芯片中。
编程后将其连接到计算机。
这是我的情况:
这是我在设备管理器中找到的
按下按钮将模拟键盘上的“A”键,并且行为与真实键盘完全相同,具有重复等功能。最简单的测试方法是使用记事本。LED 反映 Num Lock 的当前状态。要进行测试,请检查设备上的 num lock 状态是否与您的键盘上的状态相同,然后按键盘上的按键,看看我们的设备是否能反映这些更改。
鼠标
现在是时候玩转鼠标了。设置完全相同,因此相同的原理图和设计也适用。我们将要再次更改芯片上的固件。
下载以下文件
- 16F1455Mouse.zip -> 这是 MPLABX 项目。
- 16F1455MouseHex.zip -> 这是编译后的 Hex 文件。
构建项目或使用 hax 文件并将其烧录到芯片中。
编程后将其连接到计算机。
这是我的情况:
这是我在设备管理器中找到的
按下按钮将模拟鼠标右键单击。要进行测试,只需将鼠标指向某物,然后按下设备上的按钮。这将像单击右键一样弹出上下文菜单。在此示例中,LED 没有用途,因此它会一直亮着。
混合设备
这才是真正的乐趣所在。设置完全相同,因此相同的原理图和设计也适用,但这是本文中最后一次更改芯片上的固件。
下载以下文件
- 16F1455HidKeyboardMouse.zip -> 这是 MPLABX 项目。
- 16F1455HidKeyboardMouseHex.zip -> 这是编译后的 Hex 文件。
- USB16F1455HidTest.zip -> 这是 Windows 端的 Visual Studio 项目。
- 下载 16F1455HidKeyboardMouse.zip - 26.3 KB
- 下载 16F1455HidKeyboardMouseHex.zip - 4.6 KB
- 下载 USB16F1455HidTest.zip - 49.4 KB
构建项目或使用 hax 文件并将其烧录到芯片中。
编程后将其连接到计算机。
这是我的情况:
这是我在设备管理器中找到的
请注意 Windows 如何“知道”这是一个多接口设备。MI_00 分配给第一个端点,它是我们的通用 HID,键盘和鼠标分别获得它们的 ID MI_01 和 MI_02。
此图像显示它们在设备管理器下多么整洁。
您还可以在设备和打印机下找到它。
并像任何其他鼠标和键盘一样调整其属性。
此时,我们可以在单个芯片上拥有三个设备,并且可以同时使用和与它们中的任何一个或所有设备进行交互。为了快速演示,让我们启动我们的 Windows 测试程序。获取状态按钮仍然只告诉设备发送其当前状态,但切换 LED,虽然它仍然切换 LED,但方式根本不同。实际上,设备会接收命令并模拟其键盘接口上的 Num Lock 键按下。这会更改主机上所有连接键盘的 Numlock,从而使主机更新所有连接的键盘(包括我们设备的键盘接口)的新状态,然后设备根据接收到的更新设置 LED 并通过 HID 接口报告新状态。这有点曲折,但非常适合我们的测试。最后要测试的部分是 PIC 上的按钮。当 numlock LED 亮起时,它将模拟键盘接口上的 A 键;当 numlock 熄灭时,它将模拟鼠标接口上的右键单击,并且在所有情况下都会向 HID 报告。
我认为这很好地演示了所有接口的使用以及它们之间的交互。
关注点
混合设备是我编写的最后一个模型,在编写软件的过程中,我借鉴了其他三个模型的大量代码,主要是为了将它们放在一起,并且在此过程中,我发现基础堆栈仍然远非完美。我不得不作弊并修复“Usb,c”中的各种部分才能使其正常工作,放弃了我最初设计整个东西时的一些自动化方法。我相信,迟早我将拥有一个非常好的统一基础,适用于任何设备类型,其中只需替换“UsbDescriptors.h”而无需更改任何其他内容,就可以制作出任何所需的设备。任何有经验的眼睛和精通 C 的人都能几乎立即发现这些。
我希望这仍然是一个很好的例子,展示了我们如何玩弄这些芯片并从中获得乐趣。