s3c2440控制TFT LCD

 

  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开启
 
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值