您的位置:首页 > 其它

深入理解LCD之基本特性

2018-12-13 19:50 260 查看
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mxgsgtc/article/details/72835685
  • 前言
    这篇主要介绍一下LCD的基本特性, 所选LCD液晶屏信息:
    大小: 4.3寸液晶屏(TFT)
    型号: AT043TN24
  • 显示原理
    1.颜色规则
    大家知道,自然界中多姿多彩颜色都是由原色红(R),绿(G),蓝(B)三种颜色不同的比例混合而成, 比如RGB=1:1:1,那么最后呈现出来的光颜色就是白色, 我们所看到LCD显示的图像,是由一个一个像素点组成, 对于每一个像素点, 都是由三种原色混合而成, 混合的比例不同,颜色就不同,那么,如何确定像素点RGB的比例呢? 顺其自然出现了颜色的工业标准->RGB888,
    RGB888,也叫RGB24,即用3个字节来表示颜色的深度, 第一个字节用来表示红色的深度等级, 第二个字节用来表示绿色的深度等级,第三个字节用来表示蓝色的深度等级,相应字节的数值越高,颜色就越深,即一共可以表示的颜色总数= 256(红) x 256(绿)x256(蓝), 我们可以从下图中看到不同颜色对应不同的2进制

    如上图显示, 黄色对应的二进制为 FFFF00, 即FF(红色最深等级), FF(绿最深等级), 00(蓝最浅等级), 其余颜色同理, 但是又有个问题出现了,就是RBG24标准不能适应实际应用中的所有情况,比如某些LCD屏就不支持这种高清的色彩,所以必须要在原有RGB24的基础上进行色彩阉割(压缩),就出现了RGB565标准(2个字节表示一个像素点, 高5位红, 中6位绿, 低5位蓝) , 比如我们所用的LCD,就只支持RGB565,对照上面RGB颜色表(RGB888), 我们如何进行颜色的转换(压缩呢)? 即RGB888–>RGB565, 如下图(以黄颜色为例)

    上图中, 对于支持RGB565显示格式的TFT液晶屏来讲,黄色的表示即 0xFFE0, 当然,这个效果肯定没有24位真彩的好.
    2.显示方式
    图像的显示方式分为单色显示和彩色显示.
    ->单色显示时, 一个像素点只有黑白两种颜色, 因此使用一个2进制位表示即可, 0表示黑色, 1表示白色, 也就是所谓的1BPP(Bit Per Pixel, 像素/位).
    ->彩色显示时,有多个彩色模式,常见的是256色显示模式,即每个像素使用8个2进制位表示不同的颜色等级,即所谓的8BPP.
    我们以16BPP为例(增强色图像),即一个像素由16个2进制组成, 显示方式为5:6:5(即上面我们讨论的RGB565标准), 我们所用的TFT屏的规格为: 480×272(即屏一行的像素点为480个, 一共有272行)

    市面上LCD屏的种类繁多,这里以最常用的TFT屏为例进行讲解 ,要使一块LCD正常的显示文字或图像,不仅需要LCD驱动器,而且还需要相应的LCD控制器。在通常情况下,生产厂商把LCD驱动器会以COF/COG的形式与LCD玻璃基板制作在一起,而LCD控制器则是由外部的电路来实现,现在很多的MCU内部都集成了LCD控制器, 通过LCD控制器就可以产生LCD驱动器所需要的控制信号来控制TFT屏了
    arm9中LCD屏的输出方式有三种方式:
    1.通过frame buffer显示(最典型的方式)

    上图中可以看到,我们需要在内存里面申请一块内存(此内存被称为frame buffer),之后各种配置LCD控制器,配置显示模式为16PP, 显示模式为5:6:5, 把frame buffer的首地址告诉控制器, 那么控制器就会从frame buffer获取像素值,根据像素的不同值将不同颜色打向LCD屏幕(LCD控制器类似于电子枪, 向玻璃板发不同的光,LCD控制器内部有个DMA通道)对于frameBuffer来讲,每个值对应LCD屏幕的一个像素,如上图,LCD屏分辨率为(480*272),我们可以定义一个数组a[272][480]大小的数组,并把数组首地址告诉LCD控制器, 那么数组每一项对应LCD屏的一个像素, 比如a[0][0]赋值为0xFFE0,对应LCD屏幕的第一个像素显示为黄色
    2.通过临时调色板显示

    这里要解释几点:
    2.1什么叫临时调色板
    我们根据2440用户手册的一句话:this register value will be video data at next frame.(在下一帧显示寄存器的值, tips:一帧就一个图像)
    可知:临时调色板是一个寄存器,我们向此寄存器写入颜色,那么LCD屏幕下一次显示图像就会是此寄存器中记录的颜色, 即起到了刷屏的作用(整个屏幕都是一个颜色)
    2.2什么时候起作用以及用途
    当使能此寄存器时, 临时调色板起作用, 这时之前配置的功能(如:通过frame buffer显示)就会无效, 因为使能,LCD屏幕会被迅速刷屏,达到了快速刷屏的目的(不需要通过SDRAM中向frameBuffer中所有元素赋值同一个值来实现刷屏 tips:使用SDRAM,本来就慢),如果要恢复之前的配置功能, 即disable临时调色板功能即可

    3.通过调色板显示

    上图中, 调色板在控制器内部(注意区别临时调色板)是一块儿内存,首地址为0x4D00400, 一共有256个2字节大小(每两个字节表示一个颜色), 上图中,通过配置寄存器告诉LCD控制器调色板的显示格式为RGB565,之后需要手动将此调色板赋值,比如图00H的位置赋值为”黄色”,之后对于framebuffer来讲,其中的每一项代表一个调色板中的索引, 比如frameBuffer的第一项的值为0,则硬件就会自动找调色板中的第一项值, 即将0xFFE0输出, LCD第一个像素点显示黄色
    还有一个问题,如何使能调色板功能呢? 我们上面介绍”通过frame buffer显示”中提到,配置寄存器显示模式为16BPP,显示方式是5:6:5,那么控制器就会认为frame buffer中的每一个元素代表的就是颜色的值,并且显示方式是5:6:5, 但是如果我们配置显示模式为8BPP,显示方式是5:6:5, LCD控制器就自动认为用的调色板模式,且调色板中颜色的显示方式为(5:6:5)(这里的8Bpp,代表frame buffer中的每个元素都是8位2进制表示,每个元素的值是调色板中的索引值),那么调色板的应用场合是什么样呢?我们引用网上的一个说明(稍微修改下):
  • 在笔者开发LCD,其显示分辨率设置为640×480。如果色深设置为16 bpp,在系统使用时,画面将会出现明显的抖动、不连贯,这是由于芯片的运算负荷过重造成的。如果按本文中提到的调色板方法,即采用8位色深显示,颜色的选取可以满足需要,画面的显示将明显稳定。这说明,在显示分辨率较高,色彩种类要求比较简单的嵌入式应用中,调色板技术是一个非常值得重视的选择

    • 时序控制浅析
      我们除了配置一些寄存器告诉LCD控制器图像中像素的格式(RGB565),frameBuffer的首地址之类外,对于TFT LCD的访问还需要用到一些信号,所以需要通过配置寄存器来告诉LCD控制器这些信号的信息(比如何时发出控制信号,发出信号的持续时间等),举个例子: 向LCD驱动器发送图片数据时需要时钟控制(VCLK),一个时钟发送一个像素点,那么控制器就需要主动发出时钟信号,这个时钟是由哪个引脚发出的,发出的频率是多少,这个都是要配置寄存器的, 我们通过时序图来分析需要用到的一些信号以及如何去配置它们,如果是第一次了解LCD控制,直接看时序还是比较困难的,所以先给出一个形象的比喻

      上图中LD驱动器可以比喻成电子枪,LCD控制器就是控制这个电子枪的,它从显示缓存中拿像素数据传给电子枪并发送命令让电子枪发射像素颜色, 上图中,成像过程
      1.LCD控制器发出VSYNC信号,告诉电子枪,要发出一张新帧了,然后电子枪把枪头调转到LCD屏幕的左上角准备开始发射像素
      2.发出VSYNC信号的同时,发出HSYNC信号(告诉电子枪新行开始, 从左向右动发射子弹吧)但是电子枪毕竟反应比较慢,过了少许开始发射子弹
      对于上面两个过程,由于电子枪接受了VSYNC信号,调转枪头后,需要反应一段时间才能正常开始工作, 所以就白白扫射了几行的无效数据,相当于经过了几个HSYNC信号周期的时间, 一个HSYNC周期就是电子枪扫射一行的时间(从HSYNC信号开始扫射第一行直到到一行结束扫射结束所用时间),就出现了上方无效区
      3.当第一行结束时,LCD控制器又发出HSYNC信号, 电子枪枪头扭转到下一行新行开始发射数据, 但是枪头扭转的比较慢, 所以出现了左右的无效区(即第一行结束后,电子枪由于硬件原因要反应一段时间, 所以在右边出现了无效数据区, 调转枪头后, 也得反应一段时间开始发射子弹,所以出现了左边的无效区),有人会问电子枪如何知道第一行何时结束(其实是我们通过寄存器告诉LCD控制器第一行有多少个数据的,我们的屏幕分辨率是480*272, 即这个信息会设置到寄存器里), 当一行结束时,LCD控制器就不会再发有效像素数据,并且等待电子枪游离一段时间,之后再发下一行的HSYNC信号.
      4.loop第三个过程
      5.当扫描到最后一行结束时(一帧即将结束),LCD控制器就不会再发有效像素数据,并且等待电子枪游离一段时间,所以会继续往下扫描,出现了下方的无效区, 之后再发下一行的VSYNC信号, 之后回到过程1开始重复
    • 时序图

      上图中的时序图,分为两个部分,上面部分是一帧的时序图,下面部分是一行的时序图我们分析下时序图中每个参数的意义(上图中的①->⑩)
      1.对应于上述的过程1,2, VSYNC信号(代表一帧的开始)需要持续一段时间②(VSPW+1), 电子枪认为收到了VSYNC信号(即白扫射了VSPW+1行,也可以说白扫射了(VSPW+1)个HSYNC周期时间),收到信号后,还要继续持续时间③(VBPD+1), LCD控制器才开始发送有效数据, 从而电子枪发射有效像素, 即(② + ③)为LCD屏幕上边的无效区, 对于①参数, 这是手册上的数据, 即告我们默认LCD控制器发送HSYNC信号为高电平,但实际LCD接受HSYNC硬件上有可能设计成低电平有效, 所以可以对寄存器进行修改, 让LCD控制器发出HSYNC控制信号为低电平
      tips: VSPW VBPD参数会根据datasheet来具体设置(下文会提到), 设置这些参数的目的是告诉LCD控制器电子枪的反应时间以便发送帧数据(比如电子枪, 发送HSYNC后, 得知道电子枪的反应时间后才开始传送有效数据)
      2.④为, 即有效数据为(LINEVAL+1)行,我们分辨率为480*272,所以LINEVAL为271
      3.⑤VFPD+1参数对应于过程5, 当扫描到最后一行结束时(即一帧结束了),LCD控制器不会再发送有效像素数据, 此时电子枪会收游离一段时间(会继续往下白扫好几行(VFPD+1行)无效数据), 这个时间需要告诉LCD控制器,以便控制器知道等待多长时间在发送VSYNC信号,从而进行下一帧的开始
      4.对于⑥、⑦、⑧、⑩三个参数,对应于上述过程3, 接受到HSYNC信号(表示一行的开始)后,此信号必须持续一段时间⑦(HSPW+1个VCLK周期)后, 电子枪才认为信号有效,接受到HSYNC信号后,电子枪还要反应一段时间⑧(白白扫射HBPD+1个VCLK周期后,也可以说发射HBPD+1个无效像素点)后, LCD控制器才开始传送有效数据给电子枪, 当一行扫描结束后,即LCD控制器不发射有效数据了,此时电子枪要游离一段时间⑩(HFPB+1), 这段时间需要告诉LCD控制器,以便让LCD控制器等待此段时间后在发送HSYNC信号从而进行下一行的扫描, 对于⑨参数来说, 分辨率为480*272,所以HOZVAL = 479, 即一行有480个有效数据, 注意有效数据的开始时机, 即需要经历(⑦、⑧)时间后,LCD控制器才开始发送有效数据
      对于上面的参数解释应该很详细了,下面讲一下如何确定这些参数, 即VSPW,VBPD,VFPD,HSPW,HBPD,HFPD这几个参数,就要读一下LCD的datasheet了
    • 根据LCDdatasheet确认上述参数的值, 下图为AT043TN24数据手册的时序图, 我们很容易对应上面2440手册中LCD的时序图中的参数

      上图中已经标注对应关系,就不细说了,强调一点, VSYNC与HSYNC信号都是低电平有效,但是2440手册中LCD时序是高电平有效,所以在配置寄存器时需要注意,要将这两个VSYNC,HSYNC信号设置成低电平有效(极性反转: 默认为高电平,反转后为低电平)
      之后我们从datasheet中找到参数值

      我们可以看到,上图中左边是具体的参数值,Min(最小值), Typ.(典型值), Max(最大值),我们举个例子,在右图中,我们知道关系 VSPW+1 = tvp, 我们在左图中发现tvp的典型值为10, 单位是H(Hsync), 所以VSPW+1 = 10==> VSPW=9, 其余参数的取值都能通过上述方法确定, 还有个问题,VSPW, VSPD,VFBD的时间都依赖于HSYNC周期时间,那么HSYNC周期时间如何确认呢? 查看了下寄存器的设置中好像也没找到相关设置,最后在2440手册中找到这句话

      其实意思就是说 LCD控制器会根据电子枪发射像素点的个数来确认HSYNC时间的,比如我们LCD屏幕分辨率是480*272, 当发出VSYNC信号后,要经过VSPW+1反应时间,即VSPW+1个HSYNC周期,我们假设VSPW+1的值为10,那么就是10个HSYNC周期,也就是电子枪扫描了10 x 480个像素点后,LCD控制器就认为经历了10个HSYNC周期时间
      到此,基本特性就介绍完了
    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: