本帖最后由 大明狐 于 2024-9-27 17:47 编辑
经常有使用TFT显示屏的朋友问,关于相同的颜色值,在一块屏幕上显示正常,而换到另一块屏幕上就不正常的问题。
常见的原因大概有三种:
1、屏幕内的颜色数据的顺序
2、发送颜色数据的顺序
3、屏幕的种类
=============================================
分析原因之前,先简单说一下TFT彩屏的颜色数据格式。
在图片取模工具里,给TFT取模的【输出格式】,通常选择的是【16位彩色-565】
因为TFT彩屏的每个像素点,都是由红Red、绿Green、蓝Blue三种颜色亮点组成的,
这个格式里的565,分别代表了每种颜色的数据位数。
其中,
红色R是由五位数(00000~11111)表示;
绿色G是由六位数(000000~111111)表示;
蓝色B也是由五位数(00000~11111)表示。
这三个数值,按照R-G-B的顺序排列,就构成了表示颜色的16位数据。
RRRRRGGGGGGBBBBB
接下来就可以分析,一开始提到的颜色显示不正确的问题了。
==============================================
1、屏幕内的颜色数据的顺序
比如上图里的两块屏幕,左边是1.44吋的128×128的TFT,右边是1.8吋的128×160的TFT。
这两块屏幕使用的控制芯片,都是ST7735S,转接板上的结构也都相同。
相同的程序,显示的画面却是不一样的。
这种原因比较常见,因为屏幕规格不同,RGB三个颜色的顺序会有不同。
现在从左到右分别用
1111100000000000 (0xF800)
0000011111100000 (0x07E0)
0000000000011111 (0x001F)
三个纯色来显示三个图案
↑↑↑↑↑↑↑↑↑↑
可以看到如果用1.44吋屏幕的程序显示,
则左边屏幕显示出了设定的颜色,
而右边的屏幕显示的顺序,却是R和B是相反的
也就是相同的颜色值,对屏幕来说,顺序是
1111100000000000 (0xF800)
0000011111100000 (0x07E0)
0000000000011111 (0x001F)
可以换成用1.8吋屏幕的程序,则两块屏幕的显示结果正好相反。
※解决方法:
(1)如果使用的是TFT驱动库,里面包含了常见的各种屏幕的驱动,通过选择合适的型号的驱动,来显示正确的颜色;
(2)如果是写代码的驱动,可以针对不同型号的屏幕,修改颜色值里三组数据的读取顺序;
(3)在常见的彩屏控制芯片,比如ST7735里,内置的5-6-5数据格式只有 R-G-B 和 B-G-R 两种模式,通过控制指令可以在两个模式之间进行切换。
(4)在常用的图片取模工具Image2Lcd里,有一个功能是可以自由定义RGB三种颜色的顺序,然后再进行取模。
不论RGB三种颜色谁先谁后,都是按照最终的顺序进行5-6-5格式的对每个像素点的颜色进行提取。
=================================================================
2、发送颜色数据的顺序
因为常用的TFT彩屏的驱动程序,在向屏幕发送16位的颜色数据的时候,
通常都是分成两个8位数据,先发送高8位,再发送低8位
RRRRRGGG - GGGBBBBB
(高8位) (低8位)
- TFT_Send_Data8 ( COLOR >>8 );
- TFT_Send_Data8 ( COLOR );
复制代码
比如要显示一个偏红一些的黄色,颜色值是
11111111 00000000 (0xFF, 0x00)
发送数据的时候,就是先发送一个0xFF,再发送一个0x00。
而在写发送程序的时候,有时候会因为疏忽,搞反了高低位的先后顺序。
如果顺序弄反了,就变成了稍微有些亮的蓝色
00000000 11111111 (0x00, 0xFF)
※解决方法:
(1)将发送颜色数据的程序代码改回正确的顺序;
(2)在STC的图片取模工具里,有一个【存储顺序】选项,默认是【高位在前】,
选择【低位在前】也可以解决数据顺序错位的问题(总感觉这样心里不太踏实)
=================================================================
3、屏幕的种类不同
TFT是常用的一种RGB彩屏,但是在市面上,还有另外一种屏幕IPS屏,控制芯片是ST7789,属于一种TFT的增强版。
因为色彩、分辨率等等好多种优势,用IPS屏幕的也非常多,而且似乎越来越多。
IPS和TFT的驱动方式基本是一样,最大区别是颜色数值的每一位都是相反的。
比如屏幕接收到一个颜色数据0xFFFF,TFT屏会显示出白色,而IPS屏则正好相反,会显示出黑色。
要让IPS屏显示白色,就需要给0xFFFF按位取反,变成0x0000才能正确显示。
比如在TFT上,分别用红绿黄蓝四种颜色,显示“红绿黄蓝”四个字,
相同的色值,用在IPS屏上,就变成了十分阴间的颜色
复制代码
在显示函数前面,添加一行给颜色值的变量按位取反的语句之后,显示的颜色就正常了
假如程序代码允许修改,考虑到通用性,这种是比较好的解决方法。
但是如果显示程序不方便修改,可以考虑另一种解决方法,
就是在取模工具里,选择【反色】,也可以得到“正确”的显示颜色值
====================================================
|