新闻中心

EEPW首页>嵌入式系统>设计应用> STM32驱动TFT显示屏ILI9325

STM32驱动TFT显示屏ILI9325

作者: 时间:2016-11-24 来源:网络 收藏
2.4寸TFT240370PQ显示屏,驱动IC为ILI9325。该屏屏幕电源为2.8~3.3V,背光电源最高3.2V(在3.3V电源下串20Ω电阻或5V下串200Ω电阻),兼容8/16位数据接口(可选)。数据口电平理论上不能超3.3V,由于TFT内部有电压钳位,样品测试时可使用5V单片机。

  写下几点注意事项:

1、不要急着写屏,首先读ID,确认驱动IC是否ILI9325。ILI9320、ILI9325、ILI9328等驱动IC的初始化参数会稍有不同。读ID还可以确认数据接口选择的正确性。如果是16位数据接口,ID读到0x9325;如果是8位数据接口,ID读两次可得0x93,0x25。

2、虽然TFT屏的初始化参数比较多,但参数要求并不很严格,不会因为一点点的差错而点不亮(当然,不写display on的命令肯定不会亮),所以,在点不亮时不要首先怀疑Init()的参数设置,应该先检查连线的正确性,I/O口的设置。

3、要注意给RST的复位有足够的时间,写命令和写数据的子函数里RS的选择。

4、卖屏的商家通常提供的是STC的例程,若STM32驱不起来,可先用STC把屏点亮,以确认该屏正常,再仔细寻找问题所在。

  以下是例程,该例程使用I/O口驱动,虽然选择16位数据接口,但刷屏速度有点慢,建议使用LCD总线。背光使用PWM调节对比度(该段程序省略):


#defineP_TFT_RS   GPIOB
#define TFT_RS   GPIO_Pin_0
#defineP_TFT_WR  GPIOB
#define TFT_WR    GPIO_Pin_1
#defineP_TFT_RDGPIOB
#define TFT_RDGPIO_Pin_2
#defineP_TFT_CSGPIOB
#define TFT_CSGPIO_Pin_10
#defineP_TFT_RSTGPIOB
#define TFT_RSTGPIO_Pin_11
#defineP_TFT_BKGPIOB
#define TFT_BKGPIO_Pin_7// TIM4_CH2PWM


#define Set_CSGPIO_SetBits(P_TFT_CS,TFT_CS);
#define Clr_CSGPIO_ResetBits(P_TFT_CS,TFT_CS);

#define Set_RSGPIO_SetBits(P_TFT_RS,TFT_RS);
#define Clr_RSGPIO_ResetBits(P_TFT_RS,TFT_RS);

#define Set_WRGPIO_SetBits(P_TFT_WR,TFT_WR);
#define Clr_WRGPIO_ResetBits(P_TFT_WR,TFT_WR);

#define Set_RDGPIO_SetBits(P_TFT_RD,TFT_RD);
#define Clr_RDGPIO_ResetBits(P_TFT_RD,TFT_RD);

#define Set_RSTGPIO_SetBits(P_TFT_RST,TFT_RST);
#define Clr_RSTGPIO_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)//发送命令
{
Clr_RS;
Set_RD;
DataToIO(dat);
Clr_WR;
Set_WR;
}


void TFT_Write_dat(u16 dat)// 发送数据
{
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 下一页

评论


技术专区

关闭