ST7789V笔记--颜色反显
/** * Bsp_Lcd_ControllerInit — ST7789V 控制器寄存器初始化 ** * 初始化序列来源: ST7789V 数据手册 V1.3, 第 9 章 Application * * 目标面板: KD024C-4 (240×320 常黑 IPS) * 接口方式: SMC 16 位 8080 并行, RGB565 像素格式 * * 流程: * 1. Sleep Out (0x11) → 退出休眠, 启动内部 DC/DC 电源 * 2. MADCTL (0x36) → 扫描方向 BGR 模式 (匹配 emWin BGR 输出) * 3. Frame Rate (0xB2) → 前后廊时序 * 4. Gate Control (0xB7) → VGH/VGL 栅极驱动电压 * 5. VCOM (0xBB) → VCOM 偏置电压, 消除 Flicker * 6. Power Control → 电源管理 (0xC0/C2/C3/C4/C6/D0) * 7. Gamma Curve → 正/负极性 Gamma 校正 (0xE0/0xE1, 14 字节) * 8. COLMOD (0x3A) → 16-bit/pixel RGB565 * 9. CASET/RASET (0x2A/2B) → 默认列/行窗口范围 (0~239 / 0~319) * 10. INVON (0x21) → 【已禁用】KD024C-4 为常黑面板, 无需 INVON 反色 * 11. Display ON (0x29) → 开启显示, GRAM 内容输出到面板 * * 颜色通道对齐策略 (重要): * - emWin 上层配置为 BGR565 格式 → R/B 已在软件层交换 * - MADCTL BGR bit 1 (0x08) → 硬件按 BGR 顺序解读 16-bit 数据 * - 结果: emWin 的 GUI_RED → 驱动收到 0x001F → 硬件 BGR 解读 → RED * - 所有像素写入路径 (Fill/ShowString/FullColor) 无需再做软件层 RGBtoBGR * * 注意: CASET/RASET/RAMWR (0x2A/0x2B/0x2C) 与 ILI9341 相同, * Bsp_Lcd_SetWindow 无需修改。 **/ static void Bsp_Lcd_ControllerInit(void) { #if 1 /* * 1. Sleep Out (0x11) * 退出休眠模式, 启动内部 DC/DC 升压和振荡器。 * 需等待 ≥ 120ms (见 Bsp_Lcd_HwReset 末尾延时)。 * */ LCD_WRITE_CMD(0x11); /* Sleep Out */ /* * 2. MADCTL — Memory Data Access Control (0x36) * * 0x08 0b0000_1000 * Bit[7] MY 0: 行地址从上到下 * Bit[6] MX 0: 列地址从左到右 * Bit[5] MV 0: 行列不交换 (竖屏 240×320) * Bit[4] ML 0: 垂直刷新从上到下 * Bit[3] BGR 1: 数据顺序为 BGR (匹配 emWin 驱动层颜色格式) * Bit[2] MH 0: 水平刷新从左到右 * Bit[1:0] 0: 保留 * * 颜色说明: emWin 内部配置为 BGR565 格式, GUI_RED 经 emWin * 转换后传入驱动层的 RGB565 值为 0x001F。ST7789V 的 BGR bit1 * 告知硬件输入数据是 BGR 顺序, 0x001F 被解读为: B0, G0, R31 → RED。 * 若 BGR0 (RGB 模式), 0x001F 会被硬件解读为 R0, G0, B31 → BLUE。 * */ LCD_WRITE_CMD(0x36); LCD_WRITE_DAT(0x08); /* MY0 MX0 MV0 ML0 BGR1 MH0 */ /* * 3. PORCTRL — Porch Setting (0xB2) * 配置 TFT 驱动时序中的前廊/后廊参数, * 确保 240×320 分辨率帧同步正确。 * * P[7:0] 0x0C (后廊行数 12) * P[15:8] 0x0C (前廊行数 12) * P[19:16] 0x0 (后廊像素数 0) * P[27:20] 0x33 (前廊像素数 51) * P[31:28] 0x3 (前廊像素高 nibble 3) * */ LCD_WRITE_CMD(0xB2); LCD_WRITE_DAT(0x0C); LCD_WRITE_DAT(0x0C); LCD_WRITE_DAT(0x00); LCD_WRITE_DAT(0x33); LCD_WRITE_DAT(0x33); /* * 4. GCTRL — Gate Control (0xB7) * 设置栅极驱动电压 VGH 和 VGL。 * VGH[5:0] 0x15 21 → ≈ 13.26V (TFT 导通) * VGL[2:0] 0x05 5 → ≈ -10.43V (TFT 截止) * */ LCD_WRITE_CMD(0xB7); LCD_WRITE_DAT(0x35); /* VGH21, VGL5 */ /* * 5. VCOMS — VCOM Setting (0xBB) * VCOM 偏置电压, 消除列反转时的 Flicker 闪烁。 * VCOM[6:0] 0x35 53 → VCOM ≈ 0.725V * */ LCD_WRITE_CMD(0xBB); LCD_WRITE_DAT(0x35); /* VCOM 53 → ~0.725V */ /* * 6. LCMCTRL — LCM Control (0xC0) * 内部偏置与升压模式控制。 * XMY[1:0] 00 (列反转) * XBGR 1 (增强显示质量) * 最终值 0x2C * */ LCD_WRITE_CMD(0xC0); LCD_WRITE_DAT(0x2C); /* * 7. VDVVRHEN — VDV and VRH Command Enable (0xC2) * CMDSEL 1 → 允许后续写入 VRHS/VDVS 寄存器。 * */ LCD_WRITE_CMD(0xC2); LCD_WRITE_DAT(0x01); /* 使能 VDV/VRH 命令 */ /* * 8. VRHS — VRH Set (0xC3) * VAP[5:0] 0x12 (GRAMP 高电平参考电压) * VAP 越高 → 画面越亮。当前值 0x12 平衡亮度和功耗。 * */ LCD_WRITE_CMD(0xC3); LCD_WRITE_DAT(0x12); /* VRH 0x12 */ /* * 9. VDVS — VDV Set (0xC4) * VDV[5:0] 0x20 (VDV 电压, 影响 Gamma 基准) * */ LCD_WRITE_CMD(0xC4); LCD_WRITE_DAT(0x20); /* VDV 0x20 */ /* * 10. FRCTRL2 — Frame Rate Control (0xC6) * NLA[4:0] 0x0F 15 * 帧率 fosc / ((RTNA×240) × (NLA1LINE)) * 在 240×320 分辨率下 ≈ 60Hz * */ LCD_WRITE_CMD(0xC6); LCD_WRITE_DAT(0x0F); /* NLA 15, 帧率 ~60Hz */ /* * 11. PWCTRL1 — Power Control 1 (0xD0) * AVDD_CLP 0xA4 (AVDD 电压钳位) * AVCL_CLP 0xA2 (AVCL 电压钳位) * 控制内部升压电路的整体电源参数。 * */ LCD_WRITE_CMD(0xD0); LCD_WRITE_DAT(0xA4); /* AVDD 钳位 */ LCD_WRITE_DAT(0xA2); /* AVCL 钳位 */ /* * 12. PVGAMCTRL — Positive Gamma Curve (0xE0) * 14 字节正极性 Gamma 校正曲线 (VP63~VP0)。 * 精细调节灰阶过渡, 优化高亮度区域色彩还原。 * * 数据表参考值 (V1.3 §9.2), 轻微调整以适配 * KD024C-4 常黑 IPS 面板的偏色特性。 * */ LCD_WRITE_CMD(0xE0); LCD_WRITE_DAT(0xD0); /* VP63 */ LCD_WRITE_DAT(0x00); /* VP62 */ LCD_WRITE_DAT(0x02); /* VP61 */ LCD_WRITE_DAT(0x07); /* VP59 */ LCD_WRITE_DAT(0x0A); /* VP57 */ LCD_WRITE_DAT(0x28); /* VP50 */ LCD_WRITE_DAT(0x32); /* VP43 */ LCD_WRITE_DAT(0x44); /* VP36 */ LCD_WRITE_DAT(0x42); /* VP29 */ LCD_WRITE_DAT(0x06); /* VP23 */ LCD_WRITE_DAT(0x0E); /* VP17 */ LCD_WRITE_DAT(0x12); /* VP11 */ LCD_WRITE_DAT(0x14); /* VP5 */ LCD_WRITE_DAT(0x17); /* VP0 */ /* * 13. NVGAMCTRL — Negative Gamma Curve (0xE1) * 14 字节负极性 Gamma 校正曲线 (VN63~VN0)。 * 与正极性配合, 保证灰阶居中不偏色。 * * 数据表参考值 (V1.3 §9.2), 微调适配面板。 * */ LCD_WRITE_CMD(0xE1); LCD_WRITE_DAT(0xD0); /* VN63 */ LCD_WRITE_DAT(0x00); /* VN62 */ LCD_WRITE_DAT(0x02); /* VN61 */ LCD_WRITE_DAT(0x07); /* VN59 */ LCD_WRITE_DAT(0x0A); /* VN57 */ LCD_WRITE_DAT(0x28); /* VN50 */ LCD_WRITE_DAT(0x31); /* VN43 */ LCD_WRITE_DAT(0x54); /* VN36 */ LCD_WRITE_DAT(0x47); /* VN29 */ LCD_WRITE_DAT(0x0E); /* VN23 */ LCD_WRITE_DAT(0x1C); /* VN17 */ LCD_WRITE_DAT(0x17); /* VN11 */ LCD_WRITE_DAT(0x1B); /* VN5 */ LCD_WRITE_DAT(0x1E); /* VN0 */ /* * 14. COLMOD — Interface Pixel Format (0x3A) * DBI[2:0] 101 → MCU 接口 16-bit/pixel * DPI[2:0] 101 → RGB 接口 16-bit/pixel * 即 RGB565 格式 (R5G6B5 16 位) * */ LCD_WRITE_CMD(0x3A); LCD_WRITE_DAT(0x55); /* DBI5(16bit), DPI5(16bit) */ /* * 15. CASET — Column Address Set (0x2A) * 设置列地址窗口: XS[15:0]0x0000, XE[15:0]0x00EF * 即 0~239 共 240 列 (覆盖整屏) * */ LCD_WRITE_CMD(0x2A); LCD_WRITE_DAT(0x00); /* XS[15:8] 0 */ LCD_WRITE_DAT(0x00); /* XS[7:0] 0 */ LCD_WRITE_DAT(0x00); /* XE[15:8] 0 */ LCD_WRITE_DAT(0xEF); /* XE[7:0] 239 */ /* * 16. RASET — Row Address Set (0x2B) * 设置行地址窗口: YS[15:0]0x0000, YE[15:0]0x013F * 即 0~319 共 320 行 (覆盖整屏) * */ LCD_WRITE_CMD(0x2B); LCD_WRITE_DAT(0x00); /* YS[15:8] 0 */ LCD_WRITE_DAT(0x00); /* YS[7:0] 0 */ LCD_WRITE_DAT(0x01); /* YE[15:8] 1 */ LCD_WRITE_DAT(0x3F); /* YE[7:0] 319 (0x013F) */ /* * 17. INVON — Display Inversion ON (0x21) — 【已禁用】 * KD024C-4 为常黑 (normally-black) IPS 面板, * 不需要列反转反色。若启用 INVON, 所有像素颜色 * 会被逐位取反, 导致: * GUI_RED (emWin BGR0x001F) → 写入 GRAM → INVON 反转为 * 0xFFE0 → 屏幕上显示黄色, 而非红色。 * * 仅当面板为常白 (normally-white) 时才启用 INVON * 来获得正确的黑底显示, 本面板无需此命令。 * */ /* LCD_WRITE_CMD(0x21); */ /* INVON: 常黑面板禁用 */ /* * 18. DISPON — Display ON (0x29) * 打开显示输出, GRAM 内容开始刷新到面板。 * 此时屏幕显示 GRAM 中的随机数据 (未清屏), * 调用方需自行执行一次清屏操作。 * */ LCD_WRITE_CMD(0x29); /* Display ON */ #endif /* 1 */ }现象使用emwin的颜色宏实际显示出来的颜色对不上原因1.emwin本身会将RGB转成BGR最终调用数据发送指令发送出BGR格式的数据MADCTL — Memory Data Access Control (0x36)** 0x08 0b0000_1000* Bit[7] MY 0: 行地址从上到下* Bit[6] MX 0: 列地址从左到右* Bit[5] MV 0: 行列不交换 (竖屏 240×320)* Bit[4] ML 0: 垂直刷新从上到下* Bit[3] BGR 1: 数据顺序为 BGR (匹配 emWin 驱动层颜色格式)* Bit[2] MH 0: 水平刷新从左到右* Bit[1:0] 0: 保留*2.ST7789V 的 INVON 是给常白面板 (normally-white)用的用来反色。KD024C-4 这块屏是常黑面板 (normally-black)不反色就能正确显示。开了 INVON 等于所有颜色取反RGB 彩色全部乱套解决办法1. LCD_WRITE_CMD(0x36);LCD_WRITE_DAT(0x08); /* MY0 MX0 MV0 ML0 BGR1 MH0 */2. /* * 17. INVON — Display Inversion ON (0x21) — 【已禁用】* KD024C-4 为常黑 (normally-black) IPS 面板,* 不需要列反转反色。若启用 INVON, 所有像素颜色* 会被逐位取反, 导致:* GUI_RED (emWin BGR0x001F) → 写入 GRAM → INVON 反转为* 0xFFE0 → 屏幕上显示黄色, 而非红色。** 仅当面板为常白 (normally-white) 时才启用 INVON* 来获得正确的黑底显示, 本面板无需此命令。* *//* LCD_WRITE_CMD(0x21); */ /* INVON: 常黑面板禁用 */总结BGR格式要对应设置好要根据自己的LCD规格书看看是否需要设置反显