|

楼主 |
发表于 2024-7-4 12:01:11
|
显示全部楼层
本帖最后由 飞向狙沙 于 2024-7-4 12:56 编辑
二楼软件介绍
因为按键走线黑箱,需要检测键位,碳膜排线扛不住来回测,直接代码测试,把以前写的扫描按键代码搬过来
- void keyPositionScan(void) {
- GPIO* keys[ROW_NUM + COL_NUM];
- uint8_t i, j, idx = ROW_NUM + COL_NUM;
- //合并行列集合,方便遍历
- for (i = 0; i < idx; i++)
- {
- keys[i] = i < ROW_NUM ? rowPins[i] : colPins[i - ROW_NUM];
- //全部初始化成推挽输出,高电平(应该设置为开漏,CH582不支持)
- GPIO_SetBits(keys[i]);
- GPIO_ModeCfg(keys[i],GPIO_ModeOut_PP_5mA);
- }
- while (1)
- {
- for (i = 0; i < idx; i++)
- {
- //i切换为上拉输入
- GPIO_ModeCfg(keys[i],GPIO_ModeIN_PU);
- for (j = 0; j < idx; j++)
- {
- if (i != j)
- {
- //拉低j,检查i电平,为低表示i:j按键按下
- GPIO_ResetBits(keys[j]);
- // mDelaymS(1);
- if (GPIO_ReadPortPin(keys[i])==0)
- {
- //切换i:j状态,再次检查电平状态,j也为低表示无无冲二极管,j为高表示有无冲二极管,方向i正 j负
- GPIO_SetBits(keys[j]);
- GPIO_ModeCfg(keys[i],GPIO_ModeOut_PP_5mA);
- GPIO_ModeCfg(keys[j],GPIO_ModeIN_PU);
- GPIO_ResetBits(keys[i]);
- // mDelaymS(1);
- //j也为低表示无二极管
- if (GPIO_ReadPortPin(keys[j])==0)
- {
- LOG_INFO("press P%c%d--P%c%d\r\n", keys[i]->port==0?'A':'B', getPinNum(keys[i]->pin), keys[j]->port==0?'A':'B', getPinNum(keys[j]->pin));
- }
- else
- {
- LOG_INFO("press P%c%d->P%c%d\r\n", keys[i]->port==0?'A':'B', getPinNum(keys[i]->pin), keys[j]->port==0?'A':'B', getPinNum(keys[j]->pin));
- }
- GPIO_SetBits(keys[i]);
- GPIO_ModeCfg(keys[i],GPIO_ModeIN_PU);
- GPIO_ModeCfg(keys[j],GPIO_ModeOut_PP_5mA);
- }
- GPIO_SetBits(keys[j]);
- }
- }
- GPIO_ModeCfg(keys[i],GPIO_ModeOut_PP_5mA);
- }
- }
- }
复制代码 扫描整理出来的键位
按照扫描出来的键位整理出来的键位数组
官方demo的键位数组,用起来掉头发
按键扫描逻辑:
按键以行列矩阵排列,所有行设置为上拉输入,列设置为推挽输出(开漏输出最好,CH583M不支持),全部列拉高,然后拉低一列,检查所有行有低电平的就表示有对应键按下,检测完一列再拉高,继续拉低下一列重新检测所有行
-
- for (uint8_t i = 0; i < COL_NUM; i++) {
- GPIO_ResetBits(colPins[i]);
- __nop();
- __nop();
- //由于上拉输入拉低需要一定的时间,所以必须延时一段时间再读IO
- for (uint8_t j = 0; j < ROW_NUM; j++) {
- if (GPIO_ReadPortPin(rowPins[j]) == 0) {
- firstbuf[KeyNum++] = (COL_NUM + 1) * j + i + 1;
- // LOG_INFO("key press:R%d,C%d,val:%x",j,i,key8_table[firstbuf[KeyNum-1]]);
- }
- }
- GPIO_SetBits(colPins[i]);
复制代码 去抖、回报率、USB报文等demo了都完成了,懒得研究了,而且之前跟官方要的demo版本比较老,研究了些源码,改完USB正常蓝牙、2.4G通信异常,联系官方说可能因为代码问题,给了新版本代码,结果结构大改,不好直接替换库,就把整体代码重新移植到新demo,费了不少事,新版demo的源码也懒得研究了
Fn组合键设定
- <blockquote>static const uint8_t special_key_map[SPECIAL_KEY_NUM] = {
复制代码
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|