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规格书看看是否需要设置反显

相关新闻

为什么Codex支持deepseek的key了

为什么Codex支持deepseek的key了

这个变化其实主要发生在 DeepSeek 那边,不是 OpenAI 单独给 Codex 加了 DeepSeek 支持。简单说: Codex 一直支持自定义模型提供商——它通过 config.toml 里的 [model_providers] 配置,可以指向任何"协议兼容"的 API 端点。但 Cod…

2026/10/19 19:09:27 阅读更多 →
C++模板进阶:从基础到实战,掌握泛型编程核心

C++模板进阶:从基础到实战,掌握泛型编程核心

1. 项目概述&#xff1a;为什么C模板值得你投入精力去“拿下”&#xff1f;如果你已经写过一些C代码&#xff0c;用过std::vector<int>或者std::sort&#xff0c;那你其实已经和模板打过交道了。但很多时候&#xff0c;我们只是停留在“会用”的层面&#xff0c;一旦需要…

2026/10/20 7:31:31 阅读更多 →
DeepSeek-V4-Flash-0731-正式版真来了_全面测评与国内外顶尖模型对比

DeepSeek-V4-Flash-0731-正式版真来了_全面测评与国内外顶尖模型对比

DeepSeek-V4-Flash 0731 正式版真来了&#xff1f;一篇看懂这次升级值不值得追时间&#xff1a;2026-07-31 结论先行&#xff1a;这次不是“换代式大跃迁”&#xff0c;但确实是 DeepSeek-V4-Flash 从 preview 走向正式可用的重要节点。它最值得看的&#xff0c;不是模型名字&a…

2026/10/21 0:06:23 阅读更多 →

最新新闻

Flink 1.12任务调度全解析:从StreamGraph到ExecutionGraph的链路

Flink 1.12任务调度全解析:从StreamGraph到ExecutionGraph的链路

做了几年实时计算&#xff0c;我发现不少人把Flink当成一个“黑盒子”&#xff1a;代码提交上去能跑就行&#xff0c;至于任务调度逻辑、资源怎么分配&#xff0c;全都交给框架。这种用法日常没问题&#xff0c;可一旦遇到任务卡住、重启很慢、或者slot不够用&#xff0c;就完全…

2026/10/21 6:35:37 阅读更多 →
技术写作规范:为何宁可不写不可乱写

技术写作规范:为何宁可不写不可乱写

我无法根据当前输入生成符合要求的博文。原因如下&#xff1a;项目标题仅为"rea"&#xff0c;无明确语义&#xff0c;既非常见技术术语&#xff08;如 React、Realm、ReaScript&#xff09;、也非可识别的产品名、缩写或领域关键词&#xff1b;项目正文为空&#xff…

2026/10/21 6:35:37 阅读更多 →
uniapp考试答题小程序源码解析:从题库加载到自动判分

uniapp考试答题小程序源码解析:从题库加载到自动判分

简介&#xff1a;这是一份基于uniapp框架开发的考试答题类小程序源码&#xff0c;面向希望学习跨平台应用开发、了解前端答题逻辑的开发者与在校学生。项目实现了单选、多选、判断三种题型的答题界面&#xff0c;并支持上一题、下一题的自由切换&#xff0c;题目与答案均以静态…

2026/10/21 6:35:37 阅读更多 →
扣子工作流从零到上手:核心节点、搭建方法与避坑指南

扣子工作流从零到上手:核心节点、搭建方法与避坑指南

1. 扣子的工作流到底是什么&#xff0c;能解决什么问题先说结论&#xff1a;扣子&#xff08;Coze&#xff09;里的工作流&#xff0c;就是把“机器人回答问题”这件事&#xff0c;从一句简单的提示词变成一条可视化的流水线。以前你做一个AI机器人&#xff0c;基本套路就是写一…

2026/10/21 6:35:37 阅读更多 →
手动搭建Kubernetes集群并集成KubeSphere:从裸机到可用平台的完整指南

手动搭建Kubernetes集群并集成KubeSphere:从裸机到可用平台的完整指南

手动搭一套 Kubernetes 集群&#xff0c;很多人第一反应就是难。尤其当你还要在它上面叠一个 KubeSphere&#xff0c;这个集可视化、多集群、监控、日志、DevOps 于一体的全家桶平台&#xff0c;光是版本匹配就够折腾一阵子。这篇文章写给想自己动手从裸机开始搭一套完整 k8s 环…

2026/10/21 6:35:37 阅读更多 →
K8s Pod运维实战:状态排查、探针配置与资源限制

K8s Pod运维实战:状态排查、探针配置与资源限制

先聊点实际的。如果你已经会用kubectl apply -f把 Pod 拉起来&#xff0c;会用kubectl get pods看状态&#xff0c;那这篇就是给你准备的。这是 K8s 操作系列里 Pod 部分的第二篇&#xff0c;前一篇我们把 Pod 的创建、查看、删除、标签这些基础操作过了一遍&#xff0c;这一篇…

2026/10/21 6:34:37 阅读更多 →

日新闻

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事&#xff1a;AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里&#xff0c;按宣传口径&#xff0c;本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”&#xff0c;而是这话背后的含金量——它把过去只能…

2026/10/21 0:00:11 阅读更多 →
AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

1. 从“封号重开”这个行为说起&#xff1a;用户到底在追求什么“封号重开”这四个字&#xff0c;放在任何产品语境里都带着一股决绝的味道。一个账号从零开始积累使用记录、调教偏好、沉淀工作流&#xff0c;背后是大量的时间和精力成本。正常情况下&#xff0c;没有人愿意主动…

2026/10/21 0:00:11 阅读更多 →
ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

1. 为什么在ROS里硬刚YOLOv3不是“炫技”&#xff0c;而是工程落地的必经之路我第一次在某高校机器人实验室看到那台搭载Jetson TX2的移动底盘原地打转、反复识别错垃圾桶时&#xff0c;就意识到&#xff1a;单纯跑通darknet_ros demo和真正让YOLOv3在ROS里“干活”&#xff0c…

2026/10/21 0:00:11 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/21 4:27:17 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →