|
前阵子用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
{
uint16 iXaddr_Start;
uint16 iYaddr_Start;
uint16 iWidth;
uint16 iHeight;
}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[12] =
{
RED,
YELLOW,
GREEN,
INDIGO,
BLUE,
PURPLE,
BLACK,
WHITE,
GRAY,
ORANGE,
PINK,
BROWN
};
/*-----------------------------------------------------------------------*/
void TFT_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[3]);
TFT_SSD1963_WRDATA(temp);
temp = HI_UINT16(Color_Tab[3]);
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);
}
}
/*===============================*/
void Delay_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
}
void TFT_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);
}
void SSD1963_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 data interface
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();
}
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|