103 lines
3.8 KiB
Markdown
103 lines
3.8 KiB
Markdown
# 编码实现 - AMOLED 显示与字模驱动 (Docs/60_coding/mod-lcd.md)
|
||
|
||
本文件对应 Truly AMOLED 驱动与图文渲染的具体编码实现细节。
|
||
|
||
## 1. 对应代码源文件
|
||
|
||
* [Drivers/lcd.c](file:///c:/workfile/105/stc32g12k128/Drivers/lcd.c) (LCD 初始化、SPI 数据写、画图画字函数)
|
||
* [Drivers/lcd.h](file:///c:/workfile/105/stc32g12k128/Drivers/lcd.h) (管脚接口与画图画字声明)
|
||
* [Drivers/lcd_font.h](file:///c:/workfile/105/stc32g12k128/Drivers/lcd_font.h) (ASCII 8x16 点阵字模与图标数据)
|
||
|
||
## 2. 关键代码片段与逻辑实现
|
||
|
||
### 2.1 局部窗口设置 (X 轴偏移量修正)
|
||
在 `lcd.c` 中配置窗口时,需要将坐标对齐到 Truly AMOLED (RM69310) 在 120x240 面板下的实际 GRAM 范围,加入 X 轴 4 像素的偏移,Y 轴无偏移:
|
||
```c
|
||
void LCD_SetWindow(u16 x1, u16 y1, u16 x2, u16 y2) {
|
||
x1 += 4;
|
||
x2 += 4;
|
||
|
||
LCD_WriteCmd(0x2A); // Column Address Set
|
||
LCD_WriteData(x1 >> 8);
|
||
LCD_WriteData(x1 & 0xFF);
|
||
LCD_WriteData(x2 >> 8);
|
||
LCD_WriteData(x2 & 0xFF);
|
||
|
||
LCD_WriteCmd(0x2B); // Row Address Set
|
||
LCD_WriteData(y1 >> 8);
|
||
LCD_WriteData(y1 & 0xFF);
|
||
LCD_WriteData(y2 >> 8);
|
||
LCD_WriteData(y2 & 0xFF);
|
||
}
|
||
```
|
||
|
||
### 2.2 电池图标与动态百分比 (包含充电 + 后缀) 渲染
|
||
在 `main.c` 的时钟页面刷新中,获取当前百分比及充电状态,动态绘制到状态栏:
|
||
```c
|
||
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) {
|
||
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] = ' |