51开源 USB-HID 手柄制作(三) 添加线性摇杆
2024/08/31 更新 gamepadG1S3
修复按键互锁的bug
新版本暂时不支持宏按键
演示:
*******************************
【基于 STC8H 的51增强型单片机的 USB-HID 手柄(三)】
注意本文使用了 微软 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;
复制代码
|