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開啓
 
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章