51开源 USB-HID 手柄制作(三) 添加线性摇杆
51开源 USB-HID 手柄制作(三) 添加线性摇杆2024/08/31 更新 gamepadG1S3
修复按键互锁的bug
新版本暂时不支持宏按键
演示:https://www.bilibili.com/video/BV1UindeEEme
*******************************
【基于 STC8H 的51增强型单片机的 USB-HID 手柄(三)】
https://www.bilibili.com/video/BV1oN411v7fM?t=22.8
注意本文使用了 微软 xbox 360 手柄 的 PID VID ,仅供交流学习使用。
本文使用设备描述符 等信息均来自互联网
源码已上传附件
这次的内容简单点
增加个adc.c
一个初始化 一个调用函数
void ADC_Init(void)
{
P1M0 |= 0x0a;
P1M1 |= 0x0a;
// P1PU |= 0x0a;
P_SW2 |= 0x80; // 扩展寄存器(XFR)访问使能
ADCTIM = 0x3f; // 设置 ADC 内部时序,ADC采样时间建议设最大值
ADCCFG = 0x2f; // 设置 ADC 时钟为系统时钟/2/16/16 右对齐
ADC_CONTR = 0x80; // 使能 ADC 模块
}加一个函数处理ADC的值
u16 joyConvert(BYTE chanel)
{
u16 retValue = 0;
u16 retValue1 = 0;
u16 retValue2 = 0;
u16 retValueAveragU16 = 0;
u16 retValueAverag = 0;
_nop_();
retValue = Get_ADC12bitResult(chanel);
_nop_();
retValue1 = Get_ADC12bitResult(chanel);
_nop_();
retValue2 = Get_ADC12bitResult(chanel);
retValueAveragU16 = (retValue + retValue1 + retValue2) / 3;
if (retValueAveragU16 > 4000) {
retValueAverag = retValueAveragU16 - 2048;
} else if (retValueAveragU16 < 1600) {
retValueAverag = retValueAveragU16 - 2048;
} else {
retValueAverag = 0;
}
#ifdef DEBUG
P6 = retValueAverag;
sprintf(p, "the joy is%d", retValueAverag);
UartSendStr(p);
#endif // DEBUG
return retValueAverag;
}STC 的ADC 过于强大 有12位 ,这里取8位就好
LRXCode = joyConvert(1) >> 4;
LRYCode = joyConvert(3) >> 4;
本帖最后由 gentleman 于 2023-10-9 10:40 编辑
这里也放一份基础版的源码
发现论坛可以传大文件附件了,上位机的完整工程也放在这。
独自等待 发表于 2023-10-1 00:00
学习了
谢谢
不用谢,后来上传了完整项目,你可以去看看 支持 大佬,这个能不能读取游戏状态啊,比如普通手柄的震动,或者更高级的角色或者内部装备的后坐力 车辆的上下浮动数据,这个可以做体感游戏的开发 本帖最后由 gentleman 于 2023-10-7 17:03 编辑
罗程峰820 发表于 2023-10-7 14:49
大佬,这个能不能读取游戏状态啊,比如普通手柄的震动,或者更高级的角色或者内部装备的后坐力 车辆的上下 ...
理论上是可以的,可以考虑加入后续的更新计划。
但除了震动之外,你说的其他功能要有相应的游戏支持(要不我再做个开源的游戏{:4_165:})。
其实最新版本固件就用到了了读取 pc端hid数据的功能--读取PC上位机数据。
玩出 STC-USB 芯高度
神农鼎 发表于 2023-10-7 18:54
玩出 STC-USB 芯高度
是 stc 的芯片性能强{:4_250:} 请问,有测试过摇杆数据通过USB发送到电脑的延时吗? Rex 发表于 2023-10-11 17:31
请问,有测试过摇杆数据通过USB发送到电脑的延时吗?我设置的是10ms准备一次数据。
在定时器设置里,可以自己改。