历史上的今天
返回首页

历史上的今天

今天是:2025年05月10日(星期六)

正在发生

2019年05月10日 | 对LCD的操作(S3C2440)

2019-05-10 来源:eefocus

先简单介绍下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控制器接口图。 Chapter17 lesson1 002.jpg?imageView2/2/w/550


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


②是用来传输颜色数据;


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


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


再来看看LCD的芯片手册。 Chapter17 lesson1 003.jpg?imageView2/2/w/550


先是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的时序如下: Chapter17 lesson1 004.png?imageView2/2/w/550


从最小的像素开始分析,电子枪每次在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显示配置示意图如下: Chapter17 lesson1 005.jpg?imageView2/2/w/550


当发出一个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+5=16BPP,每个像素就只占据16位数据。


我们写程序的思路如下:


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


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


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


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


以上内容转自http://wiki.100ask.org/%E7%AC%AC017%E8%AF%BE_LCD%E7%BC%96%E7%A8%8B#.E7.AC.AC001.E8.8A.82_LCD.E7.A1.AC.E4.BB.B6.E5.8E.9F.E7.90.86


下面就开始编程

思路:配置LCD 相关的引脚。设置LCD控制寄存器,使能,测试。


使用LCD为4.3寸,设置为32BPP,像素为x480,y272

新建文件有 lcddrv.c lcddrv.h lcdlib.c lcdlib.h。

在lcddrv.c 中,配置LCD相关的引脚,初始化LCD设置LCD的特殊寄存器。配置为32bpp

在lcdlib.c 中,通过调用LCDDRV中的函数,测试LCD,使之输出全屏的红色,绿色,蓝色。


lcddrv.c



#include "lcddrv.h"


void Lcd_Port_Init(void)

{

    /* 初始化引脚 : 背光引脚 */

GPBCON &= ~0x3;

GPBCON |= 0x01;


/* LCD专用引脚 */

GPCCON = 0xaaaaaaaa;

GPDCON = 0xaaaaaaaa;


/* PWREN */

GPGCON |= (3<<8);

    

}


void TFT_Lcd_Init(void)

{

int addr, fb_base;

/* 

         * 设置LCD控制器的控制寄存器LCDCON1~5

         * 1. LCDCON1:

         *    设置VCLK的频率:VCLK(Hz) = HCLK/[(CLKVAL+1)x2]

         *    选择LCD类型: TFT LCD   

         *    设置显示模式: 32BPP

         *    先禁止LCD信号输出

         * 2. LCDCON2/3/4:

         *    设置控制信号的时间参数

         *    设置分辨率,即行数及列数

         * 现在,可以根据公式计算出显示器的频率:

         * 当HCLK=100MHz时,

         * Frame Rate = 1/[{(VSPW+1)+(VBPD+1)+(LIINEVAL+1)+(VFPD+1)}x

         *              {(HSPW+1)+(HBPD+1)+(HFPD+1)+(HOZVAL+1)}x

         *              {2x(CLKVAL+1)/(HCLK)}]

         *            = 60Hz

         * 3. LCDCON5:

         *    设置显示模式为8BPP时,调色板中的数据格式: 5:6:5

         *    设置HSYNC、VSYNC脉冲的极性(这需要参考具体LCD的接口信号): 反转

         *    字节交换使能

         */

LCDCON1 = (5<<8) | (3<<5) | (0xd<<1) ;

LCDCON2 = (1<<24) | (271<<14) | (1<<6) | (9<<0);

LCDCON3 = (1<<19) | (479<<8) | (1<<0);

LCDCON4 = (40<<0);

LCDCON5 = (0<<10) | (1<<9) | (1<<8) | (0<<7) | (0<<6) | (0<<5) | (1<<11) | 0;

fb_base = 0x33c00000;

addr = fb_base & ~(1<<31);

LCDSADDR1 = (addr >> 1);


addr = fb_base + 480*272*32/8;

addr >>=1;

addr &= 0x1fffff;

LCDSADDR2 = addr;


}


void TFT_Lcd_Enalbe(void)

{

/* 背光引脚 : GPB0 */

GPBDAT |= (1<<0);

/* pwren    : 给LCD提供AVDD  */

LCDCON5 |= (1<<3);

/* LCDCON1'BIT 0 : 设置LCD控制器是否输出信号 */

LCDCON1 |= (1<<0);

}



lcdlib.c



#include "lcdlib.h"



void lcd_test(void)

{

int x, y;

unsigned int *p2;

Lcd_Port_Init();

TFT_Lcd_Init();

TFT_Lcd_Enalbe();


/* 让LCD输出整屏的红色 */


/* 0xRRGGBB */


p2 = (unsigned int *)0x33c00000;

for (x = 0; x < 480; x++)

for (y = 0; y < 272; y++)

*p2++ = 0xff0000;

/* 让LCD输出整屏的green */

p2 = (unsigned int *)0x33c00000;

for (x = 0; x < 480; x++)

for (y = 0; y < 272; y++)

*p2++ = 0x00ff00;


/* 让LCD输出整屏的blue */

p2 = (unsigned int *)0x33c00000;

for (x = 0; x < 480; x++)

for (y = 0; y < 272; y++)

*p2++ = 0x0000ff;

}




实验结果为:

在LCD中,先显示全屏红色,然后绿色,蓝色。


推荐阅读

史海拾趣

博流(Bouffalo Lab)公司的发展小趣事

随着公司的发展壮大,博流积极寻求与全球知名企业的合作机会。其中,与谷歌的合作尤为引人注目。作为Google Matter EAP合作伙伴,博流与谷歌共同推动Matter协议在智能家居生态系统中的应用,为用户提供更加便捷、智能的家居体验。此外,博流还与多家产业链上下游企业建立了紧密的合作关系,共同推动物联网产业的发展。

EPCOS (TDK)公司的发展小趣事

2009年10月1日,EPCOS与TDK元件事业部合并,成立了TDK-EPC公司。这次合并进一步增强了EPCOS在电子元器件领域的实力,使其在全球市场中的地位更加稳固。合并后,TDK-EPC公司继续秉承EPCOS的技术创新和产品拓展战略,不断推出具有竞争力的新产品和解决方案,以满足客户日益增长的需求。

灿科盟(Ckmtw)公司的发展小趣事

灿科盟电子实业有限公司成立于2003年8月,注册资金100万。公司创始人凭借在电子行业多年的积累,决定创立自有品牌“CKMTW”,专注于连接器产品的研发与生产。在初创阶段,公司面临着资金紧张、市场竞争激烈等挑战,但凭借坚定的信念和不断的技术创新,逐渐在市场中站稳脚跟。

EM Devices Corporation公司的发展小趣事

在产品研发取得突破的同时,EM Devices Corporation也积极拓展市场,寻求与国际企业的合作。公司参加了多个国际电子展,展示了自己的产品和技术实力。通过与国外企业的交流与合作,公司不仅获得了更多的市场机会,还学习到了先进的生产和管理经验。这些经验为公司后续的发展奠定了坚实的基础。

Curtis Instruments Inc公司的发展小趣事

随着全球市场的不断变化和竞争的加剧,Curtis不断加强全球布局和战略合作。公司与多家国际知名企业建立了长期合作关系,共同开发新产品、拓展新市场。此外,Curtis还积极参与国际展览和交流活动,展示公司的最新技术和产品成果,提高品牌知名度和影响力。这些全球布局和战略合作有助于Curtis更好地应对市场挑战、把握发展机遇。

EUPEC [eupec GmbH]公司的发展小趣事

EUPEC一直致力于技术创新和研发,不断推动电力半导体技术的进步。在多个关键领域,EUPEC都取得了重要的技术突破,如提高电力转换效率、降低能耗等。这些技术突破不仅提升了EUPEC产品的竞争力,也为客户带来了实实在在的经济效益。同时,EUPEC还积极拓展国际市场,产品广泛应用于电解铝、高压直流输电、软启动、直流传动、高压无功补偿设备等领域。

问答坊 | AI 解惑

在wince中,如何根据exe名称获得该进程ID?

我用VS2005 C# 现在知道目标程序的exe文件名 如何通过该文件名获得对应进程的ID? ProcessID …

查看全部问答>

有关嵌入式的学习一点问题

本人现在想学习嵌入式开发,看过不少资料有ARM,DSP,现在就想由一个开始学,不知道学习那一个更加实际?? 还有我需要根据我的学习方向来定我的论文内容,如果是 ARM不知道具体的那方面可以去提升到论文的高度去写?不是到嵌入式数据库这个方向怎 ...…

查看全部问答>

MSP430电子教材分享

MSP430电子教材分享…

查看全部问答>

一个很好的C/C++小型IDE,绝对比vc6.0好!!!大家用了就知道!!!

       上一次在辛昕的蛊惑下自己用notepad++和gcc搭建了一个小型的IDE,那个是累啊!!用了感觉还不错,今天在看辛昕的帖子之后又知道了一个软件,c free,百度之找到了下载地址,http://www.skycn.com/soft/16427. ...…

查看全部问答>

【设计工具】关于复位的白皮书WQ272权威推荐

关于复位的白皮书WQ272权威推荐,是Xilinx的大牛写的…

查看全部问答>

使用LPC1766以太网MAC+DP83640+交换机 实现分布式网络的时间同步 相关问题求教!!!

最近在学习使用LPC1766以太网MAC+交换机+DP83640 实现分布式网络的时间同步,请问以太网帧中的目标、源地址怎么确定? 阅读DP83640器件后发现下面这样的语句:这说明DP83640的地址固定就下面列举的这几个??(感觉不可能) 那如果我在3个4端口的 ...…

查看全部问答>

VLO校验代码

#include   #include \"VLO_Library.h\" int dco_delta; int result; void main(void) {   volatile unsigned int i;   WDTCTL = WDTPW +WDTHOLD;                ...…

查看全部问答>

DSP Sitara那些事--晒成绩篇

DSP Sitara精品课程上线,江湖必定又是一番腥风血雨,各路好汉闻风而动,纷纷赶往学习,倚天屠龙,谁与争锋。 其实我是出来打酱油的,  即使打酱油,也要留下酱油味…

查看全部问答>