docs: 重构系统层级为自下而上,剥离独立事件管理模块,全量校正GPIO引脚映射为原理图线标

This commit is contained in:
2026-07-10 10:04:40 +08:00
parent fdda10aadc
commit a04ea5fb51
28 changed files with 291 additions and 120 deletions

View File

@@ -8,26 +8,39 @@
## 2. 关键代码片段与逻辑实现
### 2.1 按键中断定时器扫描 (每 10ms 调度一次)
`Timer1_Isr` (1ms 滴答) 内,通过 `key_scan_timer` 进行 10ms 分频并调用 `Key_Scan_Process()`
### 2.1 按键引脚定义与初始化
主控初始化或 `Key_Init()` 中,配置按键 GPIO 为高阻输入并开启内部上拉
```c
// 引脚声明
sbit KEY_UP = P2^0; // Pin 21
sbit KEY_DOWN = P3^6; // Pin 19
sbit KEY_CONFIRM = P3^7; // Pin 20
sbit KEY_SOS = P2^3; // Pin 24 (原理图上 SOS1/SOS2 并联至该引脚)
void Key_Init(void) {
// 设置为高阻输入
P2M1 |= 0x09; P2M0 &= ~0x09;
P3M1 |= 0xC0; P3M0 &= ~0xC0;
// 开启内部上拉
P2PU |= 0x09;
P3PU |= 0xC0;
}
```
### 2.2 按键中断定时器扫描 (每 10ms 调度一次)
`Timer1_Isr` 内通过定时器分频调用 `Key_Scan_Process()` 进行消抖与长短按状态判定,并将事件推入系统环形队列:
```c
void Key_Scan_Process(void) {
// 1. 读取引脚状态并消抖
// 1. 读取引脚状态并进行 3 次移位消抖
static u8 key_up_state = 0xFF;
static u8 key_down_state = 0xFF;
static u8 key_confirm_state = 0xFF;
static u8 key_sos1_state = 0xFF;
static u8 key_sos2_state = 0xFF;
u8 key_sos_state;
static u8 key_sos_state = 0xFF;
key_up_state = (key_up_state << 1) | KEY_UP;
key_down_state = (key_down_state << 1) | KEY_DOWN;
key_confirm_state = (key_confirm_state << 1) | KEY_CONFIRM;
key_sos1_state = (key_sos1_state << 1) | KEY_SOS1;
key_sos2_state = (key_sos2_state << 1) | KEY_SOS2;
// 双上部 SOS 键的逻辑并联
key_sos_state = key_sos1_state & key_sos2_state;
key_sos_state = (key_sos_state << 1) | KEY_SOS;
// 2. 按键长按与短按状态机扫描
@@ -36,7 +49,7 @@ void Key_Scan_Process(void) {
key_up_hold++;
} else {
if (key_up_hold > 2) {
key_event_buf = KEY_UP_SHORT;
Event_Queue_Push(KEY_EVENT_UP_CLICK);
}
key_up_hold = 0;
}
@@ -45,33 +58,33 @@ void Key_Scan_Process(void) {
if ((key_down_state & 0x07) == 0) {
key_down_hold++;
if (key_down_hold == 200) { // 2秒
key_event_buf = KEY_DOWN_LONG;
Event_Queue_Push(KEY_EVENT_DOWN_LONG);
}
} else {
if (key_down_hold > 2 && key_down_hold < 200) {
key_event_buf = KEY_DOWN_SHORT;
Event_Queue_Push(KEY_EVENT_DOWN_CLICK);
}
key_down_hold = 0;
}
// ■ 确认键 (CONFIRM) 处理 (支持长按 3 秒进入/退出)
// ■ 确认键 (CONFIRM) 处理 (支持长按 3 秒进入菜单)
if ((key_confirm_state & 0x07) == 0) {
key_confirm_hold++;
if (key_confirm_hold == 300) { // 3秒
key_event_buf = KEY_CONFIRM_LONG;
Event_Queue_Push(KEY_EVENT_SOS_LONG); // 复用为确认长按,拉起菜单
}
} else {
if (key_confirm_hold > 2 && key_confirm_hold < 300) {
key_event_buf = KEY_CONFIRM_CLICK;
Event_Queue_Push(KEY_EVENT_SOS_CLICK); // 确认单击
}
key_confirm_hold = 0;
}
// 并联 SOS 键
// SOS 键 (物理双按键并联,按下任意即触发)
if ((key_sos_state & 0x07) == 0) {
key_sos_hold++;
if (key_sos_hold == 3) {
key_event_buf = KEY_SOS_ACTIVE;
if (key_sos_hold == 3) { // 30ms 快速响应
Event_Queue_Push(KEY_SOS_ACTIVE);
}
} else {
key_sos_hold = 0;