zqliao88 发表于 2013-7-11 06:32:33

请帮助SSD1963驱动白屏

    前阵子用PIC24EP32GP204+SSD1963,编写了一个4.3"TFT驱动程序。之前按着我原来的2.4"屏程序架构上修改,总是出现
一半黑屏和花屏,郁闷的是不管我怎么调整参数都无法改变这个显示状态,但说明一点,说明硬件线路问题不大。
然后参考网上的样板程序做如下的修改,则老是白屏,什么都不显示,只好求救网上朋友用过SSD1963驱动4.3",帮我看
看下面程序到底问题出在哪里,在此谢了。。。。。

#define TFT_RST_HIGH()    (_RC9= true)
#define TFT_RST_LOW()   (_RC9= false)
#define TFT_RS_HIGH()   (_RC8= true)
#define TFT_RS_LOW()      (_RC8= false)
#define TFT_CS_HIGH()   (_RA10 = true)
#define TFT_CS_LOW()      (_RA10 = false)
#define TFT_RD_HIGH()   (_RC7= true)
#define TFT_RD_LOW()      (_RC7= false)
#define TFT_WR_HIGH()   (_RC6= true)
#define TFT_WR_LOW()      (_RC6= false)

#define TFT_DATA_ALLOUT() {TRISB &= 0x0003; TRISC &= 0xffcf;}

#define TFT_BACKLIGHT_ON()    {_RA7= true;}
#define TFT_BACKLIGHT_OFF()   {_RA7= false;}

#define BUILD_UINT16(loByte,hiByte)   ((uint16)(((loByte) & 0x00FF) + (((hiByte) & 0x00FF) << 8)))
#define HI_UINT16(a)                  (((a) >> 8) & 0xFF)
#define LO_UINT16(a)                  ((a) & 0xFF)

//*+++++++++++++++*/
#define LCD_X_MAX       480
#define LCD_Y_MAX       272

#define LCD_HF_PORCH    43
#define LCD_HB_PORCH    3
#define LCD_HP_WIDTH    42
#define LCD_LPS         1
#define LCD_VF_PORCH    12
#define LCD_VB_PORCH    5
#define LCD_VP_WIDTH    11
#define LCD_FPS         1

#define        NOP_CMD                                                                                0x00
#define        SOFT_RESET_CMD                                                0x01
#define SLEEP_OUT_CMD             0x11
#define NORMAL_DISPLAY_MODEON_CMD 0x13
#define DISPLAY_ON_CMD            0x29
#define COLUMN_ADDRESS_SET_CMD    0x2a
#define PAGE_ADDRESS_SET_CMD      0x2b
#define MEMORY_WRITE_CMD          0x2c
#define MEMORY_ADDRESS_CTL_CMD    0x36
#define IDLE_OFF_CMD            0x38
#define PIXELFORMAT_SET_CMD       0x3a
#define WRITE_MEMORY_CONTINUE   0x3c
#define        SET_LCD_MODE_CMD                                        0xb0
#define        SET_HORI_PERIOD_CMD                                0xb4
#define        SET_VERT_PERIOD_CMD                                0xb6
#define        SET_GPIO_CONFIG_CMD                                0xb8
#define        SET_GPIO_VALUE_CMD                                0xba
#define        SET_PLL_CMD                                                                0xe0
#define        SET_PLL_MN_CMD                                                0xe2
#define        SET_LSHIFT_FREQ_CMD                                0xe6
#define        READ_LSHIFT_FREQ_CMD                        0xe7
#define INTERFACE_CTL_CMD         0xf0

typedef enum
{
RED         = 0xf800,       //1
YELLOW      = 0xffe0,       //2
GREEN         = 0x07e0,       //3
INDIGO      = 0x07ff,       //4
BLUE          = 0x001f,       //5
PURPLE      = 0xf81f,       //6
BLACK         = 0x0000,       //7
WHITE         = 0xffff,       //8
GRAY          = 0x7bef,       //9
ORANGE      = 0xfbe4,       //10
PINK          = 0xfd79,       //11
BROWN         = 0x8802,       //12
BROWN_1       = 0x0041,       //13
BLUE_AREA   = 0x137A,       //14
DIVIDE_LINE1= 0x0AF6,       //15
DIVIDE_LINE2= 0x345C      //16
}Colour_t;

typedef struct
{
uint16iXaddr_Start;
uint16iYaddr_Start;
uint16iWidth;
uint16iHeight;
}Image_Parameter_t;

Image_Parameter_t tImage_Argument;
Image_Parameter_t *pImage = &tImage_Argument;

/*========================================================================*/
void Delay_us(uint16 ustime);
void Delay_ms(uint16 msstime);
void SSD1963_TF4_3_Initial(void);
static void TFT_IO_Config(void);
static void TFT_Window_Setting(Image_Parameter_t *win);
void TFT_Color_Testing(Image_Parameter_t *pimage);
void TFT_DATA_LOAD(uint8 data);
void TFT_SSD1963_CMD(uint8 cmd);
void TFT_SSD1963_WRDATA(uint8 data);

const uint16 Color_Tab =
{
RED,
YELLOW,
GREEN,
INDIGO,
BLUE,
PURPLE,
BLACK,
WHITE,
GRAY,
ORANGE,
PINK,
BROWN
};

/*-----------------------------------------------------------------------*/
voidTFT_Color_Testing(Image_Parameter_t *pimage)
{
        uint16 ii,jj,temp;
       
TFT_Window_Setting(pimage);
for (ii=0; ii<LCD_X_MAX; ii++)
{
        for (jj=0; jj<LCD_Y_MAX; jj++)
        {
                TFT_SSD1963_CMD(WRITE_MEMORY_CONTINUE);
                        temp = LO_UINT16(Color_Tab);
                TFT_SSD1963_WRDATA(temp);
                temp = HI_UINT16(Color_Tab);
                TFT_SSD1963_WRDATA(temp);
        }
}
}


void Delay_us(uint16 ustime)
{
uint16 ii,jj;

for (ii=0; ii<ustime; ++ii)
{
    jj=4;
    do
    {
      asm("NOP");
      asm("NOP");
      asm("NOP");
      asm("NOP");
    }while (--jj);
}
}
/*===============================*/
voidDelay_ms(uint16 mstime)
{
while (mstime--)
{
    Delay_us(1000);
}
}

static void TFT_IO_Config(void)
{
        TFT_DATA_ALLOUT();
//RS,CS,RD,WR,RST
_TRISC9 = false;//0-output,1-input
TFT_RST_HIGH();

_TRISC8 = false;
TFT_RS_HIGH();

_TRISC7 = false;
TFT_RD_HIGH();

_TRISC6 = false;
TFT_WR_HIGH();

_TRISA10 = false;
TFT_CS_HIGH();
}

void TFT_SSD1963_CMD(uint8 cmd)
{
        TFT_RS_LOW();
        Delay_us(1);
        TFT_RD_HIGH();
        Delay_us(1);
        TFT_CS_LOW();
        Delay_us(1);
        TFT_DATA_LOAD(cmd);
        Delay_us(1);
        TFT_WR_LOW();
        Delay_us(1);
        TFT_WR_HIGH();
        Delay_us(1);
        TFT_CS_HIGH();
}
/*=======================================*/
void TFT_SSD1963_WRDATA(uint8 data)
{
        TFT_RS_HIGH();
        Delay_us(1);
        TFT_RD_HIGH();
        Delay_us(1);
        TFT_CS_LOW();
        Delay_us(1);
        TFT_DATA_LOAD(data);
        Delay_us(1);
        TFT_WR_LOW();
        Delay_us(1);
        TFT_WR_HIGH();
        Delay_us(1);
        TFT_CS_HIGH();
}
/*=======================================*/
void TFT_DATA_LOAD(uint8 data)
{
        uint16 dtemp;
       
        dtemp = BUILD_UINT16(data, 0x00);
#if defined (DEBUGGING)
        PORTC = ((PORTC&0xffcf) | ((dtemp&0x0003) << 4));
        PORTB = ((PORTB&0x0003) | (dtemp&0xfffc));
#else
        PORTB = dtemp;
#endif
}

voidTFT_Window_Setting(Image_Parameter_t *win)
{
        TFT_SSD1963_CMD(COLUMN_ADDRESS_SET_CMD);
        Delay_ms(50);
        TFT_SSD1963_WRDATA(HI_UINT16(win->iXaddr_Start));
        Delay_ms(50);
        TFT_SSD1963_WRDATA(LO_UINT16(win->iXaddr_Start));
        Delay_ms(50);
        TFT_SSD1963_WRDATA(HI_UINT16(win->iXaddr_Start + win->iWidth - 1));
        Delay_ms(50);
        TFT_SSD1963_WRDATA(LO_UINT16(win->iXaddr_Start + win->iWidth - 1));
        Delay_ms(50);
       
        TFT_SSD1963_CMD(PAGE_ADDRESS_SET_CMD);
        Delay_ms(50);
        TFT_SSD1963_WRDATA(HI_UINT16(win->iYaddr_Start));
        Delay_ms(50);
        TFT_SSD1963_WRDATA(LO_UINT16(win->iYaddr_Start));
        Delay_ms(50);
        TFT_SSD1963_WRDATA(HI_UINT16(win->iYaddr_Start + win->iHeight - 1));
        Delay_ms(50);
        TFT_SSD1963_WRDATA(LO_UINT16(win->iYaddr_Start + win->iHeight - 1));
        Delay_ms(50);
       
        TFT_SSD1963_CMD(MEMORY_WRITE_CMD);
        //TFT_SSD1963_CMD(WRITE_MEMORY_CONTINUE);
        Delay_ms(50);
}

voidSSD1963_TF4_3_Initial(void)
{
//VCL=3.3V
//TFT_BACKLIGHT_ON();
TFT_IO_Config();
/************ Reset LCD Driver *******************/
TFT_RST_HIGH();
Delay_ms(10);
TFT_RST_LOW();
Delay_ms(15);
TFT_RST_HIGH();
Delay_ms(250);
/************ Start Initial Sequence *************/
Delay_ms(5);
TFT_SSD1963_CMD(NOP_CMD);                                                        //0x00,nop
TFT_SSD1963_CMD(NOP_CMD);                                                        //0x00,nop
Delay_ms(5);
TFT_SSD1963_CMD(SOFT_RESET_CMD);                        //0x01,reset
Delay_ms(50);

TFT_SSD1963_CMD(SLEEP_OUT_CMD);                                //0x11,sleep out
Delay_ms(20);

TFT_SSD1963_CMD(NORMAL_DISPLAY_MODEON_CMD);        //0x13,normal display mode
Delay_ms(5);

//set pll MN
TFT_SSD1963_CMD(SET_PLL_MN_CMD);                //0xe2
TFT_SSD1963_WRDATA(0x2c);
TFT_SSD1963_WRDATA(0x02);
TFT_SSD1963_WRDATA(0x04);
Delay_ms(5);

//pll enable
TFT_SSD1963_CMD(SET_PLL_CMD);                        //0xe0
Delay_ms(5);
TFT_SSD1963_WRDATA(0x01);
Delay_ms(20);
TFT_SSD1963_CMD(SET_PLL_CMD);                        //0xe0
        Delay_ms(20);
        TFT_SSD1963_WRDATA(0x03);
        Delay_ms(20);

        //pixel datainterface
        TFT_SSD1963_CMD(INTERFACE_CTL_CMD);                //0xf0,????
        TFT_SSD1963_WRDATA(0x03);                                                        //8bit

        //pixel format
        TFT_SSD1963_CMD(PIXELFORMAT_SET_CMD);        //0x3a,????
        TFT_SSD1963_WRDATA(0x70);                                                        //24bit
        Delay_ms(20);

        //dotclk setting
        TFT_SSD1963_CMD(SET_LSHIFT_FREQ_CMD);                //0xe6
TFT_SSD1963_WRDATA(0x01);
TFT_SSD1963_WRDATA(0x47);
TFT_SSD1963_WRDATA(0xbe);

//panel setting
TFT_SSD1963_CMD(SET_LCD_MODE_CMD);                //0xb0
TFT_SSD1963_WRDATA(0x20);
TFT_SSD1963_WRDATA(0x00);
TFT_SSD1963_WRDATA(HI_UINT16(LCD_X_MAX-1));
TFT_SSD1963_WRDATA(LO_UINT16(LCD_X_MAX-1));
TFT_SSD1963_WRDATA(HI_UINT16(LCD_Y_MAX-1));
TFT_SSD1963_WRDATA(LO_UINT16(LCD_Y_MAX-1));
TFT_SSD1963_WRDATA(0x00);

//hysnc setting
TFT_SSD1963_CMD(SET_HORI_PERIOD_CMD);                //0xb4
TFT_SSD1963_WRDATA(HI_UINT16(LCD_HF_PORCH + LCD_HB_PORCH + LCD_X_MAX - 1));
TFT_SSD1963_WRDATA(LO_UINT16(LCD_HF_PORCH + LCD_HB_PORCH + LCD_X_MAX - 1));
TFT_SSD1963_WRDATA(0x00);
TFT_SSD1963_WRDATA(LCD_HF_PORCH);
TFT_SSD1963_WRDATA(LCD_HP_WIDTH);
TFT_SSD1963_WRDATA(0x00);
TFT_SSD1963_WRDATA(LCD_LPS);
TFT_SSD1963_WRDATA(0x00);

//vsync setting
TFT_SSD1963_CMD(SET_VERT_PERIOD_CMD);                //0xb6
TFT_SSD1963_WRDATA(HI_UINT16(LCD_VF_PORCH + LCD_VB_PORCH + LCD_Y_MAX -1));
TFT_SSD1963_WRDATA(LO_UINT16(LCD_VF_PORCH + LCD_VB_PORCH + LCD_Y_MAX -1));
TFT_SSD1963_WRDATA(0x00);
TFT_SSD1963_WRDATA(LCD_VF_PORCH);
TFT_SSD1963_WRDATA(LCD_VP_WIDTH);
TFT_SSD1963_WRDATA(0x00);
TFT_SSD1963_WRDATA(LCD_FPS);

        //address mode
        TFT_SSD1963_CMD(MEMORY_ADDRESS_CTL_CMD);                //0x36
        TFT_SSD1963_WRDATA(0x00);

        /************ Reset LCD Driver *******************/
        //TFT_RST_HIGH();
//Delay_ms(30);
//TFT_RST_LOW();
//Delay_ms(30);
//TFT_RST_HIGH();
//Delay_ms(30);

//display on
TFT_SSD1963_CMD(DISPLAY_ON_CMD);                //0x29,display on
Delay_ms(10);

//Initialze TFT window parameter
pImage->iXaddr_Start = 0;
pImage->iYaddr_Start = 0;
pImage->iWidth       = LCD_X_MAX;
pImage->iHeight      = LCD_Y_MAX;

TFT_Color_Testing(pImage);                                //显示任意单色
TFT_BACKLIGHT_ON();
}


页: [1]
查看完整版本: 请帮助SSD1963驱动白屏