STM32f4————TFTLCD显示实验代码(05)
/*******************************************************/
//⑥不同的 LCD驱动器不同的初始化设置
if(lcddev.id<0XFF||lcddev.id==0XFFFF||lcddev.id==0X9300)
//ID 不正确,新增 0X9300判断,因为9341 在未被复位的情况下会被读成9300
{
//尝试9341 ID 的读取
LCD_WR_REG(0XD3);
lcddev.id=LCD_RD_DATA(); //dummy read
lcddev.id=LCD_RD_DATA(); //读到 0X00
lcddev.id=LCD_RD_DATA(); //读取 93
lcddev.id<<=8;
lcddev.id|=LCD_RD_DATA(); //读取 41
if(lcddev.id!=0X9341) //非 9341,尝试是不是6804
{
LCD_WR_REG(0XBF);
lcddev.id=LCD_RD_DATA();//dummy read
lcddev.id=LCD_RD_DATA();//读回 0X01
lcddev.id=LCD_RD_DATA();//读回 0XD0
lcddev.id=LCD_RD_DATA();//这里读回 0X68
lcddev.id<<=8;
lcddev.id|=LCD_RD_DATA();//这里读回 0X04
if(lcddev.id!=0X6804) //也不是 6804,尝试看看是不是NT35310
{
LCD_WR_REG(0XD4);
lcddev.id=LCD_RD_DATA(); //dummy read
lcddev.id=LCD_RD_DATA(); //读回 0X01
lcddev.id=LCD_RD_DATA(); //读回 0X53
lcddev.id<<=8;
lcddev.id|=LCD_RD_DATA(); //这里读回0X10
if(lcddev.id!=0X5310) //也不是NT35310,尝试看看是不是NT35510
{
LCD_WR_REG(0XDA00);
lcddev.id=LCD_RD_DATA();//读回 0X00
LCD_WR_REG(0XDB00);
lcddev.id=LCD_RD_DATA();//读回 0X80
lcddev.id<<=8;
LCD_WR_REG(0XDC00);
lcddev.id|=LCD_RD_DATA();//读回 0X00
if(lcddev.id==0x8000)lcddev.id=0x5510;
//NT35510读回的 ID 是 8000H,为方便区分,我们强制设置为5510
}
}
}
}
if(lcddev.id==0X9341||lcddev.id==0X5310||lcddev.id==0X5510)
{ //如果是这三个 IC,则设置WR时序为最快
//重新配置写时序控制寄存器的时序
FSMC_Bank1E->BWTR[6]&=~(0XF<<0); //地址建立时间(ADDSET)清零
FSMC_Bank1E->BWTR[6]&=~(0XF<<8); //数据保存时间清零
FSMC_Bank1E->BWTR[6]|=3<<0; //地址建立时间为3个HCLK =18ns
FSMC_Bank1E->BWTR[6]|=2<<8; //数据保存时间为6ns*3 个HCLK=18ns
}else if(lcddev.id==0X6804||lcddev.id==0XC505)//6804/C505速度上不去,得降低
{
//重新配置写时序控制寄存器的时序
FSMC_Bank1E->BWTR[6]&=~(0XF<<0); //地址建立时间(ADDSET)清零
FSMC_Bank1E->BWTR[6]&=~(0XF<<8); //数据保存时间清零
FSMC_Bank1E->BWTR[6]|=10<<0; //地址建立时间为10 个HCLK =60ns
FSMC_Bank1E->BWTR[6]|=12<<8; //数据保存时间为6ns*13个HCLK=78ns
}
printf(" LCD ID:%x\r\n",lcddev.id); //打印 LCD ID
if(lcddev.id==0X9341) //9341初始化
{
……//9341初始化代码
}else if(lcddev.id==0xXXXX) //其他 LCD 初始化代码
{
……//其他LCD 驱动 IC,初始化代码
}
LCD_Display_Dir(0); //默认为竖屏显示
LCD_LED=1; //点亮背光
LCD_Clear(WHITE);
}
从初始化代码可以看出,LCD 初始化步骤为①~⑥在代码中标注:
① GPIO,FSMC 使能。
② GPIO 初始化:GPIO_Init()函数。
③ 设置引脚复用映射。
④ FSMC 初始化:FSMC_NORSRAMInit()函数。
⑤ FSMC 使能:FSMC_NORSRAMCmd()函数。
⑥ 不同的 LCD 驱动器的初始化代码。
该函数先对 FSMC 相关 IO 进行初始化,然后是 FSMC 的初始化,这个我们在前面都有介绍,最后根据读到的 LCD ID,对不同的驱动器执行不同的初始化代码,从上面的代码可以看出,这个初始化函数可以针对十多款不同的驱动 IC执行初始化操作,这样大大提高了整个程序的通用性。大家在以后的学习中应该多使用这样的方式,以提高程序的通用性、兼容性。
/*******************************************************/
|