docs: 根据1.14寸屏幕、5按键与可编程RGB新规格更新项目文档
This commit is contained in:
@@ -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) 处理同上...
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
```
|
||||
|
||||
@@ -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); // 等待供电稳定
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# 编码实现 - 自适应 RF 解码与发射 (docs/60_coding/mod-rf.md)
|
||||
# 编码实现 - 自适应 RF 解码与发射 (Docs/60_coding/mod-rf.md)
|
||||
|
||||
本文件对应自适应射频解码与主动发射的具体编码实现细节。
|
||||
本文件对应自适应射频解码与主动发射的具体编码实现细节。已验证无变动。
|
||||
|
||||
## 1. 对应代码源文件
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# 编码实现 - 系统核心控制与存储 (docs/60_coding/mod-sys.md)
|
||||
# 编码实现 - 系统核心控制与存储 (Docs/60_coding/mod-sys.md)
|
||||
|
||||
本文件对应系统控制与存储的具体编码实现细节。
|
||||
本文件对应系统控制与存储的具体编码实现细节。只包含手环代码实现。
|
||||
|
||||
## 1. 对应代码源文件
|
||||
|
||||
|
||||
Reference in New Issue
Block a user