新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STM32驅(qū)動(dòng)TFT顯示屏ILI9325

STM32驅(qū)動(dòng)TFT顯示屏ILI9325

作者: 時(shí)間:2016-11-24 來源:網(wǎng)絡(luò) 收藏
2.4寸TFT240370PQ顯示屏,驅(qū)動(dòng)IC為ILI9325。該屏屏幕電源為2.8~3.3V,背光電源最高3.2V(在3.3V電源下串20Ω電阻或5V下串200Ω電阻),兼容8/16位數(shù)據(jù)接口(可選)。數(shù)據(jù)口電平理論上不能超3.3V,由于TFT內(nèi)部有電壓鉗位,樣品測(cè)試時(shí)可使用5V單片機(jī)。

  寫下幾點(diǎn)注意事項(xiàng):

1、不要急著寫屏,首先讀ID,確認(rèn)驅(qū)動(dòng)IC是否ILI9325。ILI9320、ILI9325、ILI9328等驅(qū)動(dòng)IC的初始化參數(shù)會(huì)稍有不同。讀ID還可以確認(rèn)數(shù)據(jù)接口選擇的正確性。如果是16位數(shù)據(jù)接口,ID讀到0x9325;如果是8位數(shù)據(jù)接口,ID讀兩次可得0x93,0x25。

2、雖然TFT屏的初始化參數(shù)比較多,但參數(shù)要求并不很嚴(yán)格,不會(huì)因?yàn)橐稽c(diǎn)點(diǎn)的差錯(cuò)而點(diǎn)不亮(當(dāng)然,不寫display on的命令肯定不會(huì)亮),所以,在點(diǎn)不亮?xí)r不要首先懷疑Init()的參數(shù)設(shè)置,應(yīng)該先檢查連線的正確性,I/O口的設(shè)置。

3、要注意給RST的復(fù)位有足夠的時(shí)間,寫命令和寫數(shù)據(jù)的子函數(shù)里RS的選擇。

4、賣屏的商家通常提供的是STC的例程,若STM32驅(qū)不起來,可先用STC把屏點(diǎn)亮,以確認(rèn)該屏正常,再仔細(xì)尋找問題所在。

  以下是例程,該例程使用I/O口驅(qū)動(dòng),雖然選擇16位數(shù)據(jù)接口,但刷屏速度有點(diǎn)慢,建議使用LCD總線。背光使用PWM調(diào)節(jié)對(duì)比度(該段程序省略):


#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);
}


上一頁 1 2 下一頁

評(píng)論


技術(shù)專區(qū)

關(guān)閉