docs: 根据1.14寸屏幕、5按键与可编程RGB新规格更新项目文档

This commit is contained in:
2026-07-09 10:49:15 +08:00
parent 17a90ff7dc
commit fdf0c5ed1b
15 changed files with 174 additions and 113 deletions

View File

@@ -1,25 +1,23 @@
# 总体需求 (docs/10_requirements-overview/main.md)
# 总体需求 (Docs/10_requirements-overview/main.md)
## 1. 项目整体框架与系统拓扑
本项目构建一套以 **IPC 摄像头**为中枢、**手环**为随身告警终端、多类 **433MHz 传感器**探测前端的本地安防联动系统,同时通过 WiFi 连接云端,向手机 APP 发送推送通知
本项目**仅包含手环端核心业务及驱动代码的实现**。手环作为随身告警终端,独立接收来自多类 **433MHz 传感器**探测射频信号(本地安防联动系统。IPC 摄像头和手机 APP 等其他周边组件不在本项目编码范围内,仅作外部仿真与对接边界
```mermaid
graph TD
Sensor[433MHz 传感器] -->|433MHz 射频信号| IPC[IPC 摄像头]
Sensor -->|433MHz 射频信号| Wristband[随身手环]
IPC -->|WiFi / LAN| Cloud[云端推送服务]
Cloud -->|推送通知| App[手机 APP]
Sensor[433MHz 传感器] -->|433MHz 射频信号| Wristband[随身手环]
```
## 2. 核心信号流向与行为要求
## 2. 核心信号流向与手环行为要求
1. **传感器触发**:探测到异常时(如门磁打开、烟雾浓度超标)发射固定编码信号24位 EV1527 协议数据,包含 20位地址码 + 4位数据码
2. **手环与 IPC 独立接收**IPC 和手环各自配备 433MHz 接收解调芯片,分别独立解码,互不依赖
3. **终端响应行为**
* **IPC 摄像头端**:解码成功后,TFT LCD 屏幕显示报警 ICON、闪光报警,并通过网关向云端推送手机通知
* **手环端**解码成功后OLED 屏幕显示报警 ICON + 传感器自定义名称,多色 LED 亮起对应颜色,且马达触发特定振动模式
1. **传感器触发**探测到异常时发射固定编码信号24位 EV1527 协议数据,包含 20位地址码 + 4位数据码
2. **手环独立接收**手环配备 LR690L 433MHz 接收解调芯片,独立进行软件自适应时序解码
3. **手环响应行为**
* **屏幕显示**1.14寸135x240 像素)TFT LCD 屏幕显示对应的报警 ICON + 传感器法语自定义名称
* **灯效响应**:可编程 RGB 灯珠根据传感器类型亮起对应颜色并进行特定波形闪烁
* **马达响应**:马达触发特定的振动次数与时长组合。
## 3. 协作规范与门禁说明
本项目的开发协作基于《开发规范.md》定义的“七个环节”。任何目录下文件的修改应当保证其依赖项是同步的。
在每次完成阶段性工作或代码调整后,应运行 `bash .xagent/check-dirty.sh` 进行脏检测自检。
在每次完成阶段性工作或代码调整后,应运行 `python .xagent/check-dirty.py` 进行脏检测自检。

View File

@@ -1,19 +1,23 @@
# 细化需求 (docs/20_requirements-detail/main.md)
# 细化需求 (Docs/20_requirements-detail/main.md)
本章节定义手环终端的物理按键交互、报警矩阵(LED颜色与振动)以及防区划分详细需求。
本章节定义手环终端的物理按键交互、报警矩阵(可编程 RGB 灯颜色与振动)以及防区划分详细需求。
## 1. 物理按键与交互定义
| 按键动作 | 常态 (时钟待机) | 对码配对模式 | 警报触发状态 |
| :--- | :--- | :--- | :--- |
| **▲ 上移键** | 短按:时间调整(或菜单浏览) | 向上滚动选择传感器类型 | 无动作 |
| **▼ 下移键** | 短按:时间调整(或菜单浏览) | 向下滚动选择传感器类型 | 长按 2 秒:解除当前告警并退回时钟 |
| **▲ + ▼ (同时长按3秒)** | **进入对码配对模式** | 无动作 | 无动作 |
| **SOS 键 (短按)** | **触发本地主动 SOS 呼救** | **确认保存当前配对** | 短按:解除告警并退回时钟 |
| **SOS 键 (长按5秒)** | **触发 IPC 绑定对码广播** | 无动作 | 长按:解除告警并退回时钟 |
手环共配备 **5 个物理按键**:侧边 3 个(▲ 上移、▼ 下移、■ 确认),上部 2 个(相同的 SOS1、SOS2具备完全一致的并联电气逻辑
| 按键类别 | 按键动作 | 常态 (时钟待机) | 对码配对模式 | 警报触发状态 |
| :--- | :--- | :--- | :--- | :--- |
| **侧边按键** | **▲ 上移键** | 短按:时间微调 | 菜单向上滚动 | 无动作 |
| **侧边按键** | **▼ 下移键** | 短按:时间微调 | 菜单向下滚动 | 长按 2 秒:解除当前告警并退回时钟 |
| **侧边按键** | **▲ + ▼ (同时长按3秒)** | **进入对码配对模式** | 无动作 | 无动作 |
| **侧边按键** | **■ 确认键 (CONFIRM)** | 无动作 | **选中并进入该类型等待配对** | 短按:解除当前告警并退回时钟 |
| **上部按键** | **SOS1 / SOS2 (短按)** | **触发本地主动 SOS 呼救** | **确认保存当前已捕获的配对** | 短按:解除告警并退回时钟 |
| **上部按键** | **SOS1 / SOS2 (长按5秒)** | **触发 IPC 绑定对码广播** | 无动作 | 长按:解除告警并退回时钟 |
> [!NOTE]
> 在手环发出主动 SOS 呼救马达长振、红灯闪烁或响应防区报警时长按物理按键▲、▼、SOS 任意之一2 秒均应立刻切断声光电反馈,安全重置至时钟待机状态
> 1. **双 SOS 按键冗余**:上部的两个 SOS 键在电路与软件上完全等价。按下其中任意一个按键,均会触发相同的 SOS 信号采集与求救动作
> 2. **警报快速解除**:在手环发出主动 SOS 呼救或响应被动防区报警时按下“确认键”或任意一个“SOS 键”或者长按“▼键”2秒均会立刻切断声光电反馈安全重置至时钟待机状态。
## 2. 传感器对码与报警映射矩阵

View File

@@ -1,29 +1,41 @@
# 架构设计 (docs/30_architecture/main.md)
# 架构设计 (Docs/30_architecture/main.md)
本章节阐述手环的硬件拓扑、引脚分配、软件状态机设计、IAP Flash 数据库存储设计以及低功耗待机机制。
## 1. 硬件规格与引脚映射
主控芯片采用 **STC32G12K128** 单片机(工作频率 24.0 MHz单周期 8051 内核32位乘除法器
显示端采用 **1.14寸 TFT LCD 屏幕**,物理分辨率为 **135x240 像素**
### 1.1 GPIO 引脚配置表
| 引脚号 | 引脚定义 | 模式配置 | 物理外设与功能说明 |
| :--- | :--- | :--- | :--- |
| **P2.3** | `WS2812_DI` | 双向/SPI MOSI | 连接 FCOB-2.7 幻彩 RGB 灯条的 DIN 信号输入 |
| **P2.3** | `WS2812_DI` | 双向/SPI MOSI | 连接可编程 RGB 灯珠WS2812B/FCOB-2.7的 DIN 信号输入 |
| **P2.5** | `MOTOR` | 推挽输出/SCLK | 连接振动马达驱动电路。高电平震动,低电平静止 |
| **P0.1** | `KEY_UP` | 高阻输入+上拉 | 物理按键 SW1 (▲),按下为低电平 |
| **P0.2** | `KEY_SOS` | 高阻输入+上拉 | 物理按键 SW3 (SOS),按下为低电平 |
| **P0.3** | `KEY_DOWN` | 高阻输入+上拉 | 物理按键 SW2 (▼),按下为低电平 |
| **P1.0** | `SGM_CTRL` | 推挽输出 | SGM3833 电源使能。高电平使能输出正负 VELVDD & VAVDD |
| **P1.1** | `LCD_RST` | 推挽输出 | AMOLED 屏幕 RM69310 复位引脚 |
| **P1.3** | `LCD_RS` | 推挽输出 | AMOLED 屏幕 SPI 数据/命令寄存器选择 (D/C) |
| **P1.4** | `LCD_CS` | 推挽输出 | AMOLED 屏幕 SPI 片选信号 |
| **P1.5** | `LCD_SCL` | 推挽输出 | AMOLED 屏幕 SPI 时钟信号 |
| **P1.6** | `LCD_SDA` | 推挽输出 | AMOLED 屏幕 SPI 数据信号 |
| **P0.1** | `KEY_UP` | 高阻输入+上拉 | 侧边按键 ▲ (上移),按下为低电平 |
| **P0.3** | `KEY_DOWN` | 高阻输入+上拉 | 侧边按键 ▼ (下移),按下为低电平 |
| **P0.4** | `KEY_CONFIRM`| 高阻输入+上拉 | 侧边按键 ■ (确认),按下为低电平 |
| **P0.2** | `KEY_SOS1` | 高阻输入+上拉 | 上部按键 SOS 1按下为低电平 |
| **P0.5** | `KEY_SOS2` | 高阻输入+上拉 | 上部按键 SOS 2按下为低电平 |
| **P1.0** | `SGM_CTRL` | 推挽输出 | 屏幕/驱动供电使能。高电平使能,低电平关闭 |
| **P1.1** | `LCD_RST` | 推挽输出 | LCD 屏幕复位引脚 |
| **P1.3** | `LCD_RS` | 推挽输出 | LCD 屏幕 SPI 数据/命令寄存器选择 (D/C) |
| **P1.4** | `LCD_CS` | 推挽输出 | LCD 屏幕 SPI 片选信号 |
| **P1.5** | `LCD_SCL` | 推挽输出 | LCD 屏幕 SPI 时钟信号 |
| **P1.6** | `LCD_SDA` | 推挽输出 | LCD 屏幕 SPI 数据信号 |
| **P2.3** | `ADC3` | 模拟输入 | 电池电压采样输入端口 |
### 1.2 SPI 复用与马达防噪硬件规避设计
### 1.2 上部双 SOS 键并联逻辑设计
为了保证两颗 SOS 按键在软件逻辑上等价,软件在按键消抖和长按状态判定时,采用“逻辑并联”设计。定义一个虚拟的 `is_sos_pressed` 状态标志:
```c
// 只要 SOS1 或 SOS2 有任意一个被按下(低电平),即判定为 SOS 按下
bit is_sos_pressed = (KEY_SOS1 == 0) || (KEY_SOS2 == 0);
```
该标志后续被直接送入消抖状态机和长按计时器,生成 `KEY_SOS_SHORT``KEY_SOS_LONG` 事件,从而完全对上层业务层屏蔽双按键硬件细节。
### 1.3 SPI 复用与马达防噪硬件规避设计
由于 `P2.5` 同时作为马达引脚和硬件 SPI 的 SCLK 引脚,为了避免在高频发送 24-bit 灯效数据时引脚电平抖动导致马达异常鸣叫:
1. **发送前**:调用 `EA = 0` 关闭总中断。临时将 `P2.5` 引脚配置为 **高阻输入模式**。此时 SCLK 输出时钟不会使马达导通。

View File

@@ -1,11 +1,11 @@
# UI 设计 (docs/40_ui-design/main.md)
# UI 设计 (Docs/40_ui-design/main.md)
本章节定义手环 120x240 AMOLED 屏幕的画面布局、各页面坐标位置、中文字体/ASCII 字符对齐基线以及局部刷新逻辑。
本章节定义手环 135x240 TFT LCD 屏幕的画面布局、各页面坐标位置、中文字体/ASCII 字符对齐基线以及局部刷新逻辑。
## 1. 屏幕物理参数与刷新机制
* **屏幕规格**0.95寸 AMOLED 屏 (RM69310 控制芯片),物理分辨率 `120x240`
* **坐标偏移修正**根据硬件布线,写屏窗口渲染存在 **4 像素的 X 轴偏移量**软件在调用 `LCD_SetWindow()` 时必须强行追加该偏移
* **屏幕规格**1.14寸 TFT LCD 屏,物理分辨率 **`135x240`**
* **坐标偏移修正**:写屏窗口渲染存在 **4 像素的 X 轴偏移量**,调用 `LCD_SetWindow(x1 + 4, x2 + 4, y1, y2)`
* **局部刷新防抖机制**:清除重绘标志(`Redraw`)的动作必须在具体的刷新绘制块结束时重置,防止因为主循环高速轮询而产生屏幕闪烁。
---
@@ -17,29 +17,30 @@
时钟页面作为常态显示,包括状态栏、数字时钟和日期行。
```
+---------------------------------------+
| 🔒 ARMED 🔋 85% | <- 状态栏 (Y=24~27)
| |
| |
| 10:35 | <- 中央时间 (Y=80~128)
| |
| |
| VEN. 07-10 | <- 底部日期 (Y=180)
+---------------------------------------+
+-----------------------------------------+
| 🔒 ARME 🔋 85% | <- 状态栏 (Y=24~27)
| |
| |
| 10:35 | <- 中央时间 (Y=80~128)
| |
| |
| VEN. 07-10 | <- 底部日期 (Y=180)
+-----------------------------------------+
```
* **状态栏电量显示(极重要)**
* **电池图标** 绘制在 `X=92, Y=27`
* **电量百分比** 绘制在 `X=62, Y=24`
* 两个控件保持 **6 像素安全间距**,彻底防范乱码和字符相撞。
* **电池图标** 绘制在 `X=107, Y=27`
* **电量百分比** 绘制在 `X=77, Y=24`
* 两个控件`135` 像素宽的屏幕上保持 **6 像素安全间距**77 + 3*8 = 101与 107 之间为 6px,彻底防范乱码和字符相撞。
* **安防状态显示**
* **布防状态 (ARMED)**:状态栏左侧显示红色闭锁 `🔒` 图标,显示 `ARMED`
* **撤防状态 (DISARMED)**:状态栏左侧显示绿色开锁 `🔓` 图标,显示 `DISARMED`
* **布防状态 (ARMED)**:状态栏左侧显示红色闭锁 `🔒` 图标,显示 `ARME`
* **撤防状态 (DISARMED)**:状态栏左侧显示绿色开锁 `🔓` 图标,显示 `DESARME`
### 2.2 传感器配对选择菜单 (STATE_PAIR_MENU)
* **顶部标题**:显示 `MODE PAIR P-XX`(其中 XX 为当前已配对的传感器数量)。
* **列表滚动框**:采用 3 行滚动列表,当前行高亮并显示粗体外框,字号放大(如 `DETEC. PORTE`),非当前行暗淡显示。
* **按键确认行为**:在配对菜单页面,短按侧边 **■ 确认键** 进入所选防区类型的对码等待状态。
### 2.3 报警触发与本地 SOS 界面 (STATE_ALARMING / STATE_SOS_EMITTED)
@@ -57,8 +58,10 @@
---
## 3. 字模设计与基线修正规范
## 3. 文字居中对齐与字模基线规范
为保证排版美观,[Drivers/lcd_font.h](file:///c:/workfile/105/stc32g12k128/Drivers/lcd_font.h) 内的标准字模点阵需要满足如下基线对齐:
* **标准 ASCII 字符集**8x16 像素点阵。
* **水平居中公式**
* 对于标准 8px 宽字符X 轴绘制起点为 `(135 - len * 8) / 2`
* 对于双倍放大 16px 宽时钟字符X 轴绘制起点为 `(135 - len * 16) / 2`
* **百分号(%)符号基线修正**:百分号字符在 `lcd_font.h` 数组的索引 `0x25` 中,点阵数据需**向上平移 2 像素**,以和 `0~9` 数字的基线保持严格水平对齐,避免百分号整体下沉。

View File

@@ -1,15 +1,18 @@
# 模块拆分 - 按键扫描与事件判定 (docs/50_module-breakdown/mod-key.md)
# 模块拆分 - 按键扫描与事件判定 (Docs/50_module-breakdown/mod-key.md)
本模块描述按键状态消抖、长按计时判定以及组合按键识别。
本模块描述按键状态消抖、长按计时判定以及组合按键识别。支持 5 个物理按键到手环事件的映射。
## 1. 模块职责说明
* **职责范围**
1. 在 1ms 定时器中断中建立 10ms 扫描计时周期。
2.个物理按键KEY_UP SW1, KEY_SOS SW3, KEY_DOWN SW2进行状态扫描
2. 5 个物理按键进行引脚电平扫描
* 侧边:`KEY_UP` SW1 (▲), `KEY_DOWN` SW2 (▼), `KEY_CONFIRM` (■)
* 上部:`KEY_SOS1` (SOS 1), `KEY_SOS2` (SOS 2)
3. 实现消抖检测(连续 20ms 检测到电平稳定才认定按键动作)。
4.按住不放的行为进行计时累加,判定长按(如长按 SOS 达 5 秒触发对码;长按 ▲+▼ 达 3 秒触发配对模式)
5. 将按键判定结果转换为 `KeyEvent` 枚举,并注入按键事件缓冲区 `key_event_buf` 供主循环异步读取
4.上部双 SOS 按键进行逻辑并联处理,保证按下任意一个均能触发求救
5. 对按住不放的行为进行计时累加,判定长按(如长按 SOS 达 5 秒触发对码;长按 ▲+▼ 达 3 秒触发配对模式)
6. 将按键判定结果转换为 `KeyEvent` 并注入按键事件缓冲区 `key_event_buf`
## 2. 数据结构定义
@@ -21,9 +24,10 @@ typedef enum {
KEY_UP_LONG,
KEY_DOWN_SHORT,
KEY_DOWN_LONG,
KEY_SOS_SHORT,
KEY_SOS_LONG,
KEY_COMB_LONG // ▲ + ▼ 组合长按事件
KEY_CONFIRM_CLICK, // ■ 确认键短按
KEY_SOS_SHORT, // SOS键短按 (SOS1 或 SOS2)
KEY_SOS_LONG, // SOS键长按5秒 (SOS1 或 SOS2)
KEY_COMB_LONG // ▲ + ▼ 组合长按事件
} KeyEvent;
```
@@ -31,9 +35,11 @@ typedef enum {
* `void Key_Scan_Process(void)`
在 Timer 1 ISR 中每 10ms 调度一次。
* 读取 `KEY_UP`, `KEY_DOWN`, `KEY_SOS` 的 GPIO 逻辑电平。
* 读取 `KEY_UP`, `KEY_DOWN`, `KEY_CONFIRM`, `KEY_SOS1`, `KEY_SOS2` 的 GPIO 逻辑电平。
* 计算并联 SOS 状态:`is_sos_pressed = (KEY_SOS1 == 0) || (KEY_SOS2 == 0)`
* 如果发现按键电平状态改变,进行计数消抖。
* 如果按住不放,累加计时计数器(`key_up_hold`, `key_down_hold`, `key_sos_hold`)。
* 如果按住不放,累加计时计数器(`key_up_hold`, `key_down_hold`, `key_confirm_hold`, `key_sos_hold`)。
* 检测到 `key_up_hold >= 300``key_down_hold >= 300` 达 3 秒时,注入 `KEY_COMB_LONG` 事件。
* 检测到 `key_sos_hold >= 500` 达 5 秒时,注入 `KEY_SOS_LONG` 事件;若释放时未达 5 秒但大于 20ms注入 `KEY_SOS_SHORT`
* 检测到确认键释放,注入 `KEY_CONFIRM_CLICK`
* 事件解析完毕后存入 `key_event_buf`

View File

@@ -1,6 +1,6 @@
# 模块拆分 - LCD 显示与字模驱动 (docs/50_module-breakdown/mod-lcd.md)
# 模块拆分 - LCD 显示与字模驱动 (Docs/50_module-breakdown/mod-lcd.md)
本模块管理 AMOLED 屏幕引脚、SGM3833 电源使能、SPI 传输和界面图文渲染
本模块管理 1.14寸 TFT LCD 屏幕引脚、电平控制、SPI 传输和界面图文渲染(分辨率为 135x240 像素)
## 1. 模块职责说明
@@ -9,11 +9,11 @@
2. 控制 SGM_CTRL 供电管脚。
3. 支持屏幕窗口配置,实现底层清屏与局部像素写入。
4. 读取 `lcd_font.h` 库,在指定坐标绘制 8x16 字符与自定义大小位图。
5. 实现各业务状态屏幕画面绘制
5. 实现各业务状态屏幕135x240 分辨率)画面绘制与文字对齐
## 2. 底层显示接口
* `void LCD_Init(void)`:初始化 LCD 引脚,置 `SGM_CTRL = 1` 使能正负高压供电,并发送 RM69310 的初始化 SPI 寄存器序列。
* `void LCD_Init(void)`:初始化 LCD 引脚,置 `SGM_CTRL = 1` 使能供电,并发送屏幕控制器的初始化 SPI 寄存器序列。
* `void LCD_WriteCmd(u8 cmd)`:拉低 `LCD_RS` 发送 SPI 命令。
* `void LCD_WriteData(u8 dat)`:拉高 `LCD_RS` 发送 SPI 数据。
* `void LCD_SetWindow(u16 x1, u16 y1, u16 x2, u16 y2)`:设置局部像素绘制范围(强制处理 X 轴偏量 `+4`)。
@@ -23,7 +23,10 @@
* `void LCD_ShowChar(u16 x, u16 y, char c, u16 fc, u16 bc)`:在 (x, y) 坐标处绘制 ASCII 字符 `c`
* `void LCD_ShowString(u16 x, u16 y, char *s, u16 fc, u16 bc)`:循环打印字符串。
* `void LCD_ShowStringCentered(u16 y, char *str, u16 fc, u16 bc)`:在 135 像素宽屏幕上水平居中绘制 8 像素宽的字符串,水平起始坐标算法为 `(135 - len * 8) / 2`
* `void LCD_ShowString16x32Centered(u16 y, char *str, u16 fc, u16 bc)`:在 135 像素宽屏幕上水平居中绘制双倍大小 (16x32px) 的字符串,水平起始坐标算法为 `(135 - len * 16) / 2`
* `void LCD_ShowImage(u16 x, u16 y, u16 w, u16 h, const u8 *img, u16 fc, u16 bc)`:在指定区域绘制单色位图。
* `void UI_ShowClockPage(SystemState state, u8 hour, u8 min)`:渲染时钟待机页面,并根据布撤防状态在状态栏绘制相应锁状态图标。
* `void UI_ShowClockPage(SystemState state, u8 hour, u8 min)`:渲染时钟待机页面135 宽布局),并根据布撤防状态在状态栏绘制相应锁状态图标。
* `void UI_ShowAlarmPage(char *sensor_name, u8 zone)`:渲染防区告警页面,显示对应的传感器位图和法语名称。
* `void UI_ShowPairMenuPage(u8 selected_index)`:渲染对码选择菜单。

View File

@@ -1,4 +1,4 @@
# 模块拆分 - 低功耗电源管理 (docs/50_module-breakdown/mod-power.md)
# 模块拆分 - 低功耗电源管理 (Docs/50_module-breakdown/mod-power.md)
本模块描述手环待机情况下的屏幕休眠与单片机停机唤醒机制,用于降低日常静态电流消耗。
@@ -6,18 +6,18 @@
* **职责范围**
1. 在系统无物理按键按下且无射频信号输入达 **10 秒** 后,触发低功耗睡眠动作。
2.RM69310 屏幕控制器发送 Sleep In(命令 `0x10`)使 AMOLED 内部关闭
3. 拉低 `SGM_CTRL = 0` 彻底切断 SGM3833 的正负压与 VAVDD 供电,将屏幕静态电流降至微安级。
4. 将按键引脚(KEY_UP P0.1, KEY_SOS P0.2, KEY_DOWN P0.3配置为外部中断源。
2.LCD 屏幕控制器发送 Sleep In 指令使屏幕进入休眠
3. 拉低 `SGM_CTRL = 0` 彻底切断 LCD 背光与驱动供电,将屏幕静态电流降至微安级。
4. 5 个按键引脚(P0.1, P0.2, P0.3, P0.4, P0.5)全部配置为端口外部中断源。
5. 调用单片机 PD 停机控制寄存器,关闭主时钟进入 Power-Down 停机状态。
6. 在用户按压任意键时通过引脚电平下降沿产生外部中断,瞬时唤醒主控时钟并恢复供电。
6. 在用户按压任意键时通过引脚电平下降沿产生外部端口中断,瞬时唤醒主控时钟并恢复供电。
## 2. 接口与函数设计
* `void Enter_Deep_Sleep(void)`
1. 通过 SPI 通道写指令 `0x10`
2. 设置 `SGM_CTRL = 0`
3. 清除外部中断标志,使能 P0 口外部中断输入
1. 通过 SPI 通道写 Sleep In 指令。
2. 设置 `SGM_CTRL = 0` 关闭背光和供电
3. 清除外部中断标志,使能 P0 口P0.1~P0.5的端口中断输入P0INTE = 0x3E
4. 设置单片机的 `PCON` 寄存器使 `PD = 1`。主时钟停止。
* `void Key_Wakeup_Isr(void)`
按键外部中断服务函数,唤醒后拉高 `SGM_CTRL = 1` 恢复屏幕高压供电,并发送 Wake Up 指令 `0x11` 重建屏幕显示。
按键外部中断服务函数,唤醒后拉高 `SGM_CTRL = 1` 恢复屏幕与背光供电,并发送 Wake Up 指令重建屏幕显示。

View File

@@ -1,6 +1,6 @@
# 模块拆分 - 自适应 RF 解码与发射 (docs/50_module-breakdown/mod-rf.md)
# 模块拆分 - 自适应 RF 解码与发射 (Docs/50_module-breakdown/mod-rf.md)
本模块管理射频芯片 GPIO 初始化、433MHz EV1527 解调接收(宽限时序比值算法)与射频打包主动发射。
本模块管理射频芯片 GPIO 初始化、433MHz EV1527 解调接收(宽限时序比值算法)与射频打包主动发射。已确认此模块与新的 1.14寸屏幕/5按键物理变更兼容。
## 1. 模块职责说明

View File

@@ -1,6 +1,6 @@
# 模块拆分 - 系统核心控制与存储 (docs/50_module-breakdown/mod-sys.md)
# 模块拆分 - 系统核心控制与存储 (Docs/50_module-breakdown/mod-sys.md)
本模块定义手环系统的生命周期、时间计数器、定时中断调度器以及断电保存数据库模块。
本模块定义手环系统的生命周期、时间计数器、定时中断调度器以及断电保存数据库模块。只涉及手环本地代码实现。
## 1. 模块职责说明

View File

@@ -1,4 +1,4 @@
# 编码实现 - 按键扫描与事件判定 (docs/60_coding/mod-key.md)
# 编码实现 - 按键扫描与事件判定 (Docs/60_coding/mod-key.md)
本文件对应按键状态消抖、长按计时判定以及组合按键识别的具体编码实现细节。
@@ -15,11 +15,19 @@ void Key_Scan_Process(void) {
// 1. 读取引脚状态并消抖
static u8 key_up_state = 0xFF;
static u8 key_down_state = 0xFF;
static u8 key_sos_state = 0xFF;
static u8 key_confirm_state = 0xFF;
static u8 key_sos1_state = 0xFF;
static u8 key_sos2_state = 0xFF;
u8 key_sos_state;
key_up_state = (key_up_state << 1) | KEY_UP;
key_down_state = (key_down_state << 1) | KEY_DOWN;
key_sos_state = (key_sos_state << 1) | KEY_SOS;
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;
// 2. 长按与组合按键计时器累加
if ((key_up_state & 0x07) == 0 && (key_down_state & 0x07) == 0) {
@@ -31,7 +39,7 @@ void Key_Scan_Process(void) {
} else {
comb_hold = 0;
// 单个按键:▲ 键
// 单个按键:▲ 键 (UP)
if ((key_up_state & 0x07) == 0) {
key_up_hold++;
} else {
@@ -41,7 +49,17 @@ void Key_Scan_Process(void) {
key_up_hold = 0;
}
// 单个按键:SOS 键
// 单个按键:■ 确认键 (CONFIRM)
if ((key_confirm_state & 0x07) == 0) {
key_confirm_hold++;
} else {
if (key_confirm_hold > 2 && key_confirm_hold < 200) {
key_event_buf = KEY_CONFIRM_CLICK;
}
key_confirm_hold = 0;
}
// 单个按键:并联 SOS 键
if ((key_sos_state & 0x07) == 0) {
key_sos_hold++;
if (key_sos_hold == 500) { // 5秒
@@ -53,7 +71,7 @@ void Key_Scan_Process(void) {
}
key_sos_hold = 0;
}
// ▼ 键处理同上...
// ▼ 键 (DOWN) 处理同上...
}
}
```

View File

@@ -1,4 +1,4 @@
# 编码实现 - LCD 显示与字模驱动 (docs/60_coding/mod-lcd.md)
# 编码实现 - LCD 显示与字模驱动 (Docs/60_coding/mod-lcd.md)
本文件对应 LCD 驱动与字模渲染的具体编码实现细节。
@@ -31,14 +31,28 @@ void LCD_SetWindow(u16 x1, u16 y1, u16 x2, u16 y2) {
```
### 2.2 电池图标与百分比坐标对齐
`main.c` 的时钟重绘函数中,通过以下坐标绘制电量:
`main.c` 的时钟重绘函数中,通过以下坐标**135 像素宽** 屏幕上绘制电量:
```c
// 绘制百分比字符
LCD_ShowString(62, 24, "85%", WHITE, BLACK);
LCD_ShowString(77, 24, "85%", COLOR_GRAY, COLOR_BLACK);
// 绘制电池位图
LCD_ShowImage(92, 27, 24, 12, BATTERY_ICON, RED, BLACK);
LCD_ShowImage(107, 27, 20, 10, bmp_battery_20x10, COLOR_GRAY, COLOR_BLACK);
```
两者 Y 轴保持 24 与 27 对齐X 轴保持 30 像素的安全边距62 + 3 * 8 = 86与 92 之间 6 像素的安全间距),防止文字错乱或重合。
两者 Y 轴保持 24 与 27 对齐X 轴坐标根据 135 宽屏幕右偏 15 像素(原为 62 和 92安全边距保持在 6 像素77 + 3*8 = 101与 107 之间 6px防止重合。
### 2.3 字模百分号偏置
`lcd_font.h` 的 ASCII 字符数组中,百分号 `%`(十进制 37十六进制 0x25的字模通过在字模绘制时向上平移 2 像素对齐普通数字的下基准线。
### 2.4 水平居中渲染实现
`lcd.c` 中,字符串居中函数需修改宽度限制参数为 `135` 像素:
```c
void LCD_ShowStringCentered(u16 y, char *str, u16 color, u16 bg_color) {
u16 len = 0;
char *p = str;
while(*p++) len++;
if(len * 8 >= 135)
LCD_ShowString(0, y, str, color, bg_color);
else
LCD_ShowString((135 - len * 8) / 2, y, str, color, bg_color);
}
```

View File

@@ -1,4 +1,4 @@
# 编码实现 - 低功耗电源管理 (docs/60_coding/mod-power.md)
# 编码实现 - 低功耗电源管理 (Docs/60_coding/mod-power.md)
本文件对应低功耗待机与外部中断唤醒的具体编码实现细节。
@@ -9,20 +9,20 @@
## 2. 关键代码片段与逻辑实现
### 2.1 屏幕休眠命令与供电切断
在待机检测到达 10 秒超时后,调用进入睡眠流程:
在待机检测到达 10秒超时后调用进入睡眠流程
```c
void Enter_Deep_Sleep(void) {
// 1. 发送屏幕休眠指令 (Sleep In)
LCD_WriteCmd(0x10);
Delay_ms(120); // 必须等待 120ms 供屏幕电容放电
// 2. 切断 SGM3833 正负高压供电,阻断 VELVDD 的泄露电流
// 2. 切断 LCD 供电与背光
SGM_CTRL = 0;
// 3. 配置 KEY 端口的中断触发(配置为下降沿触发)
P0IM0 = 0x00; // 下降沿
P0IM1 = 0x00;
P0INTE = 0x0E; // 开启 P0.1, P0.2, P0.3 的端口中断
P0INTE = 0x3E; // 开启 P0.1(UP), P0.2(SOS1), P0.3(DOWN), P0.4(CONFIRM), P0.5(SOS2) 的端口中断 (0011 1110)
// 4. 调用单片机 PD 指令挂起主时钟
PCON |= 0x02; // PD = 1
@@ -32,14 +32,14 @@ void Enter_Deep_Sleep(void) {
```
### 2.2 端口中断唤醒与显示重建
当按键被按下P0.1~P0.3 电平跳变触发外部端口中断CPU 被唤醒并从停机处继续执行:
任意按键被按下P0.1~P0.5 电平下降沿跳变触发外部端口中断CPU 被唤醒并从停机处继续执行:
```c
void Port0_Isr(void) interrupt 37 {
u8 int_src = P0INTF;
P0INTF = 0x00; // 清除中断标志位
if (int_src & 0x0E) {
// 1. 恢复 SGM3833 供电
if (int_src & 0x3E) { // 检查是否是 5 个按键引发的唤醒
// 1. 恢复 LCD 背光与供电
SGM_CTRL = 1;
Delay_ms(20); // 等待供电稳定

View File

@@ -1,6 +1,6 @@
# 编码实现 - 自适应 RF 解码与发射 (docs/60_coding/mod-rf.md)
# 编码实现 - 自适应 RF 解码与发射 (Docs/60_coding/mod-rf.md)
本文件对应自适应射频解码与主动发射的具体编码实现细节。
本文件对应自适应射频解码与主动发射的具体编码实现细节。已验证无变动。
## 1. 对应代码源文件

View File

@@ -1,6 +1,6 @@
# 编码实现 - 系统核心控制与存储 (docs/60_coding/mod-sys.md)
# 编码实现 - 系统核心控制与存储 (Docs/60_coding/mod-sys.md)
本文件对应系统控制与存储的具体编码实现细节。
本文件对应系统控制与存储的具体编码实现细节。只包含手环代码实现。
## 1. 对应代码源文件

View File

@@ -1,4 +1,4 @@
# 测试设计与验证方法 (docs/70_testing/main.md)
# 测试设计与验证方法 (Docs/70_testing/main.md)
本章节整理手环系统的仿真联调指令、IO 状态变化监控规范以及人工实机验证用例。
@@ -8,9 +8,11 @@
| 串口发送字符 | 对应仿真的物理事件与说明 | 预期系统响应 |
| :--- | :--- | :--- |
| **`u` / `U`** | 仿真短按 / 长按 **▲ 键** | 时钟界面切换 / 菜单滚动 |
| **`d` / `D`** | 仿真短按 / 长按 **▼ 键** | 时钟界面切换 / 菜单滚动 / 长按取消报警 |
| **`s` / `S`** | 仿真短按 / 长按 **SOS 键** | 触发本地主动 SOS 警报 / 触发对码保存 |
| **`u` / `U`** | 仿真短按 / 长按 **侧边 ▲ 键** | 时钟微调 / 菜单滚动 |
| **`d` / `D`** | 仿真短按 / 长按 **侧边 ▼ 键** | 时钟微调 / 菜单滚动 / 长按取消报警 |
| **`e` / `E`** | 仿真短按 / 长按 **侧边 ■ 确认键** | 选中并进入等待配对 / 短按取消报警 |
| **`s` / `S`** | 仿真短按 / 长按 **上部 SOS 1 键** | 触发本地主动 SOS 警报 / 触发对码保存 |
| **`x` / `X`** | 仿真短按 / 长按 **上部 SOS 2 键** | 同上,验证双 SOS 键并联触发等效性 |
| **`c`** | 仿真同时长按 **▲ + ▼ 键 3 秒** | 系统直接进入配对模式P-00 |
| **`a`** | 仿真捕获到**已配对门磁**报警信号 | 系统跳转到门磁报警界面,亮红灯,振动 1 次 |
| **`p`** | 仿真捕获到**已配对 PIR 红外**信号 | 系统跳转到 PIR 报警界面,亮橙灯,振动 2 次 |
@@ -23,7 +25,7 @@
## 2. LED 与马达 IO 跳变日志
主循环对外设引脚的电平状态进行了跟踪,当引脚电平发生变化时,自动通过串口向外部终端打印输出日志。这可以在没有焊接实体马达或 LED 灯的情况下验证控制逻辑是否正确:
* **LED 状态日志格式**`[STATE] LED status -> R:1 G:0 B:0` (0表示亮1表示灭)
* **LED 状态日志格式**`[STATE] LED status -> R:1 G:0 B:0` (0表示亮1表示灭WS2812B 幻彩 LED 控制状态)
* **马达状态日志格式**`[STATE] MOTOR -> 1` (1表示开启振动0表示关闭振动)
---
@@ -32,10 +34,10 @@
### 3.1 时钟待机与电量对齐
* **测试方法**:正常上电启动,查看待机界面。
* **预期结果**:时钟、日期显示正常。屏幕右上角的电量 `85%` 与电池图标对齐美观,无任何重叠或乱码(间距为 6 像素)
* **预期结果**:时钟、日期显示正常。**135 像素宽** 屏幕上,电量 `85%` 绘制在 `X=77, Y=24`,电池图标绘制在 `X=107, Y=27`,对齐美观且有 6 像素的安全间距
### 3.2 传感器对码与保存
* **测试方法**:同时长按 ▲+▼ 3秒进入配对用上下键选中 `DETEC. PIR`后物理触发 PIR 传感器,后按下 SOS 确认保存。
* **测试方法**:同时长按 ▲+▼ 3秒进入配对用上下键选中 `DETEC. PIR`按下侧边 **■ 确认键** 开启等待,随后物理触发 PIR 传感器,后按下 **SOS 1**(或 **SOS 2**确认保存。
* **预期结果**
1. 进入配对时LED 亮白色闪烁3Hz马达短振 1 次确认。
2. 解码匹配成功后OLED 屏显示 `✓已保存`LED 绿色常亮 2 秒,马达强振 1 次400ms随后自动退回配对菜单。
@@ -44,4 +46,5 @@
* **测试方法**:在常态下静置手环 10 秒钟不作任何操作。
* **预期结果**
1. 10秒后屏幕全黑关闭且 LED 熄灭,马达不鸣叫(`SGM_CTRL` 拉低为0
2. 按下任意一个物理按键(▲、▼、SOS),屏幕瞬间被点亮并重新恢复时钟待机画面。
2. 按下任意一个物理按键(▲、▼、确认键、SOS1、SOS2),屏幕瞬间被点亮并重新恢复时钟待机画面。