寫下幾點注意事項:
1、不要急著寫屏,首先讀ID,確認驅(qū)動IC是否ILI9325。ILI9320、ILI9325、ILI9328等驅(qū)動IC的初始化參數(shù)會稍有不同。讀ID還可以確認數(shù)據(jù)接口選擇的正確性。如果是16位數(shù)據(jù)接口,ID讀到0x9325;如果是8位數(shù)據(jù)接口,ID讀兩次可得0x93,0x25。
2、雖然TFT屏的初始化參數(shù)比較多,但參數(shù)要求并不很嚴格,不會因為一點點的差錯而點不亮(當(dāng)然,不寫display on的命令肯定不會亮),所以,在點不亮?xí)r不要首先懷疑Init()的參數(shù)設(shè)置,應(yīng)該先檢查連線的正確性,I/O口的設(shè)置。
3、要注意給RST的復(fù)位有足夠的時間,寫命令和寫數(shù)據(jù)的子函數(shù)里RS的選擇。
4、賣屏的商家通常提供的是STC的例程,若STM32驅(qū)不起來,可先用STC把屏點亮,以確認該屏正常,再仔細尋找問題所在。
以下是例程,該例程使用I/O口驅(qū)動,雖然選擇16位數(shù)據(jù)接口,但刷屏速度有點慢,建議使用LCD總線。背光使用PWM調(diào)節(jié)對比度(該段程序省略):
#defineP_TFT_RS GPIOB
#define TFT_RS GPIO_Pin_0
#defineP_TFT_WR GPIOB
#define TFT_WR GPIO_Pin_1
#defineP_TFT_RD GPIOB
#define TFT_RD GPIO_Pin_2
#defineP_TFT_CS GPIOB
#define TFT_CS GPIO_Pin_10
#defineP_TFT_RSTGPIOB
#define TFT_RST GPIO_Pin_11
#defineP_TFT_BK GPIOB
#define TFT_BKGPIO_Pin_7 // TIM4_CH2 PWM
#define Set_CS GPIO_SetBits(P_TFT_CS,TFT_CS);
#define Clr_CS GPIO_ResetBits(P_TFT_CS,TFT_CS);
#define Set_RSGPIO_SetBits(P_TFT_RS,TFT_RS);
#define Clr_RS GPIO_ResetBits(P_TFT_RS,TFT_RS);
#define Set_WR GPIO_SetBits(P_TFT_WR,TFT_WR);
#define Clr_WR GPIO_ResetBits(P_TFT_WR,TFT_WR);
#define Set_RD GPIO_SetBits(P_TFT_RD,TFT_RD);
#define Clr_RD GPIO_ResetBits(P_TFT_RD,TFT_RD);
#define Set_RST GPIO_SetBits(P_TFT_RST,TFT_RST);
#define Clr_RST GPIO_ResetBits(P_TFT_RST,TFT_RST);
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;// for PWM
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void DataToIO(u16 val)
{
u16 dat;
dat = GPIO_ReadOutputData(GPIOC);// DBL
dat = (dat&0xFF00) | (val&0xFF);
GPIO_Write(GPIOC, dat);
dat = GPIO_ReadOutputData(GPIOA);// DBH
dat = (dat&0xFF00) | ((val>>8)&0xFF);
GPIO_Write(GPIOA, dat);
}
void TFT_Write_com(u16 dat) //發(fā)送命令
{
Clr_RS;
Set_RD;
DataToIO(dat);
Clr_WR;
Set_WR;
}
void TFT_Write_dat(u16 dat)// 發(fā)送數(shù)據(jù)
{
Set_RS;
Set_RD;
DataToIO(dat);
Clr_WR;
Set_WR;
}
u16 TFT_ReadReg(u16 reg)
{
u16 datL, datH;
GPIO_InitTypeDef GPIO_InitStructure;
Clr_CS;
TFT_Write_com(reg);
GPIO_InitStructure.GPIO_Pin = 0xFF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ;// 上拉輸入
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIOA->ODR = 0xFFFF;
GPIOC->ODR = 0xFFFF;
Set_RS;
Set_WR;
Clr_RD;
datH = GPIOA->IDR;
datL = GPIOC->IDR;
Set_RD;
Set_CS;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = 0xFF;
GPIO_Init(GPIOA, &GPIO_InitStructure);
DataToIO(0xFFFF);
datH = ((datH<<8)&0xFF00) | (datL&0x00FF);
return(datH);
}
評論