感謝沁恒開發(fā)們提供的三模demo,大家做鍵盤的時候一定要跟開發(fā)大大們要最新的demo,去年提供的demo鏈接藍(lán)牙和2.4G有問題,聯(lián)系了大大們提供的新demo測試藍(lán)牙、2.4G都正常


順帶提一句,demo里的按鍵掃描部分寫的不太適合移植,而做鍵盤這部分和Fn功能鍵部分是最需要調(diào)整的,這里建議優(yōu)化一下


對于鍵盤修復(fù)或者改裝的,需要用到現(xiàn)有鍵位掃描,把自己用的代碼分享給大家

#ifdef?ENABLE_KEY_DEFINE_SCAN

uint8_t?getPinNum(uint32_t?pin)?{

????uint8_t?pos=0;
????if(pin==0)
????return?99;
????while(pin>1)?{
????????pos++;
????????pin=pin>>1;
????}
????return?pos;
}
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];
????????//全部初始化成推挽輸出,高電平(應(yīng)該設(shè)置為開漏,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狀態(tài),再次檢查電平狀態(tài),j也為低表示無無沖二極管,j為高表示有無沖二極管,方向i正?j負(fù)
????????????????????????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);
????????}
????}
}
#endif

1720077584211953.png

1720077584164440.jpg