第017课 LCD原理详解及裸机程序分析

2020-03-24来源: eefocus关键字:LCD  原理详解  裸机程序

第001节_LCD硬件原理

先简单介绍下LCD的操作原理。 

如下图的LCD示意图,里面的每个点就是一个像素点。 

这里写图片描述

想象有一个电子枪,一边移动,一边发出各种颜色的光。这里有很多细节问题,我们一个一个的梳理。


电子枪是如何移动的? 

答:有一条CLK时钟线与LCD相连,每发出一次CLK(高低电平),电子枪就移动一个像素。

颜色如何确定? 

答:由连接LCD的三组线:R(Red)、G(Green)、B(Blue)确定。

电子枪如何得知应跳到下一行? 

答:有一条HSYNC信号线与LCD相连,每发出一次脉冲(高低电平),电子枪就跳到下一行。

电子枪如何得知应跳到原点? 

答:有一条VSYNC信号线与LCD相连,每发出一次脉冲(高低电平),电子枪就跳到原点。

RGB线上的数据从何而来? 

答:内存里面划分一块显存(FrameBuffer),里面存放了要显示的数据,LCD控制器从里面将数据读出来,通过RGB三组线传给电子枪,电子枪再依次打到显示屏上。

前面的信号由谁发给LCD? 

答:有S3C2440里面的LCD控制器来控制发出信号。

通过JZ2440原理图对上面进行验证,下图的LCD控制器接口图。 

这里写图片描述

①是时钟信号,每来一个CLK,电子枪就移动一个像素;


②是用来传输颜色数据;


③是垂直方向同步信号,FRAME(帧);


④是水平方向同步信号,LINE(行);


再来看看LCD的芯片手册。 

这里写图片描述

先是VLED+、VLED-背光灯电源。VDD、VDD是LCD电源。


R0-R7、G0-G7、B0-B7是红绿蓝颜色信号。


PCLK是像素时钟信号。DISP是像素开关。


HSYNC、VSYNC分别是水平方向、垂直方向信号。


DE数据使能。X1、Y1、X2、Y2是触摸屏信号。


可以看出LCD有很多信号,这些信号要根据时序图传输才能正确显示。参考JZ2440_4.3寸LCD手册_AT043TN24的时序如下: 

这里写图片描述

从最小的像素开始分析,电子枪每次在CLK下降沿(本开发板是下降沿)从数据线Dn0-Dn7上得到数据,发射到显示屏上,然后移动到下一个位置。Dn0-Dn7上的数据来源就是前面介绍的FrameBuffer。就这样从一行的最左边,一直移动到一行的最右边,完成了一行的显示,假设为x。


当打完一行的最后一个数据后,就会收到Hsync行同步信号,根据时序图,一个Hsync周期可以大致分为五部分组成:thp、thb、1/tc、thd、thf。thp称为脉冲宽度,这个时间不能太短,太短电子枪可能识别不到。电子枪正确识别到thp后,会从最右端移动最左端,这个移动的时间就是thb,称之为移动时间。thf表示显示完最右像素,再过多久Hsync才来。


同理,当电子枪一行一行的从上面移动到最下面时,Vsync垂直同步信号就让电子枪移动回最上边。Vsync中的tvp是脉冲宽度,tvb是移动时间,tvf表示显示完最下一行像素,再过多久Vsync才来。 

假设一共有y行,则LCD的分辨率就是x*y。


关于显示原理,可以参考这篇博客:http://www.cnblogs.com/shangdawei/p/4760933.html


里面有一个LCD显示配置示意图如下: 

这里写图片描述

当发出一个HSYNC信号后,电子枪就会从最右边花费HBP时长移动到最左边,等到了最右边后,等待HFP时长HSYNC信号才回来。因此,HBP和HFP分别决定了左边和右边的黑框。


同理,当发出一个VSYNC信号后,电子枪就会从最下边花费VBP时长移动到最上边,等到了最下边后,等待VFP时长VSYNC信号才回来。因此,VBP和VFP分别决定了上边和下边的黑框。 

中间灰色区域才是有效显示区域。


再来解决最后一个问题:每个像素再FrameBuffer中,占据多少位BPP(Bits Per Pixels)? 

前面的LCD引脚功能图里,R0-R7、G0-G7、B0-B7,每个像素是占据3*8=24位的,即硬件上LCD的BPP是确定的。


虽然LCD上的引脚是固定的,但我们使用的时候,可以根据实际情况进行取舍,比如我们的JZ2440使用的是16BPP,因此LCD只需要R0-R4、G0-G5、B0-B4与SOC相连,5+6+6=16BPP,每个像素就只占据16位数据。


我们写程序的思路如下:


查看LCD芯片手册,查看相关的时间参数、分辨率、引脚极性;


根据以上信息设置LCD控制器寄存器,让其发出正确信号;


在内存里面分配一个FrameBuffer,在里面用若干位表示一个像素,再把首地址告诉LCD控制器;


之后LCD控制器就能周而复始取出FrameBuffer里面的像素数据,配合其它控制信号,发送给电子枪,电子枪再让在LCD上显示出来。以后我们想显示图像,只需要编写程序向FrameBuffer填入相应数据即可,硬件会自动的完成显示操作。


第002节_S3C2440_LCD控制器

LCD控制器主要功能和需要的设置:


取:从内存(FrameBuffer)取出某个像素的数据;之后需要把FrameBuffer地址、BPP、分辨率告诉LCD控制器;

发:配合其它信号把FrameBuffer数据发给LCD;需要设置LCD控制器时序、设置引脚极性;

这里主要的难点就是如何配合其它信号,需要我们阅读LCD芯片手册,知道其时序要求,然后设置相应的LCD控制器。


先看下S3C2440芯片手册上的LCD控制器框图: 

这里写图片描述

通过设置REGBANK(寄存器组),LCDCDMA会自动(无需CPU参与)把内存上FrameBuffer里的数据,通过VIDPRCS发送到引脚VD[23:0]上,再配合VIDEOMUX引脚的控制信号,正确的显示出来。


S3C2440芯片手册介绍了LCD控制器支持TFT和STN两种LCD,我们常用的都是TFT材质的,因此主要看TFT相关的部分。


调色板的概念:


画油画的时候,通常先在调色板里配好想要的颜色,再用画笔沾到画布上作画。LCD控制器里也借用了这个概念,从FrameBuffer获得数据,这个数据作为索引从调色板获得对应数据,再发给电子枪显示出来。 

这里写图片描述

如图,假如是16BPP的数据,LCD控制器从FB取出16bit数据,显示到LCD上。


当如果想节约内存,对颜色要求也没那么高,就可以采用调色板的方式,调色板里存放了256个16bit的数据,FB只存放每个像素的索引,根据索引去调色板找到对应的数据传给LCD控制器,再通过电子枪显示出来。


假设现在想要LCD只显示一种颜色怎么办?


如果是16BPP/24BPP需要修改FB里面的数据,填充同一个值。


如果是8BPP可以修改FB为同一种颜色,也可以设置调色板为同一种颜色,对于S3C22440有个临时调色板的特性,一旦使能了临时调色板,不管FB里面是什么数据,都只调用临时调色板的数据。


第003节编程框架与准备

本节主要有两个目的:


a.讲解后续程序的框架;


b.准备一个支持NAND、NOR启动的程序;


我们的目的是在LCD显示屏上画线、画圆(geomentry.c)和写字(font.c)其核心是画点(farmebuffer.c),这些都属于纯软件。此外还需要一个lcd_test.c测试程序提供操作菜单,调用画线、画圆和写字操作。


往下操作的是LCD相关的内容,不同的LCD,其配置的参数也会不一样,通过lcd_3.5.c或lcd_4.3.c来设置。


根据LCD的特性,来设置LCD控制器,对于我们开发板,就是s3c2440_lcd_controller.c,假如希望在其它开发板上也实现LCD显示,只需添加相应的代码文件即可。


这就是LCD编程的框架,尽可能的“高内聚低耦合”。 

这里写图片描述

为了让程序更加好扩展,下面介绍“面向对象编程”的概念。


假如我们写好程序后,有两款尺寸大小的lcd,如何快速的在两个lcd上切换?


首先我们抽象出lcd_3.5.c和lcd_4.3.c的共同点,比如都有初始化函数init(),我们可以新建一个lcd.c,然后定义一个结构体:


struct lcd_opr{

    void (*init)(void);

};


用户不接触lcd_3.5.c和lcd_4.3.c,只需要在lcd.c里通过指针访问对应的结构体的函数,也就调用了不同init()。 

这里写图片描述

前面我们的程序大小都没超过4K,因此无论Nor/Nand启动,都是正常的,现在的LCD相关代码比较大,超过4K,因此需要修改启动部分的代码。


目前还未讲解nand flash,因此直接将19课准备的nand_flash程序部分复制到当前代码里即可,关于这部分可以参考nand flash讲解部分。


第004节编程抽象出重要结构体

开始正式编写程序,根据前面的框架,新建如下文件:


font.c、framebuffer.c、geometry.c、lcd.c、lcd_4.3.c、lcd_controller.c、s3c2440_lcd_controller.c、lcd_test.c


首先编写lcd_controller.c,它向上要接收不同LCD的参数,向下要使用这些参数设置对应的LCD控制器。


前面我们列举了LCD的参数,例如引脚的极性、时序、数据的格式bpp、分辨率等,使用面向对象的思维方式,将这些封装成结构体放在lcd.h中:


enum {

    NORMAL = 0,

    INVERT = 1,

};


/* NORMAL : 正常极性

 * INVERT : 反转极性

 */

typedef struct pins_polarity {

    int vclk;  /* normal: 在下降沿获取数据 */

    int rgb;   /* normal: 高电平表示1 */

    int hsync; /* normal: 高脉冲 */

    int vsync; /* normal: 高脉冲 */

}pins_polarity, *p_pins_polarity;


typedef struct time_sequence {

    /* 垂直方向 */

    int tvp; /* vysnc脉冲宽度 */

    int tvb; /* 上边黑框, Vertical Back porch */

    int tvf; /* 下边黑框, Vertical Front porch */


    /* 水平方向 */

    int thp; /* hsync脉冲宽度 */

    int thb; /* 左边黑框, Horizontal Back porch */

    int thf; /* 右边黑框, Horizontal Front porch */


    int vclk;

}time_sequence, *p_time_sequence;



typedef struct lcd_params {

    /* 引脚极性 */

    pins_polarity pins_pol;


    /* 时序 */

    time_sequence time_seq;


    /* 分辨率, bpp */

    int xres;

i

[1] [2] [3] [4] [5]
关键字:LCD  原理详解  裸机程序 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic492475.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:第016课 Nand Flash操作原理及裸机程序分析
下一篇:第018课 ADC和触摸屏硬件原理详解及裸机编程

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

LG Display将要淘汰LCD?重心逐渐转向OLED面板
据韩媒Business Korea报道,LG Display的LCD市场份额已跌至第四位。从LCD市场排名的下降可以看出,该公司正将重点从LCD转向OLED面板。据悉,市场研究机构IHS Markit在日前发布的报告中称,LG Display去年第四季度在LCD面板市场的份额为14.3%,排名第四,比前一季度下降了两个等级。而LG Display在2018年第一季度之前一直是第一名,但被京东方(BOE)等中国显示器制造商挤到了第四名。截至去年第三季,LG Display在LCD的市场份额为15.5%,仅次于京东方的18.9%。然而,在第四季度,中国台湾地区的群创电子(16.0%)和中国的CSOT电子(14.4%)领先于LG
发表于 2020-03-09
PIC+DS18B20+LCD设计及程序过程中的问题
1、mcu:pic18f25k22 2、由于ds18b20的程序前面文章已经写过,所以暂不概述; 3、液晶显示采用sms太阳人的液晶显示屏; 4、实物图如下:5、使用xc编译完成,调试过程中,当使用static bit 的时候不能进行函数传参,一直很头疼,最后使用强制类型转换;给变量定义绝对地址使用@这个特殊符号,具体写法:unsigned char a @ 0x40;当然这只是个简单的。在定义bit类型时,注意bit的类型只有全局和静态两种 否则会报错 6、使用pickit3烧写的程序,使用时注意打开项目属性,把power的对钩打上 电源3.3-5.5v自己订喽,其实都可以 当然越低越好,&
发表于 2020-03-06
PIC+DS18B20+LCD设计及程序过程中的问题
【ARM裸板】LCD硬件原理、时序及初始化
1.LCD与OLED的区别LCD背光源与OLED自发光LCD无机材料,LCD寿命较长。OLED广视角、几乎无穷高的对比度、可以弯曲、较低耗电优点。2.LCD原理屏幕上的每一个点称为像素每个像素点由RGB三原色组成2.1 颜色如何确定?由RGB三组信号线组成由下原理图可知:R5条、G6条,B5条,即RGB565(彩色模式, 一个像素占两个字节)因此其每个像素占用多少位(BBP:bit per piexl)为2个字节2.2 LCD如何“行扫描”?有一条CLK时钟线与LCD相连,每发出一次CLK(高低电平),就移动一个像素。2.3 如何跳到下一行进行“行扫描”?有一条HSYNC(水平同步信号)信号线与LCD相连,每发出一次脉冲(高低电平
发表于 2020-03-05
【ARM裸板】LCD硬件原理、时序及初始化
夏普计划调用日本LCD工厂,生产口罩相应支援
日韩的疫情形势不容乐观,夏普公司计划在日本三重县龟山市(Kameyama, Mie prefecture)的工厂生产口罩,该工厂此前用于生产大尺寸 LCD 液晶面板和电视组装。  预计本月底前,口罩的日产能为 15 万只,未来提高到 50 万只。   之所以选择这家工厂来制造口罩,是因其拥有极高的清洁标准,此前中国已有多家企业积极响应政府的转产支援号召。不过目前,富士康旗下的夏普公司尚未就口罩的定价和分销计划达成协议。 以往在日本的冬天,戴口罩来防止疾病的传播,是一种相当常见的现象。然而自 COVID-19 疫情爆发以来,全球多地均出现了大量日用品的短缺,迫使商家不得不推出限购政策
发表于 2020-03-03
夏普计划调用日本LCD工厂,生产口罩相应支援
实现单片机计算器与LCD1602字幕滚动
;=9999// 乘最大9999*9999=99980001// 除 1/9=0.1111 保留小数点后4位#include<reg51.h>#define uint unsigned int#define uchar unsigned char//--------LCD1602-------------------//P00-07==== D0-7sbit rs=P2^6;        //指令or数据sbit wela=P2^5;      //读or写sbit lcden=P2^7;         
发表于 2020-03-03
实现单片机计算器与LCD1602字幕滚动
PIC单片机使LCD面板产生闪烁效果的设计
使用LCD面板,信息可以通过多种方式显示。例如,如何将用户的注意力吸引到LCD面板的特定部分?一种不需要任何附加段的方式是产生闪烁效果。以常见的时钟(见下图)应用为例。小时和分钟之间的“:”通常每秒闪烁一次(显示半秒,隐藏半秒)。在缺少滴答声或通常伴随模拟外观时钟的秒针时,这可以显示时钟正在计时。它起到一种重要的作用,让用户知道时钟正在工作。如果电源的电能即将耗尽,则通常整个时钟显示会开始闪烁。这使用户可以立即了解时钟不再显示正确的时间。在用户设置时间时,通常使用闪烁来显示已进入了新模式,例如闪烁小时来指示正在设置小时,或者闪烁分钟来指示正在设置分钟。在简单时钟中,闪烁用于多种不同用途。如果没有闪烁效果,则常见的数字时钟将不再便于
发表于 2020-02-27
PIC单片机使LCD面板产生闪烁效果的设计
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved