GPIO_KEY_Tick.md 1.4 KB

// 定义按键状态枚举 typedef enum {

KEY_IDLE = 0,
KEY_PRESSED = 1,
KEY_RELEASED = 2

} KeyState_t;

// 按键映射表 const KeyMapping_t keyMappings[] = {

{0x01, &KEY1, "呼叫按键"},
{0x02, &KEY0, "手柄检测"},
{0x04, &KEY3, "取消按键1"},
{0x08, &KEY5, "增援按键"},
{0x10, &KEY4, "护理按键"},
{0x20, &KEY2, "换药按键"},
// 0x40位不再映射到KEY3,避免冲突

};

void GPIO_KEY_Tick(void) {

static unsigned char KeyoldState = 0;
unsigned char changedBits;

// 重置所有释放状态的按键
for (int i = 0; i < NUM_KEYS; i++) {
    if (keyVars[i] == KEY_RELEASED) {
        keyVars[i] = KEY_IDLE;
    }
}

// 检测按键状态变化
changedBits = KeyoldState ^ gtArm.KeyState;

// 处理普通按键
for (int i = 0; i < sizeof(keyMappings)/sizeof(KeyMapping_t); i++) {
    if (changedBits & keyMappings[i].bitMask) {
        // 处理特殊延时(如果需要)
        if (keyMappings[i].needsDebounce && !UpdateDebounceCounter(i)) {
            continue;
        }

        // 更新按键状态
        *keyMappings[i].keyVar = (gtArm.KeyState & keyMappings[i].bitMask) ? 
                                 KEY_PRESSED : KEY_RELEASED;
    }
}

// 处理组合按键(拔针功能)
HandleCombinationKey();

// 保存当前状态
KeyoldState = gtArm.KeyState;

}