# key_menu **Repository Path**: WangCharley/key_menu ## Basic Information - **Project Name**: key_menu - **Description**: 常用的三按键或4按键LED菜单,使用workbuddy辅助开发 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-06-17 - **Last Updated**: 2026-06-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 冷干机控制器 — 按键菜单模块 > 从 Project 中独立整理的按键扫描 + 菜单编辑模块。 > 适用于 STC8A8K64D4 的 4键输入 + 8位LED数码管显示方案。 --- ## 目录结构 ``` key_menu/ ├── inc/ # 头文件 │ ├── key.h # 按键事件枚举 + API声明 │ ├── menu.h # 菜单状态枚举 + API声明 │ ├── sysdata.h # 系统参数/状态结构体 │ ├── config.h # 类型定义 + MCU头文件 │ ├── type_def.h # u8/u16/int16 等基本类型 │ ├── gpio.h # 引脚 sbit 定义(PIN_KEY_xxx) │ ├── led.h # LED显示接口(menu.c依赖) │ ├── ctrl.h # 控制接口(menu.c依赖:Ctrl_ManualDrain) │ └── app.h # 应用层任务声明(集成参考) ├── src/ # 源文件 │ ├── key.c # 按键扫描状态机 │ ├── menu.c # 菜单状态机 + 参数编辑 │ ├── app.c # 任务实现(集成参考) │ └── Task.c # 任务调度表(集成参考) └── README.md # 本文件 ``` --- ## 按键模块 (key.c / key.h) ### 物理映射 | 索引 | 引脚 | 功能 | 事件常量 | |------|----------|----------|---------------| | 0 | P4.4 | 设置键 | KEY_SET_SHORT / KEY_SET_LONG | | 1 | P1.4 | 加键 | KEY_INC | | 2 | P1.3 | 减键 | KEY_DEC | | 3 | P1.5 | 自动排水 | KEY_AUTO | ### 扫描状态机 ``` IDLE ──(按下)──> DEBOUNCE ──(20ms稳定)──> PRESSED ──(松开)──> RELEASE ──(20ms稳定)──> IDLE ^ | | | └──(干扰)──────────┘ └──(长按80次=800ms,仅SET键)──> KEY_SET_LONG ``` - 扫描周期:10ms(由 Task_Key 驱动) - 消抖:连续 2 次采样一致(20ms) - 长按:仅 SET 键,800ms 触发 KEY_SET_LONG - 先检测到长按,则松开时不生成短按事件 ### API | 函数 | 说明 | 调用位置 | |----------------|------------------|----------------------| | `Key_Init()` | 初始化按键状态机 | APP_config | | `Key_Scan()` | 10ms扫描一轮 | Task_Key (10ms) | | `Key_GetEvent()` | 获取待处理事件(一次性) | Task_KeyEvent (1ms) | --- ## 菜单模块 (menu.c / menu.h) ### 三态菜单 ``` ┌──────────┐ KEY_SET_LONG ┌──────────┐ KEY_SET_SHORT ┌──────────┐ │ NORMAL │ ──────────────> │ MENU │ ──────────────> │ EDIT │ │ 正常显示 │ <────────────── │ 浏览参数 │ <────────────── │ 编辑参数 │ └──────────┘ KEY_SET_LONG └──────────┘ KEY_SET_SHORT └──────────┘ ^ │ └────────────────────────────────────────────────┘ 超时50轮(10s) ``` #### NORMAL 状态 - 显示:左侧 4位排水倒计时 + 右侧 4位温度 - KEY_SET_LONG → MENU 状态 - KEY_AUTO → 手动排水 10秒 #### MENU 状态 - 显示:左侧 `P n` (n=1~6) - KEY_INC/DEC → 切换菜单项 (0~5 循环) - KEY_SET_SHORT → 进入 EDIT 状态 - KEY_SET_LONG → 返回 NORMAL - 10秒无操作 → 自动返回 NORMAL #### EDIT 状态(逐位编辑) - 显示:左侧 4位显示参数值 + 光标闪烁位 - SET 键行为:光标从右向左移动(个→十→百→千),到最左后再次 SET 保存退出 - INC/DEC → 修改光标所在位的数字(0-9 循环) - SET_LONG → 放弃修改,返回 NORMAL - 10秒无操作 → 自动返回 NORMAL 编辑示例(设 P1=3600 秒): ``` 进入 EDIT: [ ][ ][3][6]│0][0] ← 光标在个位(Pos3)闪烁 个位 DEC: [ ][ ][3][5]│0][0] SET: [ ][3][6][ ]│0][0] ← 光标左移到十位(Pos2)闪烁 SET: [3][6][ ][ ]│0][0] ← 光标左移到百位(Pos1)闪烁 SET: [ ][ ][ ][ ]│0][0] ← 光标左移到千位(Pos0)闪烁 SET: 保存 → 返回 MENU (若值超限则自动钳位) ``` 最多 40 次按键即可设满 9999,实际常用值 < 10 次。 小参数(P3~P6)同样适用,前导零自动消隐。 ### 参数表 | 索引 | 参数 | 默认范围 | 说明 | |------|------|-------------|--------------------| | 0 | P1 | 0 ~ 9999 | 排水工作时间(秒) | | 1 | P2 | 0 ~ 9999 | 排水停止时间(秒) | | 2 | P3 | 1 ~ 9 | 温度回差(℃) | | 3 | P4 | -5 ~ 20 | 冷腔设定温度(℃) | | 4 | P5 | 0 ~ 99 | 超温信号(功能待确认) | | 5 | P6 | 0 ~ 99 | 高温保护阈值(℃) | ### API | 函数 | 说明 | 调用位置 | |--------------------------|----------------------|----------------------| | `Menu_Init()` | 初始化菜单 | APP_config | | `Menu_HandleKey(evt)` | 处理按键事件 | Task_KeyEvent (1ms) | | `Menu_UpdateDisplay()` | 刷新显示缓冲区 | Task_Display (200ms) | --- ## 集成方式 ### 1) 初始化序列 (APP_config) ```c Menu_Init(); // 菜单状态 = NORMAL LED_Init(); // 显示缓冲区清空 Key_Init(); // 按键状态机重置 ``` ### 2) 任务调度 (Task_Comps 表) ```c {0, 10, 10, Task_Key}, // 10ms - 按键扫描 {0, 200, 200, Task_Display}, // 200ms - 显示刷新 {0, 1, 1, Task_KeyEvent}, // 1ms - 按键事件分发 ``` ### 3) 事件流 ``` Key_Scan() [10ms] → Key_GetEvent() [1ms] → Menu_HandleKey() → sysState 更新 ↓ Menu_UpdateDisplay() [200ms] → display_buf[] → 硬件扫描 ISR ``` --- ## 外部依赖 | 依赖 | 提供方 | 用途 | |---------------------|-----------------------|-------------------------------| | `STC8A8K64D4.h` | Driver/inc/ | 寄存器定义 + sbit | | `Task.h` | Driver/inc/ (STC官方) | TASK_COMPONENTS 结构体 | | `config.h` | User/ | 类型定义 + MCU头文件包含 | | `led.h / led.c` | App/ | LED_SetBlinkMask, LED_UpdateDisplay | | `ctrl.h / ctrl.c` | App/ | Ctrl_ManualDrain | --- ## 按键事件枚举 ```c typedef enum { KEY_NONE = 0, // 无事件 KEY_SET_SHORT, // 设置键短按 KEY_SET_LONG, // 设置键长按 (800ms) KEY_INC, // 加键 KEY_DEC, // 减键 KEY_AUTO // 自动排水键 } KEY_EVENT; ``` --- *最后更新: 2026-06-17* *源项目: D:\workspace\colddry\Project*