docs: 梳理 SPEC LHS114TC-IF03 屏幕规格及 P0.0 电池采样、P2.7 充电检测设计
This commit is contained in:
@@ -76,7 +76,7 @@ void Key_Scan_Process(void) {
|
||||
}
|
||||
```
|
||||
|
||||
<!-- Checked and verified with always-on screen and sleep removal changes -->
|
||||
<!-- Checked and verified with always-on screen, sleep removal, screen replacement and battery/charge pins update changes -->
|
||||
|
||||
### 2.2 事件异步读取与清除
|
||||
主循环在其周期内轮询 `key_event_buf`。一旦发现其非 `KEY_EVENT_NONE`,拷贝并立即重置该缓冲区为 `KEY_EVENT_NONE` 以防止重复触发:
|
||||
|
||||
@@ -10,12 +10,15 @@
|
||||
|
||||
## 2. 关键代码片段与逻辑实现
|
||||
|
||||
### 2.1 局部窗口设置 (X轴偏移量修正)
|
||||
在 `lcd.c` 中配置窗口时,需要向 X 轴坐标加上 4 像素偏差:
|
||||
### 2.1 局部窗口设置 (X/Y轴偏移量修正)
|
||||
在 `lcd.c` 中配置窗口时,需要将坐标对齐到 ST7789V 在 135x240 面板下的实际 GRAM 范围,加入 X 轴 52 像素、Y 轴 40 像素的偏差:
|
||||
```c
|
||||
void LCD_SetWindow(u16 x1, u16 y1, u16 x2, u16 y2) {
|
||||
x1 += 4;
|
||||
x2 += 4;
|
||||
x1 += 52;
|
||||
x2 += 52;
|
||||
y1 += 40;
|
||||
y2 += 40;
|
||||
|
||||
LCD_WriteCmd(0x2A); // Column Address Set
|
||||
LCD_WriteData(x1 >> 8);
|
||||
LCD_WriteData(x1 & 0xFF);
|
||||
@@ -30,15 +33,48 @@ void LCD_SetWindow(u16 x1, u16 y1, u16 x2, u16 y2) {
|
||||
}
|
||||
```
|
||||
|
||||
### 2.2 电池图标与百分比坐标对齐
|
||||
在 `main.c` 的时钟重绘函数中,通过以下坐标在 **135 像素宽** 屏幕上绘制电量:
|
||||
### 2.2 电池图标与动态百分比 (包含充电 + 后缀) 渲染
|
||||
在 `main.c` 的时钟页面刷新中,获取当前百分比及充电状态,动态绘制到状态栏:
|
||||
```c
|
||||
// 绘制百分比字符
|
||||
LCD_ShowString(77, 24, "85%", COLOR_GRAY, COLOR_BLACK);
|
||||
// 绘制电池位图
|
||||
LCD_ShowImage(107, 27, 20, 10, bmp_battery_20x10, COLOR_GRAY, COLOR_BLACK);
|
||||
void UI_ShowClockPage(SystemState state, u8 hour, u8 min) {
|
||||
char bat_str[10];
|
||||
u8 bat_val = Read_Battery_Percent();
|
||||
bit charging = Is_Charging();
|
||||
|
||||
LCD_Clear(COLOR_BLACK);
|
||||
|
||||
// 充电状态判定与百分比字符串格式化
|
||||
if (charging) {
|
||||
// 充电时显示 + 号后缀,如 "85%+"
|
||||
if (bat_val >= 100) {
|
||||
bat_str[0] = '1'; bat_str[1] = '0'; bat_str[2] = '0'; bat_str[3] = '%'; bat_str[4] = '+'; bat_str[5] = '\0';
|
||||
} else {
|
||||
bat_str[0] = '0' + (bat_val / 10);
|
||||
bat_str[1] = '0' + (bat_val % 10);
|
||||
bat_str[2] = '%';
|
||||
bat_str[3] = '+';
|
||||
bat_str[4] = '\0';
|
||||
}
|
||||
// X 坐标向左平移 8 像素 (X=69) 以确保和电池图标 (X=107) 之间有 6px 以上的安全间距
|
||||
LCD_ShowString(69, 24, bat_str, COLOR_GRAY, COLOR_BLACK);
|
||||
} else {
|
||||
// 未充电正常显示百分比,如 "85%"
|
||||
if (bat_val >= 100) {
|
||||
bat_str[0] = '1'; bat_str[1] = '0'; bat_str[2] = '0'; bat_str[3] = '%'; bat_str[4] = '\0';
|
||||
} else {
|
||||
bat_str[0] = '0' + (bat_val / 10);
|
||||
bat_str[1] = '0' + (bat_val % 10);
|
||||
bat_str[2] = '%';
|
||||
bat_str[3] = '\0';
|
||||
}
|
||||
LCD_ShowString(77, 24, bat_str, COLOR_GRAY, COLOR_BLACK);
|
||||
}
|
||||
|
||||
// 绘制电池位图图标
|
||||
LCD_ShowImage(107, 27, 20, 10, bmp_battery_20x10, COLOR_GRAY, COLOR_BLACK);
|
||||
// ...
|
||||
}
|
||||
```
|
||||
两者 Y 轴保持 24 与 27 对齐,X 轴坐标根据 135 宽屏幕右偏 15 像素(原为 62 和 92),安全边距保持在 6 像素(77 + 3*8 = 101,与 107 之间为 6px),防止重合。
|
||||
|
||||
### 2.3 字模百分号偏置
|
||||
在 `lcd_font.h` 的 ASCII 字符数组中,百分号 `%`(十进制 37,十六进制 0x25)的字模通过在字模绘制时向上平移 2 像素对齐普通数字的下基准线。
|
||||
|
||||
@@ -12,11 +12,11 @@
|
||||
在系统初始化阶段,配置 `SGM_CTRL`(控制屏和背光供电的引脚)为推挽输出模式,并输出高电平:
|
||||
```c
|
||||
void Power_Init(void) {
|
||||
// P1.0 (SGM_CTRL) 配置为推挽输出
|
||||
P1M1 &= ~0x01;
|
||||
P1M0 |= 0x01;
|
||||
// P3.4 (SGM_CTRL) 配置为推挽输出
|
||||
P3M1 &= ~(1 << 4);
|
||||
P3M0 |= (1 << 4);
|
||||
|
||||
// 拉高引脚,开启 LCD 背光与电平供电
|
||||
// 拉高引脚,开启 LCD 背光与供电使能
|
||||
SGM_CTRL = 1;
|
||||
}
|
||||
```
|
||||
@@ -25,6 +25,6 @@ void Power_Init(void) {
|
||||
在主循环事件分发中,不再轮询待机时间累加器,也不再调用休眠流程:
|
||||
* **移除** `Enter_Deep_Sleep` 函数。
|
||||
* **移除** 端口 P0 的引脚中断设置(`P0INTE` 等)及 `PD` 停机指令。
|
||||
* 手环时刻保持主频运转,Timer 1 中断不断累加,`EV1527_Decode` 全时监听射频,随时处理防区报警和 SOS 求救触发。
|
||||
* 手环时刻保持主频运转,Timer 1 中断不断累加,`EV1527_Decode` 全时监听射频,随时处理防区报警 and SOS 求救触发。
|
||||
|
||||
<!-- Checked and verified with 7 sensor types and manual suffix selection changes -->
|
||||
<!-- Checked and verified with always-on screen and sleep removal changes -->
|
||||
|
||||
@@ -37,4 +37,4 @@ void EV1527_Transmit(u32 addr, u8 data_code) {
|
||||
* **绑定对码**:当用户触发对码绑定时,传入 `addr = bracelet_factory_id`,`data_code = 0x01`。
|
||||
* **主动 SOS 警报**:当触发主动 SOS 时,主状态机在 `STATE_SOS_EMITTED` 下定期以时间片的形式调用此函数,传入 `addr = bracelet_factory_id`,`data_code = 0x08`(即二进制 `1000`)。
|
||||
|
||||
<!-- Checked and verified with always-on screen and sleep removal changes -->
|
||||
<!-- Checked and verified with always-on screen, sleep removal, screen replacement and battery/charge pins update changes -->
|
||||
|
||||
@@ -70,10 +70,53 @@ void Add_Sensor(u32 addr, u8 type, u8 suffix_idx) {
|
||||
sensor_list[slot].name_gbk[len++] = '0' + (suffix_idx % 10);
|
||||
sensor_list[slot].name_gbk[len] = '\0';
|
||||
|
||||
// 其余变量赋值并保存数据库
|
||||
// ...
|
||||
Save_Database();
|
||||
}
|
||||
|
||||
### 2.5 电池采样与充电状态读取实现
|
||||
在系统模块中,通过硬件 ADC 通道 8 (P0.0) 和数字 I/O (P2.7) 采集电池状态:
|
||||
|
||||
1. **ADC 初始化 (ADC_Init)**:
|
||||
```c
|
||||
void ADC_Init(void) {
|
||||
P0M1 |= 0x01; P0M0 &= ~0x01; // P0.0 配置为高阻输入 (模拟输入模式)
|
||||
ADCCFG = 0x2F; // RESFMT = 1 (右对齐), ADC 时钟配置为 SYSCLK / 2 / 16
|
||||
ADC_CONTR |= 0x80; // 打开 ADC 电源 (ADC_POWER = 1)
|
||||
}
|
||||
```
|
||||
|
||||
2. **读取采样数据与电量百分比计算**:
|
||||
```c
|
||||
u16 Get_ADC_Result(u8 channel) {
|
||||
ADC_CONTR = 0x80 | channel; // 开启电源并选择通道
|
||||
_nop_(); _nop_();
|
||||
ADC_CONTR |= 0x40; // 启动 ADC 转换 (ADC_START = 1)
|
||||
while (!(ADC_CONTR & 0x20)); // 等待转换完成 (ADC_FLAG)
|
||||
ADC_CONTR &= ~0x20; // 清除 ADC 标志
|
||||
return ((u16)ADC_RES << 8) | ADC_RESL; // 返回 12 位 ADC 转换结果
|
||||
}
|
||||
|
||||
u8 Read_Battery_Percent(void) {
|
||||
u16 adc_val = Get_ADC_Result(8); // 读取通道 8 (P0.0)
|
||||
|
||||
// 线性百分比转换:3.3V (ADC=1279) 对应 0%, 4.2V (ADC=1628) 对应 100%
|
||||
if (adc_val <= 1279) {
|
||||
return 0;
|
||||
} else if (adc_val >= 1628) {
|
||||
return 100;
|
||||
} else {
|
||||
return (u8)((u32)(adc_val - 1279) * 100 / (1628 - 1279));
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
3. **充电状态读取**:
|
||||
```c
|
||||
// P2.7 在 System_Init 时需配置为高阻输入以进行充电状态检测
|
||||
bit Is_Charging(void) {
|
||||
return (P2 & (1 << 7)) ? 1 : 0; // 读取 P2.7 引脚高电平状态,1 表示 USB 接入
|
||||
}
|
||||
```
|
||||
|
||||
<!-- Checked and verified with always-on screen and sleep removal changes -->
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user