S3C2440开发板裸机程序系列06—LCD控制器

1.     概述


S3C2440对LCD的支持还是很强大的,有广度有深度,这里只简单学一种,后续有精力再实践各种模式。

本篇从显示模式、显示时序、硬件连接、控制器寄存器设置等几个方面进行展开。

 

2.     LCD显示模式

如前面所述,S3C2440支持多种灰度和彩色显示模式。这里只介绍16BPP(bit per pixel),即每个像素点用16bit,即占用2个字节。16BPP又有2种显示格式:5:6:5格式和5:5:5:1格式。

这里只以565格式为例。从上图可清楚的明白RGB三色对应的各位的对应关系。

 

3.     LCD显示时序

LCD采用”之”字扫描,从左上角开始,将显示像素数据一行一行的显示到屏幕上,对于4.3寸屏,分辨率为480*272,所以需要扫描272行,每行480个像素数据,并且是在每一个VCLK像素时钟内读取这个像素数据。实践硬件扫描时,需要有VSYNC垂直同步信号,HSYNC水平同步信号,(可能还有消隐信号),所以实际扫描数要大于480*272。见下图:

水平同步信号的脉宽。(单位:VCLK个)

HSPW+1: 是HSYNC水平同步信号的脉宽。(单位:VCLK个)
HBPD+1: 是HSYNC之后还要经过(HBPD+1)个VCKL才是有效数据。(单位:VCLK个)
HOZVAL+1: 是有效数据,对于4.3寸屏就是480。(单位:VCLK个)
HFPD+1: 是一行末的(HFPD+1)个无效数据。(单位:VCLK个)

VSPW+1: 是VSYNC垂直同步信号的脉宽。(单位:1行扫描周期)
VBPD+1: 是VSYNC之后还要经过(VBPD+1)个行扫描周期才是有效数据。(单位:1行扫描周期)
1Line: 是有效数据,对于4.3寸屏就是272行。(单位:1行扫描周期)
VFPD+1: 是一帧末的(VFPD+1)个无效数据。(单位:1行扫描周期)

 

4.     硬件连接

S3C2440数据手册中LCD控制器结构描述如下图所示。

TQ2440的40Pin的LCD接口如下图所示。

TQ2440学习板上的4.3寸LCD屏是国显4.3寸数字液晶屏 KD43G18-40NB-A1,但是配套资料给出的LCD资料是” WXCAT43-TG6#001_V1.0.pdf”,在网上也没有找到KD43G18-40NB-A1的datasheet。” WXCAT43-TG6#001_V1.0.pdf”中接口规范如下图。

结合上面3个图,40个引脚说明如下:

VLED – Pin1, Pin2 接背光源
GPC[8:15] – VD[0:7]  Pin3_Pin10
GPD[0:15] – VD[8:23]  Pin12_Pin19, Pin21_Pin28
GPG4 – LCD_POWER  Pin30
GPE15 – I2CSDA  Pin31
GPE14 – I2CSCL  Pin32
GPC4 – VM(VDEN)  Pin33
GPC3 – VFRAME(VSYNC)  Pin34
GPC2 – VLINE(HYSNC)  Pin35
GPC1 – VCLK  Pin36
AIN6 – TSXM  Pin37
AIN7 – TSXP  Pin38
AIN4 – TSYM  Pin39
AIN5 – TSYP  Pin40
GND – Pin11, Pin20, Pin29

说明:

a.关于LCD供电

这里GPG4接LCD_POWER,可以控制LCD的开关,低电平将关闭LCD。

b.AIN4567,是与ADC功能共用的引脚,用于控制触摸功能。

c.GPIO的引脚功能。如下图。


d.关于GPC0,即LEND,行结束信号。查遍了TQ2440_V2核心板原理图和TQ2440底板原理图,没有看到这个引脚,所以确认这个引脚根本没有引出。实际编程也用不要这个引脚。

 

5.     控制器寄存器设置

简单编程只需要设置8个寄存器:

LCDCON1 – LCDCON5 : 功能模式的选择和设置
LCDADDR1 – LCDADDR3 : 设置图像帧数据地址的。

 

下面均已4.3寸屏, 480*272分辨率进行说明设置,先给出” WXCAT43-TG6#001_V1.0.pdf”中的相关数据如下。

由datasheet时序关系图可知,各参数对应关系如下:

thf = HFPD+1 , => HFPD=1
thp = HSPW+1, => HSPW=40
thb = HBPD+1, => HBPD=1  注意: thp+thb=43
tvf = VFPD+1, => VFPD=1
tvp = VSPW+1, => VSPW=9  
tvb = VBPD+1, => VBPD=1  注意:tvp+tvb=12


LCDCON1控制寄存器1

CLKVAL: 由datasheet可知VCLK的典型值为9MHz,HCLK在这里启动程序中设置为100MHz,因此:  9=100/[(CLKVAL+1)*2]=>CLKVAL=4.55555,取4 。

PNRMODE: 取值3,TFT LCD面板

BPPMODE: 取值12,16BPP

ENVID: 使能信号,取值1。

其它取默认值即可。因此, LCDCON1 = (4<<8)|(3<<5)|(12<<1)|(1<<0)

 

LINEVAL: (LINEVAL+1)即是LCD屏的垂直像素数,因此LINEVAL取值272-1=271

由上面计数可知,VBPD=1 , VFPD=1, VSPW=9

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

HOZVAL : (HOZVAL+1)即是LCD屏的水平像素数,因此HOZVAL取值480-1=479

由上面计数可知,HBPD=1 , HFPD=1

即: LCDCON3 = (1<<19)|(479<<8)|(1<<0)

LCDCON4 = (HSPW) 

LCDCON5

FRM565 : 取值1

INVVCLK : VCLK有效的极性,还得上datasheet图,如下。所以,应该取0.

8位和9位,取值1

3位:LCD的电源信号是否有效,这个值最后再设置为1.

BSWP和HWSWP取值含义如下:

根据帧数据实际存储情况取值。本程序取值为 BSWP=0,HWSWP=1

 

按照如下设置:

#define LOW21BITS(n)     ((n) & 0x1fffff)  // To get lower 21bits

volatile unsigned short LCD_BUFFER[272][480];

#define LCD_XSIZE_TFT          (480)        

#define LCD_YSIZE_TFT          (272)

 

rLCDSADDR1 = (((unsigned int)LCD_BUFFER >> 22) << 21) | LOW21BITS((unsigned int)LCD_BUFFER >> 1);

rLCDSADDR2 = LOW21BITS( ((unsigned int)LCD_BUFFER + (LCD_YSIZE_TFT * LCD_XSIZE_TFT *2) ) >> 1 );

rLCDSADDR3 = (0 << 11) | (LCD_XSIZE_TFT / 1);

这样,向LCD_BUFFER数组中写入颜色数据,就可以自动显示到TFT屏上了。

从上面可知,数据端口VD[0:23],共24个,推理可知正好可以传送RGB的24位像素数据。但是,我们这里的颜色数据是565模式,共16位,怎么传送的呢?S3C2440的datasheet中有说明,见下图: 


这样我们就明白了,并且空余的GPIO引脚还可以用做其它用途,呵呵


6.     LCD显示程序

向帧数据数组中写入数据,LCD控制器将自动向显示屏显示,因此主程序只要向LCD_BUFFER中放置RGB数据即可。

本例,通过串口交互,按下字母n时,将分别循环显示绿,蓝,红。

可以向清屏函数参数代入不同颜色值即可。

00000 000000 11111 = 31     纯蓝
00000 111111 00000 = 2016   纯绿
11111 000000 00000 = 63488  纯红

 清屏函数:

void Lcd_ClearScr( unsigned int c)
{
	unsigned int x,y ;
		
    for( y = 0 ; y < 272 ; y++ )
    {
    	for( x = 0 ; x < 480 ; x++ )
    	{
			LCD_BUFFER[y][x] = c ;
    	}
    }
}

上述程序的完整代码:点击打开链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值