2025-03-20 16:36:10 +08:00
|
|
|
|
/* KeyScan.c - 按键扫描模块 */
|
2025-03-19 18:22:32 +08:00
|
|
|
|
#include "KeyScan.h"
|
|
|
|
|
|
2025-03-20 16:36:10 +08:00
|
|
|
|
// 按键状态机结构体
|
|
|
|
|
typedef struct
|
|
|
|
|
{
|
|
|
|
|
uint8_t prev_state; // 前次状态
|
|
|
|
|
uint8_t edge_trigger; // 边沿触发标志
|
|
|
|
|
uint8_t scan_counter; // 扫描计数器
|
|
|
|
|
} KeyStateMachine;
|
|
|
|
|
|
|
|
|
|
static KeyStateMachine key_state = { 0xFF, 0x00, 0 };
|
|
|
|
|
|
|
|
|
|
/*******************************************
|
|
|
|
|
* 初始化函数
|
|
|
|
|
*******************************************/
|
|
|
|
|
void
|
|
|
|
|
Key_Init (void)
|
|
|
|
|
{
|
|
|
|
|
// 配置P2.4-P2.1为准双向口
|
|
|
|
|
P2M0 &= 0xE1;
|
|
|
|
|
P2M1 &= 0xE1;
|
|
|
|
|
|
|
|
|
|
// 初始化按键状态
|
|
|
|
|
key_state.prev_state = (KEY1 * 0x08) | (KEY2 * 0x04) | (KEY3 * 0x02) | KEY4;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*******************************************
|
|
|
|
|
* 按键扫描函数
|
|
|
|
|
* 需在主循环中周期性调用
|
|
|
|
|
*******************************************/
|
|
|
|
|
void
|
|
|
|
|
Key_Scan (void)
|
|
|
|
|
{
|
|
|
|
|
const uint8_t current = (KEY1 * 0x08) | (KEY2 * 0x04) | (KEY3 * 0x02) | KEY4;
|
|
|
|
|
|
|
|
|
|
// 边沿检测
|
|
|
|
|
const uint8_t falling_edge
|
|
|
|
|
= (key_state.prev_state ^ current) & key_state.prev_state;
|
|
|
|
|
key_state.edge_trigger |= falling_edge; // 累积触发事件
|
|
|
|
|
|
|
|
|
|
key_state.prev_state = current; // 更新历史状态
|
2025-03-19 18:22:32 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-03-20 16:36:10 +08:00
|
|
|
|
/*******************************************
|
|
|
|
|
* 按键事件获取接口(供外部模块调用)
|
|
|
|
|
* 返回:4位掩码,对应KEY4-KEY1的触发状态
|
|
|
|
|
*******************************************/
|
|
|
|
|
uint8_t
|
|
|
|
|
Get_KeyEvents (void)
|
|
|
|
|
{
|
|
|
|
|
const uint8_t events = key_state.edge_trigger;
|
|
|
|
|
key_state.edge_trigger = 0; // 读取后清除标志
|
|
|
|
|
return events;
|
|
|
|
|
}
|