一、LCD的控制原理
LCD显示原理
如果需要显示一满屏的数据,则数据的大小:800*480*24bits
1、帧同步信号:液晶屏的刷新频率、垂直同步信号的频率、场频率
帧同步信号= 50Hz~70Hz,典型值:60Hz
2、行同步信号的频率:一帧中有多少行?
行同步信号的频率 = ( 480 +回扫的行数(45) )* 帧同步信号的频率
3、像素时钟的频率:扫描像素点的频率
像素时钟频率 = (800+一行中回扫的像素点(256))*行同步信号的频率
注意:
1、液晶屏的分频率越大,则VCLK的频率越高
2、VCLK的频率的最大上限:HCLK_DSYS=166MHz
3、思考:S5PV210最大可以接多大的液晶屏?
计算:
在800*480的LCD中,VCLK的频率值:
VCLK = (800+256)*(480+45)* 60Hz = 33.264MHz
LCD的描述参数(液晶屏的选型)
1、分辨率
行和列像素点的个数
2、尺寸
有效的显示区对角线的长度,单位英寸。
3、色位
一个像素点用多少位数据来描述----24bits
4、响应时间
刷新时间---->60Hz(16ms)
响应时间---->几ms
5、亮度
cd/m**2 --->高亮屏:600
一般屏:250
6、对比度
白色的亮度/黑色的亮度。
7、寿命
单位:小时 5万小时
当液晶屏的亮度降低到出厂亮度的一半的时候,认为寿命到了。
8、可视角度
四个方向的可视角度是不对称的,一般有一个方向是比较差的。
硬件的设计接口
1、S5PV210 LCD控制器的接口
7英寸液晶屏接口
LCD的驱动主要做什么?
1、根据液晶屏的特定参数来设置LCD控制器(接口、bpp、......)
2、设置液晶屏的同步信号的频率(VCLK、VSYNC、HSYNC.....)
3、设置液晶屏的时序参数(帧的回扫时间、行的回扫时间、同步信号的极性.....)
4、设置显存的位置和大小
LCD的时序图
目的:
通过对LCD控制器进行参数的配置,让LCD控制器输出的时序符合LCD液晶屏的时序的要求。参数如何确定--->查看时序图。通过LCD液晶屏的时序图来确定LCD控制器的时序。
1、LCD控制器的输出时序
LCD液晶屏的输入时序
四、LCD驱动程序
1、端口初始化
作用:将GPIO初始化成LCD控制器信号的功能
void lcd_init(void)
{
GPF0CON = 0x22222222;
GPF0DRV = 0xffffffff;
GPF0PUD = 0x0;
GPF1CON = 0x22222222;
GPF1DRV = 0xffffffff;
GPF1PUD = 0x0;
GPF2CON = 0x22222222;
GPF2DRV = 0xffffffff;
GPF2PUD = 0x0;
GPF3CON &= ~0xffff;
GPF3CON |= 0x2222;
GPF3DRV |= 0xff;
GPF2PUD &= ~0xff;
//set gpd0_1 (backlight pwm pin) output and pull up and high level for disab
//GPD0_1(TOUT1)-->OUTPUT
GPD0CON &= ~(0xf<<4);
GPD0CON |= (1<<4);
GPD0DAT |= (1<<1);
//GPH1_2 ok
//GPH1CON &= ~(0xf<<8);
//GPH1CON |= (1<<8);
//GPH1DAT |= (1<<2);
.......................................................
}
--------------------------------------------------------------------------------------------------
2、LCD控制器的初始化(重点)
void lcd_init(void)
{
.................................
//Display output path selection, 10: RGB=FIMD I80=FIMD ITU=FIMD
DISPLAY_CONTROL = (2<<0);
WINCON2 = 0;
// bit[30]=0: disable MIPI DSI
// bit[26~28]=000: output format---RGB interface,
// bit[18]=0: RGB parallel format
// bit[2]=0:video clock source,HCLK_DSYS=166MHz
VIDCON0 = ~( (1<<30)|(7<<26)|(1<<18)|(1<<16)|(1<<5)|(1<<2) );
// bit[4]=1:Divided by CLKVAL_F
// bit[6~13]=4:CLKVAL, VCLK = 166M/(4+1) = 33.3M
VIDCON0 |= 4<<6 | 1<<4;
//bit[4]=0:VDEN pulse polarity,,normal
//bit[5]=1:VSYNC pulse polarity,Inverted
//bit[6]=1:HSYNC pulse polarity,Inverted
//bit[7]=0:Video data is fetched at VCLK falling edge
VIDCON1 = (1<<5) | (1<<6);
VIDTCON0 = (VBPD<<16) | (VFPD<<8) | (VSPW<<0);
VIDTCON1 = (HBPD<<16) | (HFPD<<8) | (HSPW<<0);
VIDTCON2 = (LINEVAL << 11) | (HOZVAL << 0);
// bit[0]=1:Enables video output and logic immediately
// bit[2~5]=1011:Unpacked 24 bpp ( non-palletized R:8-G:8-B:8 )
// bit[15]:Word swap Enable
WINCON0 = 1<<0;
WINCON0 &= ~(0xf << 2);
WINCON0 |= (0xB<<2) | (1<<15);
//Window 0 Position Control Register
VIDOSD0A = (LeftTopX<<11) | (LeftTopY << 0);
VIDOSD0B = (RightBotX<<11) | (RightBotY << 0);
VIDOSD0C = (LINEVAL + 1) * (HOZVAL + 1);//Specifies the Window Size(word)
// Frame Buffer Address Register
//of the start address for Video frame buffer
VIDW00ADD0B0 = FB_ADDR;
//the end address for Video frame buffer
//VIDW00ADD1B0 = (((HOZVAL + 1)*4 + 0) * (LINEVAL + 1)) & (0xffffff);
VIDW00ADD1B0 = FB_ADDR+((HOZVAL + 1)*4 + 0) * (LINEVAL + 1);
//VBASEL = VBASEU + (PAGEWIDTH+OFFSIZE) x (LINEVAL+1)
//OFFSIZE,PAGEWIDTH
VIDW00ADD2 = (0<<13)|((HOZVAL + 1)*4);
// enable channel 0 output
SHODOWCON = 0x1;
// bit[1]:Enables video output and logic immediately
// bit[0]:Enables video output and logic at current frame end.
VIDCON0 |= ((1<<0)|(1<<1));
}
3、写像素点的函数
在液晶屏上显示的任何内容都是由点组成。画点是液晶屏显示的基础。
void lcd_draw_pixel(int row, int col, int color)
{
unsigned long * pixel = (unsigned long *)FB_ADDR;
*(pixel + row * COL + col) = color;
}
清屏函数:
void lcd_clear_screen(int color)
{
int i, j;
for (i = 0; i < ROW; i++)
for (j = 0; j < COL; j++)
lcd_draw_pixel(i, j, color);
}