// 定义按键状态枚举 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; }