您的位置:首页 > 其它

s3c2440控制TFT LCD

2011-10-28 23:00 239 查看
TFT LCD的时序比较复杂,因此S3C2440涉及TFT LCD的寄存器比较多。只要认真对照好LCD的说明书设置好相应2440寄存器就行了。TFT LCD并不难,但是一个小地方设置错了都可能导致显示不正常,而且十分难找到出错的地方。

下面是编译会涉及到东西:

1.时序和显示模式配置LCDCON1~5。

2.显示缓存的地址配置LCDSADDR1~3。

3.如果是三星的LCD可以使用LCC3600或LPC3600控制器,这时可以使用TCONSEL来开启它们,不是三星LCD的话设置TCONSEL=0。

4.彩色显示的话本人理解为有三种画图模式(有错的话麻烦指出):

1)不使用调色板,每像素的颜色信息直接存放在显示缓存上,通过VD0~23引脚直接给LCD,因些这种方法最大能显示24位色的图像。

2)使用临时调色板,只需要设置TPAL寄存打开临时调色板并赋颜色值给TPAL即可,这样整个LCD屏幕就会被填充为该颜色。由于TPAL存储的是24位的颜色值,因此也只能最大显示24位的图像。

3)使用调色板,地址0X4D0004000~0X4D0007FC这256地址内每个单元是16位的,可以用来存放要使用的颜色信息,使用调色板的话似乎能省去一些存储单元,如何去使用调色板还不清楚。。。

下面是程序,使用24位色无调色板方式:

#include "TFT_LCD35_lhg.h"

#include "2440addr.h"

#include "uart.h"

#define U32 unsigned int

#define LCD_WIDTH 320

#define LCD_HIGH 240

volatile U32 lcd_buffer[LCD_HIGH][LCD_WIDTH];//显示内容

//LCDCON1

#define S3C2440_LCDCON1_LINECNT_init (0<<18)

#define S3C2440_LCDCON1_CLKVAL_init (7<<8) /*TFT-LCD: HCLK=100MHZ,VCLK=HCLK/[(CLKVAL+1)*2]6.25MHZ*/

#define S3C2440_LCDCON1_MMODE_init (0<<7)

#define S3C2440_LCDCON1_PNRMODE_init (3<<5) /*TFT LCD panel*/

#define S3C2440_LCDCON1_BPPMODE_init (0x0d<<1) /*24 bpp for TFT*/

#define S3C2440_LCDCON1_ENVID_init (0) /*enable the video output and LCD control signal*/

#define S3C2440_LCDCON1_init() (rLCDCON1 = S3C2440_LCDCON1_LINECNT_init |/

S3C2440_LCDCON1_CLKVAL_init |/

S3C2440_LCDCON1_MMODE_init |/

S3C2440_LCDCON1_PNRMODE_init |/

S3C2440_LCDCON1_BPPMODE_init |/

S3C2440_LCDCON1_ENVID_init)

//LCDCON2

#define S3C2440_LCDCON2_VBPD_init ((15-1)<<24)

#define S3C2440_LCDCON2_LINEVAL_init ((240-1)<<14)

#define S3C2440_LCDCON2_VFPD_init ((12-1)<<6)

#define S3C2440_LCDCON2_VSPW_init (3-1)

#define S3C2440_LCDCON2_init() (rLCDCON2 = S3C2440_LCDCON2_VBPD_init |/

S3C2440_LCDCON2_LINEVAL_init |/

S3C2440_LCDCON2_VFPD_init |/

S3C2440_LCDCON2_VSPW_init )

//LCDCON3

#define S3C2440_LCDCON3_HBPD_init ((38-1)<<19)

#define S3C2440_LCDCON3_HOZVAL_init ((320-1)<<8)

#define S3C2440_LCDCON3_HFPD_init (20-1)

#define S3C2440_LCDCON3_init() (rLCDCON3 = S3C2440_LCDCON3_HBPD_init |/

S3C2440_LCDCON3_HOZVAL_init |/

S3C2440_LCDCON3_HFPD_init )

//LCDCON4

#define S3C2440_LCDCON4_MVAL_init (0<<8)

#define S3C2440_LCDCON4_HSPW_init (30-1)

#define S3C2440_LCDCON4_init() (rLCDCON4 = S3C2440_LCDCON4_MVAL_init |/

S3C2440_LCDCON4_HSPW_init )

//LCDCON5

#define S3C2440_LCDCON5_BPP24BL_init (0<<12)

#define S3C2440_LCDCON5_INVVCLK_init (1<<10)/*VCLK rising edge*/

#define S3C2440_LCDCON5_INVVLINE_init (1<<9)

#define S3C2440_LCDCON5_PWREN_init (1<<3)

#define S3C2440_LCDCON5_ENLEND_init (1<<2)

#define S3C2440_LCDCON5_init() (rLCDCON5 = S3C2440_LCDCON5_BPP24BL_init |/

S3C2440_LCDCON5_INVVCLK_init |/

S3C2440_LCDCON5_INVVLINE_init |/

S3C2440_LCDCON5_PWREN_init |/

S3C2440_LCDCON5_ENLEND_init)

//LCDSADDR

void set_LCDSADDR(U32 addr)

{

rLCDSADDR1 = (addr>>1)&0x3fffffff;

rLCDSADDR2 = (rLCDSADDR1&0x1fffff)+(LCD_WIDTH*32/16)*240;

rLCDSADDR3 = (0<<11)|(LCD_WIDTH*32/16);//宽度*每像素位数/16

}

void tft_lcd35_init(void)//初始化

{

int a,b;

for (b=0;b<LCD_HIGH;b++)

for (a=0;a<LCD_WIDTH;a++)

lcd_buffer[b][a]=0x000066;

//配置相关的引脚

rGPCUP = 0xffff;

rGPCCON = 0xaaaaaaaa;

rGPDUP = 0xffff;

rGPDCON = 0xaaaaaaaa;//VD[8]~VD[23]

rGPGUP = rGPGUP&(~(1<<4))|(1<<4);

rGPGCON = rGPGCON&(~(3<<8))|(3<<8); //LCD_PWREN

//设置显示地址

set_LCDSADDR((U32)lcd_buffer);

//配置LCDCON

S3C2440_LCDCON1_init();

S3C2440_LCDCON2_init();

S3C2440_LCDCON3_init();

S3C2440_LCDCON4_init();

S3C2440_LCDCON5_init();

rLCDINTMSK |= (3); // 屏蔽LCD中断

rTCONSEL = 0; //LCC3600和LPC3600无效

//rTPAL = 0x1CC0000;//使用临时调色板,暂时不用

rLCDCON1|=1; //LCD开启

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: