想象一下,屏幕的后面有一个电子枪,电子枪位于某个像素的背后,然后向这个像素发射红绿蓝三原色,从而就可以组成任意一种颜色。简单的说,电子枪在像素的背后一边移动,一边向像素发射红绿蓝。

如果要编写出LCD的驱动程序,首先要搞清楚下面的几个问题:

1)电子枪如何移动

2)颜色如何确定

3)电子枪如何得知应该跳到下一行

4)电子枪跳到最下面一行的最后一个像素时,如何得知应该跳到原点

5)RGB线上的数据从什么地方获取

回答第5个问题,首先要明确framebuffer是什么东西?

在内存中划出一块区域,这块区域就称为framebuffer.

在framebuffer中的这些数据,显然是写程序的人想要显示的,由程序员构造。

framebuffer中的这些值,最终会被LCD控制器读出来,然后通过RGB三组线,传给电子枪,电子枪要把它转换为红绿蓝三种颜色,打到像素上面去。右面屏中的每个像素在framebuffer中都有对应的存储空间,里面存有这个像素的颜色。

2、分析lcd的时序图

clk:电子枪在clk的下降沿(对于其它型号的lcd,有可能是上升沿)从数据线上得到数据,然后发射到像素上,最后移动到下一个像素。

数据线上的数据其实就是从framebuffer中获得的数据。

一行有多少像素,假设是x。

——————————————————————————————————————————————-

当电子枪打完一行中的最后一个像素时,再经过多长时间会收到行同步信号呢?在该图中取为thf.

当电子枪打完一行中的最后一个像素时,会收到一个行同步信号HSYNC,如果这个行同步信号的脉冲很小,电子枪根本反应不过来,因此脉冲宽度不能太小,在该图中取为thp。

电子枪收到行同步信号后,就会从最右边移动到最左边,移动过程也不会瞬间完成,需要一定的时间,在该图中取为thb.

 ——————————————————————————————————————————————–

 当显示完所有的行后,再经过多长时间会收到垂直同步信号呢?在该图中取为tvf.

当显示完所有的行后,电子枪会收到一个垂直同步信号VSYNC,如果这个垂直同步信号的脉冲很小,电子枪根本反应不过来,因此脉冲宽度不能太小,在该图中取为tvp。

电子枪收到垂直同步信号后,就会从最下边移动到原点,移动过程也不会瞬间完成,需要一定的时间,在该图中取为tvb.

———————————————————————————————————————————————-

3、这些时间参数如何影响屏幕上的图像位置呢?(和第2部分的参数名字不一样,但意义是一样的)

4、每个像素在framebuffer中占据多少位,用bpp表示。bit per  pixel

硬件上LCD的bpp是确定的,比如说看该款LCD,有24条数据线。即每个像素可以用24bit来表示。

是不是有多少条数据线,我就得用多少条呢?这是不一定的。

比如说

R0~R7,我只用5条,其他接地

G0~G7,我只用6条,其他接地

B0~B7,我只用5条,其他接地

总共需要5+6+5=16条线,即每个像素占据16位的数据

总结一下:如何进行lcd编程?

1)需要看LCD的芯片手册,确定时间参数,确定分辨率,确定引脚极性。根据这些信息来设置lcd控制器,使它可以发出正确的信号。

2)在内存中分配一个framebuffer,这个framebuffer里面,每个像素占据若干位。分配好framebuffer后,把首地址告诉lcd控制器。以后lcd控制器就可以周而复始的从framebuffer中取出每个数据,然后配合其他信号,把像素的数据发给电子枪,让电子枪显示出来。

3)设置好lcd控制器后,写程序时,只需要把数据填到framebuffer中就可以了,硬件上会自动的把这些数据在lcd上显示出来。

版权声明:本文为-glb原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/-glb/p/11331632.html