TFT液晶显示模组(1)

Hello,大家好,今天我们来讨论当下非常流行的TFT液晶显示模组,它最大的特点是可以显示出效果非常好的彩色信息,绝大多数手机、液晶显示器,液晶电视、MID、MP4等产品都在使用它,你想抗拒它的魅力还真的很难。

我们主要讨论基于ILI9341的TFT液晶显示模组,但在正式讨论之前,还是得先了解一下TFT液晶显示器的彩色产生原理,它是基于大家都熟悉的红(Red)、绿(Green)、蓝(Blue)三原色光混合原理,例如,绿色+红色=黄色,绿色+蓝色=青色,红色+蓝色+绿色=白色,如下图所示:

虽然上图仅显示了7种颜色,但是只要我们能够得到红、绿、蓝三种颜色(原色),然后调节它们的亮度比例,就可以得到你想要的五颜六色,而得到的颜色数量则称为色深(Color Depth

根据各原色的调节级数也可以分为很多颜色模式,比较常用的是三原色各占8位,即每种原色有2的8次方(256)种亮度变化,相应的色深为256*256*256=16777216(俗称16兆彩色),我们称其为RGB888模式。RGB配色通常使用RGB(rr,gg,bb来表示,例如RGB(0xFF, 0x00, 0x00)表示红色,RGB(0xFF, 0xFF, 0xFF)表示白色。在进行C源代码编程时,经常会使用宏来定义一些常用的颜色,部分RGB888颜色如下:

当然,并不是所有场合都需要这么多颜色,RGB565与RGB666模式也很常用(其它还有RGB332、RGB555等等),相应的色深分别为32*64*32=65536(65千色)及64*64*64=262144(262千色)。RGB666模式部分常用颜色的宏定义如下图所示:

现在的问题是:怎么产生三原色呢?看下图吧

教堂彩色玻璃上绘有各种人物图案,每一幅都是一个宗教故事,一些教会本地的传说也会作为主题出现,以这种方式向民众宣传教义,也成就了它的艺术……这位同学你干嘛呢?在座的其它同学可都是有志于献身电子技术领域,并以“为社会谋求福祉”的目标而奋斗着,你要是喜欢讲故事瞎扯淡就赶紧学厨师当个裁缝比较好一些….等等,我还没说完(摔门的声音响起来了)。

呵呵!宗教那啥的我不太懂,只知道上图已经告诉我们如何产生三原色,那就是:使用一个红、绿、蓝色的薄膜对光源进行过滤就可以了。TFT液晶显示模组中总会有一个白光源(CCFL或LED,此处不赘述,具体原理及相应的驱动电路请参考《显示器件应用精粹》(以下简称“显示器件”)与一片彩色滤光膜。假设TFT屏当前正显示纯白的画面,你用放大镜去观察,会发现有屏上有很多红、绿、蓝的方块,如下图那样:

我们把每一个点称为子像素(SubPixel),三个子像素组成一个显示像素。对于分辨率为240列320行的TFT屏,它需要240*3=720个列驱动(320个行驱动)引脚。每个显示像素都会对应驱动芯片中显存(Graphics RAM, GRAM)里的一个地址,分辨率为240*320的TFT屏对应的GRAM地址应该有240*320=76800个,具体容量为多少则取决于芯片支持的RGB模式。例如,ILI9341有720列320行驱动输出,支持RGB565与RGB666模式,按最大位数(18位)来计算,相应的GRAM容量大小应该为240*320*18=138240bits(位)=172800bytes(字节),数据手册标记的特点如下图所示:

我们使用VisualCom软件平台中 “基于ILI9341的320X240的TFT液晶显示模组”来仿真一下,相应的效果如下图所示。

ILI9341的指令比较多,英文数据手册超过200页,涉及的寄存器数量也非常庞大,VisualCom软件平台按功能相近的原则将其划分为多个类别。由于这是我们第一次接触TFT液晶显示模组,所以先给大家演示如何以最少的指令点亮TFT屏,后续文章会按类别详细讨论其它指令功能。

首先我们先注意“属性”窗口的“高级”组合框中有三个选项,其一为起始页。“页”就是行,它与“列”是对GRAM地址的定位方式。ILI9341的GRAM共划分为320页,每页240列。在“单步运行”仿真模式下,“内存窗口”可以实时观察GRAM空间的显示数据,但是由于320页的数据量太过庞大,为避免加载时间过慢(不影响单步运行时数据的刷新时间,只是当重新打开另一个文件或更换器件时,VisualCom软件平台需要对当前工程的内存与寄存器数据进行清理的时间比较长),我们限制一次性只能加载8页内存(通常也不需要全部载入),你所需要做的就是指定起页始。上图指定的起始页为32,所以加载的内存页为32~39页。当然,在单步运行时,你可以随时更改起始页,内存窗口会在下一步运行时进行相应的刷新

假设现在要求显示一张图片,怎么办?由于ILI9341的GRAM空间太大,如果仍然按以往的方式(预置数据)来写满GRAM,需要预置的数据至少为76800条,恐怕根本不会有人会这么做,即便像ST7920、KS0108B那样相对小一点的“黑白”点阵LCD驱动芯片,通过预置数据来连续写入显存的方式也并不讨好。VisualCom软件平台当然不会只提供半套解决方案,它允许你指定一个.BMP图像文件对GRAM进行初始化,当你运行仿真之后,首先会使用指定的图片初始化ILI9341的GRAM,爽歪歪!

前面已经提过,ILI9341支持RGB565与RGB666两种像素格式。从“高级”属性中选择一种后,你刚才指定的图片会以相应像素格式写入到GRAM中。需要注意的是:属性窗口里的“像素格式”只是用来控制图片初始化到GRAM的显示数据,而不是用来设置ILI9341状态的(需要指令,后述)

好的,现在咱们来看看需要哪些指令才能让屏幕有所显示呢?相应的预置数据如下图所示:

乖乖,我们只预置了两条指令,它首先退出了睡眠模式,然后打开了显示。我们来看看数据手册中复位后的状态,如下图所示:

整个表格中,只有“睡眠(Sleep”与“显示(Display”两项影响屏幕的显示,ILI9341上电复位后默认处于睡眠模式(Sleep In),并且显示也是关闭的(Off)。“空闲(Idle)”模式下是可以显示的,只不过显示的颜色比较少(后述),更何况还并不在空闲模式下(Idle Off)。(其它是一些地址设置或读寄存器等等,咱们暂时忽略)

睡眠模式是个虾米东东呢?不知道,还是翻翻数据手册吧!其中有一条“进入睡眠模式”指令,如下图所示:

哦!原来睡眠模式主要是为了省电,此时内部电荷泵升压(Pump DC/DC Converter)电路(有关硬件电路原理请参考《显示器件》)、系统振荡器都会关闭(但是已经写入到GRAM的数据仍然保持不变),那这个屏幕还显示个毛线,所以执行“退出睡眠模式”指令是让屏幕能够显示GRAM数据前必须要做的一步。我们再来看看相应的指令,如下图所示:

可以看到,“退出睡眠”指令为0x11,这也是我们预置的第一条指令,接下来使用“打开显示”指令0x29,咱们指定的初始化图片就显示出来了。在VisualCom软件的“寄存器窗口”中,SLEEPDISPLAY位分别代表相应的模式(0为关闭,1为开启)。

值得一提的是:ILI9341仿真模型还添加了预置数据处理状态,在“输出”窗口的信息栏中可以显示当前预置数据的解析状态。例如,我在前述预置数据后再添加一条指令(0x14)与两条任意数据,如下图所示:

由于ILI9341不存在0x14对应的指令,所以信息栏中会显示相应指令为无效。同样,后面跟随的多个数据也是无效的,这样的实时信息反馈能够进一步帮助使用者应证自己对芯片指令作用的理解(如果指令解析结果不是你需要的,肯定哪里出错了,而不像以往那样只能看屏幕、内存、寄存器窗口),相应的效果如下图所示。

那如何往指定的GRAM地址写入指定的显示数据呢?这与以往ST7920、KS0108B之类的驱动芯片还有点不太一样,我们下一期再会吧!

(0)

相关推荐