s3c2440的LCD應(yīng)用
LCD一般需要三個(gè)時(shí)序信號:VSYNC、HSYNC和VCLK。VSYNC是垂直同步信號,在每進(jìn)行一個(gè)幀(即一個(gè)屏)的掃描之前,該信號就有效一次,由該信號可以確定LCD的場頻,即每秒屏幕刷新的次數(shù)(單位Hz)。HSYNC是水平同步信號,在每進(jìn)行一行的掃描之前,該信號就有效一次,由該信號可以確定LCD的行頻,即每秒屏幕從左到右掃描一行的次數(shù)(單位Hz)。VCLK是像素時(shí)鐘信號。
VCLK=HCLK÷[(CLKVAL+1)×2]
例如,HCLK的頻率為100MHz,要想驅(qū)動像素時(shí)鐘信號為6.4MHz的LCD屏,則通過上式計(jì)算CLKVAL值,結(jié)果CLKVAL為6.8,取整后(值為6)放入寄存器LCDCON1中相應(yīng)的位置即可。由于CLKVAL進(jìn)行了取整,因此我們把取整后的值代入上式,重新計(jì)算VCLK,得到VCLK=7.1MHz。
按理說,對于一個(gè)已知尺寸(即水平顯示尺寸HOZVAL和垂直顯示尺寸LINEVAL已知)的LCD屏,只要確定了VCLK值,行頻和場頻就應(yīng)該知道了。但這樣還不行的,因?yàn)樵诿恳粠瑫r(shí)鐘信號中,還會有一些與屏顯示無關(guān)的時(shí)鐘出現(xiàn),這就給確定行頻和場頻帶來了一定的復(fù)雜性。如在HSYNC信號先后會有水平同步信號前肩(HFPD)和水平同步信號后肩(HBPD)出現(xiàn),在VSYNC信號先后會有垂直同步信號前肩(VFPD)和垂直同步信號后肩(VBPD)出現(xiàn),在這些信號時(shí)序內(nèi),不會有有效像素信號出現(xiàn),另外HSYNC和VSYNC信號有效時(shí),其電平要保持一定的時(shí)間,它們分別叫做水平同步信號脈寬HSPW和垂直同步信號脈寬VSPW,這段時(shí)間也不能有像素信號。因此計(jì)算行頻和場頻時(shí),一定要包括這些信號。HBPD、HFPD和HSPW的單位是一個(gè)VCLK的時(shí)間,而VSPW、VFPD和VBPD的單位是掃描一行所用的時(shí)間。在s3c2440中,所有的這些信號(VSPW、VFPD、VBPD、LINEVAL、HBPD、HFPD、HSPW和HOZVAL)都是實(shí)際值減1的結(jié)果。這些值是通過寄存器LCDCON2、LCDCON3和LCDCON4來配置,只要把這些值配置成與所要驅(qū)動的LCD中相關(guān)內(nèi)容的數(shù)據(jù)一致即可。例如,我們所要顯示的LCD屏大小為320×240,因此HOZVAL=320-1,LINEVAL=240-1。水平同步信號的脈寬、前肩和后肩分別為30、20和38,則HSPW=30-1,HFPD=20-1,HBPD=38-1;垂直同步信號的脈寬、前肩和后肩分別為3、12和15,則VSPW=3-1,VFPD=12-1,VBPD=15-1。
下面我們就具體計(jì)算一下行頻(HSF)和場頻(VSF):
HSF=VCLK÷[(HSPW+1)+(HSPD+1)+(HFPD+1)+(HOZVAL+1)]
VSF=HSF÷[(VSPW+1)+(VBPD+1)+(VFPD+1)+(LINEVAL+1)]
在有些情況下,s3c2440的LCD時(shí)鐘信號的默認(rèn)極性與所控制的LCD時(shí)鐘信號的極性相反,這時(shí)可以通過寄存器LCDCON5的相關(guān)位來改變某些時(shí)鐘信號的極性。
2、顯示緩存區(qū)
下面我們給出一段具體的TFT型LCD顯示的實(shí)例,其中,屏幕的大小為320×240,所設(shè)置的顏色為24位真彩色模式。
#define U32 unsigned int
#define M5D(n)
#define rGPCCON
#define rGPCDAT
#define rGPCUP
#define rGPDCON
#define rGPDDAT
#define rGPDUP
#define rGPGCON
#define rGPGDAT
#define rGPGUP
#define rLCDCON1
#define rLCDCON2
#define rLCDCON3
#define rLCDCON4
#define rLCDCON5
#define rLCDSADDR1 (*(volatile unsigned *)0x4d000014)
#define rLCDSADDR2 (*(volatile unsigned *)0x4d000018)
#define rLCDSADDR3 (*(volatile unsigned *)0x4d00001c)
#define rLCDINTMSK (*(volatile unsigned *)0x4d00005c)
#define rTCONSEL
#define LCD_WIDTH
#define LCD_HEIGHT 240
//垂直同步信號的脈寬、后肩和前肩
#define VSPW
#define VBPD
#define VFPD
//水平同步信號的脈寬、后肩和前肩
#define HSPW
#define HBPD
#define HFPD (20-1)
//顯示尺寸
#define LINeval_r(LCD_HEIGHT-1)
#define HOZVAL
//for LCDCON1
#define CLKVAL_TFT
#define MVAL_USED
#define PNRMODE_TFT
#define BPPMODE_TFT
//for LCDCON5
#define BPP24BL
#define INVVCLK
#define INVVLINE
#define INVVFRAME
#define INVVD
#define INVVDEN
#define PWREN
#define BSWP
#define HWSWP
//定義顯示緩存區(qū)
volatile U32 LCD_BUFFER[LCD_HEIGHT][LCD_WIDTH];
//延時(shí)程序
void delay(int a)
{
}
//繪制屏幕背景顏色,顏色為c
void Brush_Background( U32 c)
{
}
//畫實(shí)心圓,顏色為c。圓心在屏幕中心,半徑為80個(gè)像素
void Draw_Circular(U32 c)
{
}
void Main(void)
{
rGPCUP = 0x00000000;
rGPGUP=rGPGUP&(~(1<<4))|(1<<4);
rLCDCON1|=1;
while(1)
}
}
評論