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 ;
}
}
}
上述程序的完整代码:点击打开链接