打印
[STM32]

STM32f4 TFTLCD显示实验代码(05)

[复制链接]
1023|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
小乐Tzz|  楼主 | 2018-9-11 13:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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执行初始化操作,这样大大提高了整个程序的通用性。大家在以后的学习中应该多使用这样的方式,以提高程序的通用性、兼容性。
/*******************************************************/



相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

70

主题

70

帖子

0

粉丝