“纸上所写的东西,不需要电来维持。墨水屏,也是如此。”你一定用过 Kindle。翻页时屏幕短暂闪烁,新文字出现。关掉电源,画面依然保持。这种”接近纸张”的显示技术就是电子墨水(E-Ink),也是 CrossPoint Reader 的核心硬件之一。 这一章,我们从物理原理讲到代码——搞清楚一个像素是怎么从程序变成屏幕上的黑点的。
5.1 E-Ink 的物理原理
微胶囊里的黑白世界
想象一个透明的小球(直径约和头发丝差不多),里面装满了油,油里漂浮着两种颗粒:白色颗粒带正电,黑色颗粒带负电。双稳态:断电保持画面
颗粒被电场”赶”到位后,即使撤掉电场也不会自己移动——摩擦力和范德华力把它们”粘”在当前位置。这种特性叫双稳态(Bistable):黑和白都是稳定状态,不需要持续供电。这就是 Kindle 关机后屏幕还能显示画面的原因。对比 LCD:手机液晶屏需要背光灯持续点亮、电场持续维持。断电即黑屏。这就是墨水屏续航远超手机的原因。
为什么刷新需要闪烁?
某些颗粒已在”正确”位置时不会响应新的电场变化,周围颗粒移动时会干扰它们,导致残影(Ghosting)。解决办法:先把所有颗粒统一重置——全推到白,再全推到黑,再全推到白——然后画新内容。这个重置过程就是你看到的”闪烁”。5.2 三种刷新模式
- 全刷:完整重置流程,效果最干净但耗时~1秒且闪烁明显。适合打开书籍、进入新页面。
- 半刷:简化重置,比全刷快,闪烁较轻,可能留轻微残影。
- 快刷:不做重置直接覆盖,~200ms 几乎无闪烁,但残影逐渐累积。适合翻页阅读。
阅读器的刷新策略
CrossPoint Reader 默认用快刷翻页,每隔若干页(用户可设置)自动做一次全刷清除残影:5.3 帧缓冲区(Frame Buffer)
把内容推送到屏幕前,需要先在内存中准备好完整的一帧画面。这块内存叫帧缓冲区——可以理解为一块数字画布:800 × 480 ÷ 8 = 48,000 字节 ≈ 47KB,占 380KB 内存的 12%。
clearScreen() → 在缓冲区上画内容 → displayBuffer() 推送到屏幕。
注意 clearScreen() 默认填充 0xFF(全 1),即 bit=1 是白色,bit=0 是黑色。
5.4 像素操作:一个 bit 的旅程
坐标到字节的映射(第 ③ 步)
帧缓冲区是线性内存,屏幕是二维的。映射规则:MSB-First 位顺序(第 ④ 步)
一个字节的 8 个 bit 对应 8 个连续像素,最高位对应最左像素:位运算画像素(第 ⑤ 步)
一个字节存了 8 个像素,不能直接赋值(会破坏其他 7 个像素),必须用位运算”精确手术”:5.5 屏幕旋转:坐标变换
墨水屏的物理像素排列是固定的,但用户可能横着用或竖着用。软件需要把逻辑坐标自动转换成物理坐标:Portrait(竖屏)为例——用户认为屏幕是 480 宽 x 800 高,但物理屏幕仍是 800 宽 x 480 高:
drawPixel 内部自动变换——又是一个抽象层的例子。
5.6 灰度抖动(Dithering)
墨水屏每个像素只能黑或白。怎么显示”灰色”?用印刷界的老技巧——抖动:在区域内按一定密度交替放黑白点,远看像灰色。x%2==0 && y%2==0,只有 x 和 y 都是偶数时画黑点,每 2x2 方块中 1 个黑点。
深灰:(x+y)%2==0,x+y 为偶数时画黑——经典棋盘格,恰好半黑半白。
为什么用模板特化? 颜色在编译时确定,编译器为每种颜色生成优化的机器码,避免运行时条件判断——在每秒调用几十万次的像素操作中,这点优化很有意义。
5.7 灰度显示:4 级灰度
抖动是”视觉欺骗”,凑近看仍能看到黑白网格。通过精确控制电场强度和持续时间,可以让颗粒停在中间位置,实现真正的灰色——4 级灰度,每像素需要 2 bit。 CrossPoint Reader 用两个独立帧缓冲区(LSB 和 MSB)叠加实现:内存代价:灰度模式需双倍缓冲区(~94KB),因此 CrossPoint Reader 只在需要时启用。
5.8 完整的显示流程
本章要点
- E-Ink 原理:微胶囊中的黑白带电颗粒在电场控制下上浮/下沉。断电后颗粒不动(双稳态),画面自然保持。
- 三种刷新模式:全刷最干净但最慢(~1s),快刷最快但累积残影(~200ms)。阅读器翻页用快刷,定期全刷清残影。
- 帧缓冲区:线性内存,每 bit 对应一像素。800x480 屏需 47KB。先画好再一次性推送。
- 像素操作:
byteIndex = y*行宽字节数 + x/8定位字节,bitPosition = 7 - x%8(MSB-First)定位 bit,位运算精确修改。 - 坐标旋转:通过数学变换实现多方向显示,上层无需关心物理方向。
- 灰度抖动:不同密度黑白点阵模拟灰色(25% 浅灰,50% 棋盘格深灰)。
- 4 级灰度:LSB/MSB 双缓冲,每像素 2 bit,用于抗锯齿和灰度漫画,代价是双倍内存。
下一章预告:第 6 章我们将进入存储系统——SD 卡怎么通过 SPI 连接?文件系统怎么工作?多任务同时读写时怎么防冲突?