LCD显示器接口概述
液晶:一种具有规则性分子排列的有机化合物,既不是固体也不是液体,介于固态和液态之间的物质。
液晶显示是一种被动的显示,它不能发光,只能使用周围环境的光。
基本原理:通过给不同的液晶单元供电,控制其光线的通过与否,从而达到显示的目的。
三种显示方式:反射型,透射型和透反射型。
市面上出售的LCD有两种类型:
(1)带有驱动电路的LCD显示模块,这种LCD可以方便地与各种低档单片机进行接口;
(2)LCD显示屏,没有驱动电路,需要与驱动电路配合使用
S3C44B0X内部LCD控制器
作用:把定位在系统存储器中的视频缓冲区的LCD图象数据传输到LCD驱动器,并产生必须的LCD控制信号 。
LCD控制器包含:REGBANK、LCDCDMA、VIDPRCS和TIMEGEN。
REGBANK:有18个可编程寄存器,用于配置LCD控制器。
LCDCDMA:专用DMA,可以自动地将显示数据从帧内存中传送到LCD驱动器中。
VIDPRCS :从LCDCDMA 接收数据。
TIMEGEN:包含可编程的逻辑,支持常见的LCD驱动器所需要的不同接口时间和速率的要求。产生VFRAME, VLINE, VCLK, VM信号。
LCD控制器和LCD驱动器之间的接口信号
(1)VFRAME:帧同步信号,告诉LCD新的一帧开始。LCD控制器在一个完整帧显示完成后立即插入一个VFRAME信号,并开始新一帧的显示。
(2)VLINE:线同步脉冲信号,用于LCD驱动器将水平线(行)移位寄存器的内容传送给LCD屏显示。LCD控制器在整个水平线(整行)数据移入LCD驱动器后,插入一个VLINE信号。
(3)VCLK:像素时钟信号,由LCD控制器送出的数据在VCLK的上升沿处送出,在VCLK的下降沿处被LCD驱动器采样。
(4)VM:电压极性信号,VM信号被LCD驱动器用于改变行和列的电压极性,从而控制像素点的显示或熄灭。VM信号可以与每个帧同步,也可以与可变数量的VLINE信号同步。
(5)VD[3:0]:LCD像素点数据输出端口。
(6)VD[7:4]:LCD像素点数据输出端口。
LCD控制器的操作
(1)显示类型
3种:4位双扫描,4位单扫描,8位单扫描显示模式。
(2)像素点字节数据格式
在彩色模式下,1个字节8位(3位红色、3位绿色、2位蓝色)的图像数据对应于一个像素点。
(3)虚拟显示
支持硬件方式的水平或垂直滚动。如果要使屏幕滚动,显示缓冲区的大小要大于LCD显示屏的大小。
(4)查找表
查找表即调色板表,用于各种色彩选择或灰度级别选择。
在灰度模式,通过查找表可以在16级灰度中选择4种灰度。
在彩色模式,1个字节的图像数据组成是3位红色,3位绿色,2位蓝色。通过查找表,可以选择16级红色中的8种,16级绿色中的8种,16级蓝色中的4种,构成8×8×4 = 256色。
每个色彩级别由4位数据表示,因此共有16个色彩级别可供选择。
LCD控制参数
(1)水平扫描次数HOZVAL的计算公式:
HOZVAL=(显示宽度/VD数据线的位数)-1
其中,在彩色模式下,显示宽度 = 3×每行的像素点数目。
本例采用的LCD,HOZVAL= (320×3/8)-1个像素。
(2)垂直扫描次数LINEVAL的计算公式:
在单扫描显示类型下: LINEVAL = (显示高度)-1
在双扫描显示类型下: LINEVAL = (显示高度/2)-1
本例采用的LCD,LINEVAL=240-1个像素。
(3)像素时钟VCLK计算公式:
VCLK=MCLK / (CLKVAL×2),单位为赫兹(Hz)
时钟变量CLKVAL的值决定了VCLK的频率,由LCD控制器向VD端口传输数据的速率,以便使VCLK的值大于数据传输的速率。
(4)数据传输速率的公式为:
数据传输速率=HS×VS×FR×MV
其中,HS是LCD的行像素值;VS是LCD的列像素值;FR是帧速率;MV是模式值,
LCD控制器专用寄存器
LCD控制器主要提供液晶屏显示数据的传送时钟和各种信号产生及控制功能。
LCD控制器专用寄存器主要有:
LCD控制寄存器1(LCDCON1)
LCD控制寄存器2(LCDCON2)
LCD控制寄存器3(LCDCON3)
帧缓冲区起始地址寄存器1(LCDSADDR1)
帧缓冲区起始地址寄存器2(LCDSADDR2)
帧缓冲区起始地址寄存器3(LCDSADDR3)
红色查找表寄存器(REDLUT)
绿色查找表寄存器(GREENLUT)
蓝色查找表寄存器(BLUELUT)
LCD应用实例-接口电路
/O口LICD功能设置
通常采用S3C44B0X的PC口和PD口作为LCD驱动接口,因此需要设置PC口工作在第3功能状态和PD口工作在第2功能状态。
设置对应I/O口控制寄存器的语句:
rPCONC = 00 00 00 00 00 00 00 00 11 11 11 11 00 00 00 00B = 0x0000ff00;
rPUPC = 0x 00; //上拉使能
rPCOND= 0xaaaa;
rPUPD= 0x 00;
初始化流程图
初始化程序代码1
U32* pLCDBuffer16=(U32*)0xc000000;
U32 LCDBuffer[LCDHEIGHT][LCDWIDTH];
void LCD_Init()
{
int i;
U32 LCDBASEU,LCDBASEL,LCDBANK;
rPCONC=00 00 00 00 00 00 00 00 11 11 11 11 00 00 00 00B = 0x0000ff00;
rPUPC = 0x 00; //上拉使能
rPCOND= 0xaaaa;
rPUPD= 0x 00;
rLCDCON1=(0x0)|(2 |