×
单片机 > 单片机程序设计 > 详情

Stm32的TFT LCD显示器控制学习笔记

发布时间:2020-06-22 发布时间:
|
学习stm32,TFT LCD显示屏控制是很重要的一章,本人在初步学习STM32遇到了很多困难,所以把学习中积累的部分感觉重要的知识点罗列出来。目前常用的TFT液晶内部驱动芯片是ILI9320,ILI9325系列,内部原理基本一致,我用的是ILI9320。用stm32驱动液晶,实际上就是驱动ILI9320芯片。点亮TFT LCD的具体步骤有:

(1)stm32与ILI9320芯片管脚的初始化。

void LCD_Init(void); /*初始化LCD,也就是初始化LCD控制器ILI9320芯片与stm32控制器的管脚连接配置*/其中包括CS:TFTLCD片选信号,WR:向TFTLCD写入信号,RD:从TFTLCD读取信号,DB(15--0):16位双向数据线,RST:硬复位TFTLCD,RS:命令/数据标志(0 读写命令;1 读写数据),TFT模块有个控制器,名为ILI9320,该控制器自带显存,其显存总大小为172820,模块数据线与显存的对应关系位565方式


SGRAM (Synchronous Graphics Random-Access Memory),同步图形随机存储器,是一种专为显卡设计的显存、一种图形读写能力较强的显存,由SDRAM改良而成。SGRAM读写数据时不是一一读取,而是以“块”(Block)为单位,从而减少了内存整体读写的次数,提高了图形控制器的效率。同SDRAM一样,SGRAM也分普通SGRAM与DDR SGRAM两种。

R0,这个命令有两个功能,如果对它写,则最低位位OSC,用于开启或关闭振荡器,而如果对它读,返回控制器型号。我们知道了控制器型号,可以针对不同型号的控制器,进行不同对的初始化。

R3,入口模式命令。重点关注I/D0,I/D1,AM这三个位,因为这3个位控制了屏幕的显示方向。AM:控制GRAM更新方向,当AM=0的时候,地址以行方向更新,当为1的时候,地址以列方向更新。I/D[1:0]:当更新了一个数据之后,根据这两个位的设置来控制地址计数器自动增加/减少1,其关系图如下

R7,显示控制命令。该命令CL位用来控制是8位彩色,还是26万色。为0是26万色,为1时八位色。D1,D0,BASEE这三个位用来控制显示开关与否的。

当全部置1的时候开启显示,全0是关闭。我们一般通过该命令的设置来开启或关闭显示器,以降低功耗。

    R22,(读/写)数据(到/从)GRAM。

R32,R33,设置GRAM的行地址和列地址。R32用于设置列地址(X坐标,0~239),R33用于设置行地址(Y坐标,0~319)。当我们要在某个指定点写入一个颜色的时候,先通过这两个命令设置到改点,然后写入颜色值就可以了。

R34,写数据到GRAM命令,当写入了这个命令之后,地址计数器才会自动的增加和减少。

R80~R83,行列GRAM地址位置设置。这几个命令用于设定你显示区域的大小,我们整个屏的大小240*320, 但是有时候我们只需要在其中一部分区域写入数据,如果用先写坐标,后写数据这样的方式来实现,则速度大打折扣。

此时我们可以通过这几个命令,在其中开辟一个区域,然后不停地丢数据,地址计数器就会根据R3的设置自动增加/减小,这样就不需要频繁的写地址了,大大提高了刷新的速度。

(2)具体TFTLCD模块功能程序

显示屏宽度参数定义


#define LCD_W 240
#define LCD_H 320
#define    LCD_LED   PCout()//LCD背光          
#define    LCD_CS   PCout() //片选端口      
#define    LCD_RS      PCout()  //数据/命令         
#define    LCD_WR  PCout() //写数据               
#define    LCD_RD      PCout()  //读数据        
A.       写寄存器
首先根据英文版的ILI9320 datasheet 描述的关于写寄存器控制管脚的主要配置。下图所示:
图:写寄存器波形图
 
 voidLCD_WriteReg(u16 LCD_Reg,u16 LCD_RegValue)
{
     /* Write 16-bit Index, thenWrite Reg */
     ClrCs       //片选复位
      ClrRs      //选择命令
     ClrWr       //写数据复位
      LCD_Write(LCD_Reg);     //写入操作指令代码
      SetWr      //写数据置位
     /* 写16位的数据到指定寄存器*/
     SetRs
     ClrWr
     LCD_Write(LCD_RegValue);   //写数据
     SetWr
      SetCs
}
B. 读寄存器
图:读寄存器波形图
 
u16 LCD_ReadReg(u8 LCD_Reg)
{
  u16data;
  ClrCs
  ClrRs
  ClrWr
 LCD_Write(LCD_Reg);
  SetWr
 
  SetRs
  ClrRd
  SetRd
  data= LCD_Read();
  SetCs
  return   data;
}
C.   写GRAM
图:写GRAM波形图
/*读GRAM准备过程*/
void LCD_WriteRAM_Prepare(void) 
{
  /*Write 16-bit Index, then Write Reg */
  ClrCs
  ClrRs
  ClrWr
 LCD_Write(0x22);
  SetWr
  SetCs
}
/*读GRAM*/
void LCD_WriteRAM(u16 RGB_Code)                                 
{
  /*Write 16-bit Index, then Write Reg */
  ClrCs
  SetRs
  ClrWr
 LCD_Write(RGB_Code);
  SetWr
  SetCs
}
D.  读GRAM
图:读GRAM波形图
u16 LCD_ReadRAM(void)
{
  u16dummy;
  u16data;
 LCD_WriteRAM_Prepare();
 LCD_DB_AS_InPut();   //将DB端口设置为输入模式
  dummy= LCD_ReadSta();
 dummy++;
  data= LCD_ReadSta();
 LCD_DB_AS_OutPut();
 return    data;
}

 

E.剩下的部分就是控制液晶画点划线,显示图像的内容,跟51时代的控制液晶基本类似。

关键字:Stm32  TFT  LCD  显示器控制 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
Keil(MDK-ARM)系列教程(七)_菜单