STM32 ILI9341驱动TFTLCD屏(二)
- 来源:纷纭杂谈
- 时间:2023-07-27 16:37:40
(相关资料图)
ILI9341集成了240x320x18位图形类型静态RAM,也可称为显存。这个172,800字节的内存允许存储具有18位分辨率(262K-color)的240xRGBx320图像。当同时存在面板显示读操作和对帧内存相同位置的接口读/写操作时,对显示没有异常的可见效果。
移动图像区域可以通过窗口地址函数在内部GRAM中指定。可以有选择地更新指定的窗口区域,这样就可以独立于静止图像区域同时显示移动图像。
ILI9341有很多调节指令集:
从图中表格可以看到指令集的时序和指令码,可以根据需要把指令封装成相对应的功能函数。举例说明一个,如果想要配置软件复位函数,首先找到软件复位相对应的说明。
软件复位的指令码为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); //清屏
至此,把常用的指令封装成函数就完成了。
关键词: