STM32 ILI9341驱动TFTLCD屏(二)

接口/总线/驱动

1136人已加入

描述

ILI9341集成了240x320x18位图形类型静态RAM,也可称为显存。这个172,800字节的内存允许存储具有18位分辨率(262K-color)的240xRGBx320图像。当同时存在面板显示读操作和对帧内存相同位置的接口读/写操作时,对显示没有异常的可见效果。

移动图像区域可以通过窗口地址函数在内部GRAM中指定。可以有选择地更新指定的窗口区域,这样就可以独立于静止图像区域同时显示移动图像。

ILI9341有很多调节指令集:

STM32

STM32

STM32

从图中表格可以看到指令集的时序和指令码,可以根据需要把指令封装成相对应的功能函数。举例说明一个,如果想要配置软件复位函数,首先找到软件复位相对应的说明。

STM32

软件复位的指令码为0x01。当编写软件重置命令时,它将导致软件重置。它将命令和参数重置为它们的S/W重置默认值。软件重置后,需要等待5ms才能发送新命令。在此5ms期间,显示模块将所有显示供应商工厂默认值加载到寄存器。如果软件重置是在休眠模式下应用,它将需要等待120ms才能发送Sleep out命令。软件重置命令无法在休眠期间发送序列。为了休眠模式等待120ms,统一让软件复位后等待120ms。

//软件复位
void ILI9341_SoftwareReset()
{
  LCD_CS_L();                //片选有效
  ILI9341_WriteCmd(0x01);    //指令码为0x01
  Delay_ms(120);             //等待120ms
  LCD_CS_H();                //片选失效
}

对于其他需要的指令封装成相对应的功能函数,只要根据ILI9341手册按照以上步骤依次封装即可,这里就不再一一讲述了。以下给出一部分常用指令封装成的函数:

//软件复位
void ILI9341_SoftwareReset(void)
{
  LCD_CS_L();              //片选有效
  ILI9341_WriteCmd(0x01);  //指令码为0x01
  Delay_ms(120);          //等待120ms
  LCD_CS_H();              //片选失效
}


//休眠模式
void ILI9341_EnterSleepMode()
{
  LCD_CS_L();              //片选有效
  ILI9341_WriteCmd(0x10); //指令码为0x10
  LCD_CS_H();             //片选失效
  Delay_ms(120);          //等待120ms
}


//退出休眠
void ILI9341_ExitSleepMode()
{
  LCD_CS_L();              //片选有效
  ILI9341_WriteCmd(0x11); //指令码为0x11
  LCD_CS_H();             //片选失效
  Delay_ms(120);          //等待120ms
}


//反白显示开
void ILI9341_InverseOn()
{
  LCD_CS_L();              //片选有效
  ILI9341_WriteCmd(0x21); //指令码为0x21
  LCD_CS_H();             //片选失效
}                        


//反白显示关,正常显示
void ILI9341_InverseOff()
{
  LCD_CS_L();              //片选有效
  ILI9341_WriteCmd(0x20); //指令码为0x20
  LCD_CS_H();             //片选失效
}


//显示器关,内存数据不变,屏幕插入一个空白页
void ILI9341_DisplayOff()
{
  LCD_CS_L();              //片选有效
  ILI9341_WriteCmd(0x28); //指令码为0x28
  LCD_CS_H();             //片选失效
}


//显示器开
void ILI9341_DisplayOn()
{
  LCD_CS_L();              //片选有效
  ILI9341_WriteCmd(0x29); //指令码为0x29
  LCD_CS_H();             //片选失效
}


//列地址设置
void ILI9341_SetColumnAddr(u16 StartCol,u16 EndCol)
{
  LCD_CS_L();                      //片选有效
  ILI9341_WriteCmd(0x2a);         //指令码为0x2a
  ILI9341_WriteParam(StartCol > >8);//发送起始列位置高8位
  ILI9341_WriteParam(StartCol > >0);//发送起始列位置低8位
  ILI9341_WriteParam(EndCol > >8);  //发送停止列位置高8位
  ILI9341_WriteParam(EndCol > >0);  //发送停止列位置低8位
  LCD_CS_H();                      //片选失效
}


//行地址设置
void ILI9341_SetPageAddr(u16 StartPage,u16 EndPage)
{
  LCD_CS_L();                          //片选有效
  ILI9341_WriteCmd(0x2b);             //指令码为0x2b
  ILI9341_WriteParam(StartPage > >8);   //发送起始行位置高8位
  ILI9341_WriteParam(StartPage > >0);   //发送起始行位置低8位
  ILI9341_WriteParam(EndPage > >8);     //发送停止行位置高8位
  ILI9341_WriteParam(EndPage > >0);     //发送停止行位置低8位
  LCD_CS_H();                         //片选失效
}


//内存写入
void ILI9341_WriteMemory(u16 *buf,u32 size)
{
  u32 i = 0;
  ILI9341_WriteCmd(0X2C);          //指令码为0x2b
  for(i=0;i< size;i++)              //要写入大小
  {
    ILI9341_WriteParam(*buf++);    //写入像素点颜色      
  }
}


//局部模式要配合命令0x30来指定局部窗口
void ILI9341_PartialModeOn()
{
  LCD_CS_L();                //片选有效
  ILI9341_WriteCmd(0x12);   //指令码为0x12
  LCD_CS_H();               //片选失效
}


//设定局部窗口范围
void ILI9341_SetPartialArea(u16 StartRow,u16 EndRow)
{
  LCD_CS_L();                        //片选有效
  ILI9341_WriteCmd(0x30);           //指令码为0x30
  ILI9341_WriteParam(StartRow > >8);  //发送起始行位置高8位
  ILI9341_WriteParam(StartRow > >0);  //发送起始行位置低8位
  ILI9341_WriteParam(EndRow > >8);    //发送停止行位置高8位
  ILI9341_WriteParam(EndRow > >0);    //发送停止行位置低8位
  LCD_CS_H();                        //片选失效
}


//正常模式,局部模式关闭
void ILI9341_PartialModeOff()
{
  LCD_CS_L();                  //片选有效
  ILI9341_WriteCmd(0x13);     //指令码为0x13
  LCD_CS_H();                 //片选失效
}


//设定垂直滚动范围
//tfa:顶端固定区域
//vsa:垂直滚动区域
//bfa:低端固定区域
void ILI9341_VertScrollDef(u16 tfa,u16 vsa,u16 bfa)
{
  LCD_CS_L();                   //片选有效
  ILI9341_WriteCmd(0x33);       //指令码为0x33
  ILI9341_WriteParam(tfa > >8);   //发送顶端固定区域tfa高8位
  ILI9341_WriteParam(tfa > >0);  //发送顶端固定区域tfa低8位
  ILI9341_WriteParam(vsa > >8);  //发送垂直滚动区域vsa高8位
  ILI9341_WriteParam(vsa > >0);  //发送垂直滚动区域vsa低8位
  ILI9341_WriteParam(bfa > >8);   //发送低端固定区域bfa高8位
  ILI9341_WriteParam(bfa > >0);  //发送低端固定区域bfa低8位
  LCD_CS_H();                   //片选失效
}


//vsp是指把滚动区域第几行作为顶端固定区域下的第一行
void ILI9341_VertScrollStartAdd(u16 vsp)
{
  LCD_CS_L();                  //片选有效
  ILI9341_WriteCmd(0x37);      //指令码为0x37
  ILI9341_WriteParam(vsp > >8);  //发送滚动区域第几行vsp高8位
  ILI9341_WriteParam(vsp > >0);  //发送滚动区域第几行vsp低8位
  LCD_CS_H();                  //片选失效
}


//扫描设置
//第3位BGR为1时为RGB顺序,为0时为BGR顺序
void ILI9341_MemoryAccessControl(u16 dat)
{
  LCD_CS_L();                //片选有效
  ILI9341_WriteCmd(0x36);    //指令码为0x36
  ILI9341_WriteParam(dat);  //发送设置扫描的参数
  LCD_CS_H();                //片选失效
}


//清屏
void ILI9341_ClearScreen(u32 col)    //col为清屏的颜色
{
  u32 i = 0;
  ILI9341_WriteCmd(0X2C);            //指令码为0x36
  for(i=0;i< 240*320;i++)            //屏幕大小
  {
    ILI9341_WriteParam(col);        //写入清屏颜色
  }
}

调用以上函数,就可以实现屏幕的很多操作了。对于这么多函数,查找时很不方便,又不好辨别功能,所以在头文件中声明时顺便加上每个函数的功能注释,方便后面的应用。

void ILI9341_Init(void);                             //ILI9341初始化
void ILI9341_SoftwareReset(void);                     //软件复位
void ILI9341_EnterSleepMode(void);                   //休眠模式
void ILI9341_ExitSleepMode(void);                     //退出休眠
void ILI9341_InverseOn(void);                         //反白显示开
void ILI9341_InverseOff(void);                       //反白显示关
void ILI9341_DisplayOff(void);                       //关显示
void ILI9341_DisplayOn(void);                         //开显示
void ILI9341_SetColumnAddr(u16 StartCol,u16 EndCol); //列地址设置
void ILI9341_SetPageAddr(u16 StartPage,u16 EndPage); //页地址设置
void ILI9341_WriteMemory(u16 *buf,u32 size);         //内存写入
void ILI9341_PartialModeOn(void);                     //局部模式开,要配合命令0x30来指定局部窗口
void ILI9341_SetPartialArea(u16 StartRow,u16 EndRow);//设定局部窗口范围
void ILI9341_PartialModeOff(void);                   //局部模式关闭,正常窗口模式
void ILI9341_VertScrollDef(u16 tfa,u16 vsa,u16 bfa); //设定垂直滚动范围
void ILI9341_VertScrollStartAdd(u16 vsp);             //把滚动区域第几行作为顶端固定区域下的第一行
void ILI9341_MemoryAccessControl(u16 dat);           //扫描设置
void ILI9341_ClearScreen(u32 col);                   //清屏

至此,把常用的指令封装成函数就完成了。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分