1、墨水屏玩家遇到的问题
玩儿墨水屏电子价签的朋友,应该有不少人都遇到了一个同样的问题,同一个尺寸的屏幕,型号相同只是后缀不同,有的屏幕就不能更新时间。把程序改为每分钟全刷,就可以走时。但是每分钟都忽闪忽闪的太引人注意,也很费电。不是解决办法。
后来发现,可能是屏幕厂家在相同型号的屏幕中混用了不同的驱动芯片。下载某些屏幕的历史版本说明书,可以看到驱动芯片可能不同。但是有些屏幕根本查不到厂家和资料。那就只能靠经验猜了,反正测试也方便,本文讲了LUT的移植方式,把几种芯片都测试一遍,总能碰对的。
那我们就正式开始吧!
2、学习资料
既然是屏幕的驱动芯片不同,现在关键问题就是应该如何理解及修改局刷代码中的LUT。
先来学习一下我收藏的三个网页,这三篇文章一定要先看看。因为一些基础的原理,比如墨水屏胶囊的结构,显示不同颜色的原理,本文中没讲。看完了这些文章再看一下SSD1680与SSD1675A的规格书的LUT那一章节。
1、Play with 2.13 inch E-Ink display | 猫·仁波切
2、墨水屏电子标签通过修改lut并多层叠堆实现灰阶_墨水屏 lut-CSDN博客
3、树莓派 java 驱动 微雪 墨水屏 16灰阶 LUT_墨水屏 lut-CSDN博客
4、SSD1680与SSD1675A的规格书,第一次写文章不会上传附件,需自行下载
资料看完了,如果你懂LUT如何设置了,那就不用往下看了,因为你对LUT的理解绝对比我强得多。
本文用到了以上资料及CC2640etg开源代码,如有侵权请联系4782907@qq.com,删除文章。也欢迎大家指正文中的错误。
3、LUT的格式及分区
看完网上的介绍后,再来看驱动芯片规格书,在电脑上看不方便,就打印出来,反复前后对比。但是完全不知道规格书在说什么,感觉规格书里的每一行字都透露出蔑视。对于一个药学专业的人来说简直就是天书。两个月后,我放弃了这个方式,我想是否能将现有代码中的LUT与规格书进行对比,大概了解LUT的原理。
下面讲一下我对LUT的理解。
![图片[1]-通过具体案例介绍墨水屏的LUT、不同驱动芯片间的LUT移植及局刷参数调整-ELink墨水屏电子纸社区-FPGA CPLD-ChipDebug](http://chipdebug.com/wp-content/uploads/2026/03/20260308164045282-71772959245.png)
以这个代码为例,为了方便理解我把这个LUT分为三部分。
第一部分是波形,一般都是5行,前四行分别驱动不同颜色变化的情况,第五行为VCOM电压,这里都可以不调整,只要知道每一列的B、W(白、黑)写入是一样多的,都是一个或者都是两个。还有第一部分的每一个字符代表一个波形ABCD四个时间的电压,这个比较烧脑,后面再讲。
第二部分为循环次数,A、B、C、D分别是第一部分说的电压的持续时间(频率周期的个数)数据为0时跳过。SRAB是AB的小循环次数,RP为前面几个字符的大循环次数,数据为零时循环一次。
第三部分,为参数部分,这些参数可以和LUT一起写入,也可以直接在代码里进行设置。
具体每一个字符可以写入什么内容也放到后面再讲。
4、如何根据规格书编写LUT
![图片[2]-通过具体案例介绍墨水屏的LUT、不同驱动芯片间的LUT移植及局刷参数调整-ELink墨水屏电子纸社区-FPGA CPLD-ChipDebug](http://chipdebug.com/wp-content/uploads/2026/03/20260308164046143-91772959246.png)
上面这张图,黑白红每一个颜色在第一部分占一行,一共5行。每一行12个字符,所以第一部分是5行12列。
浅蓝和白相间的部分在第二部分,每一个颜色占一行,每行7个字符,共12行,可以看到第一部分有多少列,第二部分就有多少行。后面讲运行方式及移植时会讲到这一点。
![图片[3]-通过具体案例介绍墨水屏的LUT、不同驱动芯片间的LUT移植及局刷参数调整-ELink墨水屏电子纸社区-FPGA CPLD-ChipDebug](http://chipdebug.com/wp-content/uploads/2026/03/20260308164047891-21772959247.png)
![图片[4]-通过具体案例介绍墨水屏的LUT、不同驱动芯片间的LUT移植及局刷参数调整-ELink墨水屏电子纸社区-FPGA CPLD-ChipDebug](http://chipdebug.com/wp-content/uploads/2026/03/20260308164048996-101772959248.png)
上面两张图是第三部分的内容,只要按顺序排列在第三部分,分多少行都无所谓,也可以在后面代码部分直接写入这些参数。
5、LUT是如何运行的。
![图片[5]-通过具体案例介绍墨水屏的LUT、不同驱动芯片间的LUT移植及局刷参数调整-ELink墨水屏电子纸社区-FPGA CPLD-ChipDebug](http://chipdebug.com/wp-content/uploads/2026/03/20260308164049940-21772959249.png)
如规格书,看这个图我们会认为LUT从11开始一直运行到0,然后再运行第二部分,那就被这个图带偏了,很难理解这个LUT表了。
![图片[6]-通过具体案例介绍墨水屏的LUT、不同驱动芯片间的LUT移植及局刷参数调整-ELink墨水屏电子纸社区-FPGA CPLD-ChipDebug](http://chipdebug.com/wp-content/uploads/2026/03/20260308164049848-61772959249.png)
它其实是这样的,加载第一部分的1,然后按照第二部分第一行中设置的周期参数运行。然后加载第一部分的2,按照第二部分的第二行中的周期运行,以此类推。
但是第一部分的每一列,同时加载,还是一个一个加载,不太清楚,我认为应该是一个一个加载,因为第一部分每一个字符都代表一个波形的四个阶段。(后面讲)
6、LUT的关键参数部分及如何移植代码。
![图片[7]-通过具体案例介绍墨水屏的LUT、不同驱动芯片间的LUT移植及局刷参数调整-ELink墨水屏电子纸社区-FPGA CPLD-ChipDebug](http://chipdebug.com/wp-content/uploads/2026/03/20260308164050954-01772959250.png)
通过上面介绍可知,SSD1680这个局刷LUT只有红框内的一部分起作用,其它位置只是维持LUT的结构,保证位数不变。
![图片[8]-通过具体案例介绍墨水屏的LUT、不同驱动芯片间的LUT移植及局刷参数调整-ELink墨水屏电子纸社区-FPGA CPLD-ChipDebug](http://chipdebug.com/wp-content/uploads/2026/03/20260308164050497-11772959250.png)
我们再来看一下上图,SSD1675A的规格书。
从规格书中,我们可以看出,SSD1675A的第一部分有5行,每一行7个字符,那么就是5行7列。
第二部分肯定就会是7行,每一行ABCD加上RP一共5个字符。
第三部分不管它,直接写入到后面代码里。
![图片[9]-通过具体案例介绍墨水屏的LUT、不同驱动芯片间的LUT移植及局刷参数调整-ELink墨水屏电子纸社区-FPGA CPLD-ChipDebug](http://chipdebug.com/wp-content/uploads/2026/03/20260308164051129-31772959251.png)
那么我们从SSD1680往SSD1675A移植,只需要删除红框部分,让LUT位数一样。另外SSD1680的循环次数AB后面有一个SRAB,代表AB的小循环,SSD1675A中没有小循环,所以要放到SSD1675A 中的RP位置(第二部分第五列),由于BCD都没有数字,其实最终效果是一样的。
下面就是最终的移植代码。
![图片[10]-通过具体案例介绍墨水屏的LUT、不同驱动芯片间的LUT移植及局刷参数调整-ELink墨水屏电子纸社区-FPGA CPLD-ChipDebug](http://chipdebug.com/wp-content/uploads/2026/03/20260308164051825-81772959251.png)
7、LUT的载入
![图片[11]-通过具体案例介绍墨水屏的LUT、不同驱动芯片间的LUT移植及局刷参数调整-ELink墨水屏电子纸社区-FPGA CPLD-ChipDebug](http://chipdebug.com/wp-content/uploads/2026/03/20260308164051760-91772959251.png)
![图片[12]-通过具体案例介绍墨水屏的LUT、不同驱动芯片间的LUT移植及局刷参数调整-ELink墨水屏电子纸社区-FPGA CPLD-ChipDebug](http://chipdebug.com/wp-content/uploads/2026/03/20260308164052525-51772959252.png)
![图片[13]-通过具体案例介绍墨水屏的LUT、不同驱动芯片间的LUT移植及局刷参数调整-ELink墨水屏电子纸社区-FPGA CPLD-ChipDebug](http://chipdebug.com/wp-content/uploads/2026/03/20260308164052611-101772959252.png)
如上图:规格书中写了一二部分的LUT位数及各部分的驱动命令,加载方式可以参照图二,一二部分共70个字符,通过命令(0x32)一起加载(i<69还是70这个影响不大),第三部分可以直接在命令(如:0x03、0x04)后面写入。也可以参照图三,告诉程序想加载的内容在LUT的第几位。第三部分的参数设置多少需要参考规格书及原程序。
8、为什么第一部分一个字符可以代表一个波形?
![图片[14]-通过具体案例介绍墨水屏的LUT、不同驱动芯片间的LUT移植及局刷参数调整-ELink墨水屏电子纸社区-FPGA CPLD-ChipDebug](http://chipdebug.com/wp-content/uploads/2026/03/20260308164052239-11772959252.png)
上图是1个波形,它分为ABCD4个阶段 ,VSH1、VSH2等代表每个阶段的电压。
![图片[15]-通过具体案例介绍墨水屏的LUT、不同驱动芯片间的LUT移植及局刷参数调整-ELink墨水屏电子纸社区-FPGA CPLD-ChipDebug](http://chipdebug.com/wp-content/uploads/2026/03/20260308164053505-31772959253.png)
规格书里讲到,这四个电压,分别用二进制的00、01、10、11表示。
![图片[16]-通过具体案例介绍墨水屏的LUT、不同驱动芯片间的LUT移植及局刷参数调整-ELink墨水屏电子纸社区-FPGA CPLD-ChipDebug](http://chipdebug.com/wp-content/uploads/2026/03/20260308164054519-01772959254.png)
再来看代码,这里是将一个16进制的数字转换为四个二进制数字,每一个二进制代表一个电压。所以第一部分的每个字符能代表一个波形,真是佩服程序员的脑回路。
所以第一部分的数值不是随意设置的,它一定是四个电压的组合,转换来的字符。比如代码里的B—作用和0X40是一样的。
这里讲一道附加题:为什么这个代码的第二部分只有第一列有数值,它不应该是控制一个波形四个阶段的周期吗?我们看一下B—和W—转换为二级制代码后的后三位是什么,对,后三位都是VSS即0b00,所以这里加不加循环没有意义。
9、LUT的微调
下面放一些微调效果的图片。![图片[17]-通过具体案例介绍墨水屏的LUT、不同驱动芯片间的LUT移植及局刷参数调整-ELink墨水屏电子纸社区-FPGA CPLD-ChipDebug](http://chipdebug.com/wp-content/uploads/2026/03/20260308164054725-91772959254.png)
如上图代码及照片,删掉第二部分第一行,其实影响不大,残影重了一些。
![图片[19]-通过具体案例介绍墨水屏的LUT、不同驱动芯片间的LUT移植及局刷参数调整-ELink墨水屏电子纸社区-FPGA CPLD-ChipDebug](http://chipdebug.com/wp-content/uploads/2026/03/20260308164055564-01772959255.png)
如上图代码及照片,删掉更多的重复次数,残影变严重了。
![图片[21]-通过具体案例介绍墨水屏的LUT、不同驱动芯片间的LUT移植及局刷参数调整-ELink墨水屏电子纸社区-FPGA CPLD-ChipDebug](http://chipdebug.com/wp-content/uploads/2026/03/20260308164056496-21772959256.png)
熟悉了这个LUT,我们甚至可以减少全刷的闪屏次数,把局刷的代码也加进去(第一部分的5-6列及第二部分的5-6行),实现每分钟都轻闪一下更新时间。
10、结束语
希望我的白话版LUT介绍能让更多的爱好者了解墨水屏的LUT,在局刷方面玩儿出新花样。





没有回复内容