主要介绍LCD显示的基本原理,涉及像素、分辨率、颜色模型、RGB888等格式、Framebuffer、8080接口、RGB接口。
参考资料:嵌入式驱动入门之LCD-1.基础原理(颜色格式、FB、8080/RGB接口)
1.LCD显示出图片的基本原理
LCD作为显示器,它的显示原理和图片是一样的。
图片可以看作由一个一个点(即像素pixel)组成。每行有xres个像素,有yres行,则这个图片的分辨率(resolution)是:xres * yres。
同理,LCD屏幕也是由一个个像素点组成,若要显示一张相同分辨率的图片即把LCD上和图片对应位置的像素修改成同样的颜色。
我们现在的目标变成了修改LCD上一个点的颜色。怎么表示颜色?肯定是发数据给LCD,所以问题变成数据和颜色之间是什么关系?
2.颜色基本知识
颜色有很多颜色模型,这方面我不是专业的,但是只需要知道,颜色模型相当于用不同的格式来描述一个颜色。常见的有RGB、YUV、HSV、HSI等。最常用的为RGB,我们从RGB入手。
RGB模型用红绿蓝三原色来描述一个颜色,所有颜色都是红绿蓝混合而成。
所以你可以认为一个像素点上包含了RGB三种数据。三个数据合一即一个像素点上的数据。这个数据是多少位的?这就出现了一个概念:bpp(bits per pixel),每个像素用多少位来表示。
可以用24位数据来表示红绿蓝,也可以用16位(还有其他),比如:
24bpp:RGB888实际上会用到32位,其中8位未使用,其余24位中分别用8位表示红(R)、绿(G)、蓝(B)
16bpp:有RGB565,RGB555
-
-
RGB565:用5位表示红、6位表示绿、5位表示蓝
-
RGB555:16位数据中用5位表示红、5位表示绿、5位表示蓝,浪费一位
-
现在知道了数据和颜色之间的关系,数据如何到像素上?
3.Framebuffer和LCD控制器
前面已知,让LCD显示图片,就是修改LCD上的每一个像素。全部LCD像素数据合起来存储的地方(也不一定是全部,总之就是存储了数据)叫做Framebuffer,frame为帧,一幅图片可叫做一帧,buffer为缓存。
LCD控制器(LCD Controller)从Framebuffer中取出数据,修改LCD。
所以要驱动LCD有一个工作就是设置LCD控制器。先不讲怎么设置,假设我们会设置了。
4.两大类LCD
Framebuffer可以在LCD内,也可以在外部,这就使得LCD分成了两大类。
一类适用于性能弱的单片机如stm32f1、51,称为LCD模组(LCM):
它集成了Framebuffer,LCD控制器,LCD屏幕
一类适用于性能强的MPU\SOC如S3C2440、IMX6ULL,它只有LCD屏幕,LCD控制器在SOC内,Framebuffer可能是外接的内存。
显然,构造不一样,LCD和芯片之间接口肯定不一样,LCM和单片机通信的接口一般为8080接口。LCD屏幕和SOC通信的接口一般为RGB接口
5.LCD接口
介绍两种常用的接口
5.18080接口
对于LCM的接口8080非常简单,就和内存差不多。
需要读数据,所以有一个读信号RD;
需要写数据,所以有一个写信号WR;
需要分辨这个模组和其他东西,所以有一个片选信号CS;
需要传输数据,需要数据线DB0-DB15,
需要分辨传输的地址,所以需要地址线,但是地址线和数据线共用,通过RS信号来分辨DB0-DB15上传输的是地址还是数据。
5.2RGB接口
RGB接口即LCD控制器和LCD屏幕之间的接口。可以把原理认为是LCD控制器去一个一个修改像素。
修改了一个像素后需要知道什么时候切换下一个像素,所以有点时钟信号DCLK;
需要知道什么时候改完了一行像素(因为要到下一行去),所以有水平方向同步信号HSYNC(Horizontal Synchronization);
需要知道什么时候全部改完(因为改完要回到第一个位置),所以有垂直方向同步信号VSYNC(Vertical Synchronization);
需要有数据,所以有RGB三组线;
在切换的时候(切换到下一行,切换到首位置)时数据无效,所有需要数据使能信号DE。
看似比较复杂,其实也就是设置LCD控制器。
到这我们就明白了,无论是哪一类的LCD,我们需要做的工作是,设置LCD控制器,准备数据。根据不同LCD有不同的驱动方式和数据格式,得根据LCD的手册来确定,在今后的文章中将给出具体例子。
最后附上所有知识点思维导图
更多内容与 参考资料:嵌入式驱动入门之LCD-1.基础原理(颜色格式、FB、8080/RGB接口)