STM32 ILI9341驱动TFTLCD屏(二)

发布者:trendsetter9最新更新时间:2024-04-29 来源: elecfans关键字:STM32  ILI9341 手机看文章 扫描二维码
随时随地手机看文章

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);                   //清屏

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


关键字:STM32  ILI9341 引用地址:STM32 ILI9341驱动TFTLCD屏(二)

上一篇:STM32 ILI9341驱动TFTLCD屏(三)
下一篇:如何设计STM32嵌入式程序的超时机制?

推荐阅读最新更新时间:2024-11-12 23:54

STM32开发笔记74: STM32L0低功耗唤醒后的时钟选择
单片机型号:STM32L053R8T6 本文介绍STM32L0系列单片机低功耗唤醒后的时钟选择。 参看已有的低功耗例程,发现都使能了HSI时钟,一致没有深究其中的具体原因,今天把它搞明白了,现记录如下: 先看一下,使能低功耗的函数: void CTarget::EnableLowPower(void) { HAL_PWREx_EnableUltraLowPower(); HAL_PWREx_EnableFastWakeUp(); __HAL_RCC_WAKEUPSTOP_CLK_CONFIG(RCC_STOP_WAKEUPCLOCK_HSI); DisableAllIO(); } 第1句使能超低功耗,第2句
[单片机]
<font color='red'>STM32</font>开发笔记74: STM32L0低功耗唤醒后的时钟选择
全网最全STM32 HAL的知识总结
ST 为开发者提供了非常方便的开发库:有标准外设库(SPL库)、HAL 库(Hardware Abstraction Layer,硬件抽象层库)、LL 库(Low-Layer,底层库)三种。前者是ST的老库已经停更了,后两者是ST现在主推的开发库。 相比标准外设库,STM32Cube HAL库表现出更高的抽象整合水平,HAL API集中关注各外设的公共函数功能,这样便于定义一套通用的用户友好的API函数接口,从而可以轻松实现从一个STM32产品移植到另一个不同的STM32系列产品。HAL库是ST未来主推的库,ST新出的芯片已经没有STD库了,比如F7系列。目前,HAL库已经支持STM32全线产品。 通过文字描述可以知道HA
[单片机]
STM32时钟小结
众所周知STM32有5个时钟源HSI、HSE、LSI、LSE、PLL,其实他只有四个,因为从上图中可以看到PLL都是由HSI或HSE提供的。 其中,高速时钟(HSE和HSI)提供给芯片主体的主时钟.低速时钟(LSE和LSI)只是提供给芯片中的RTC(实时时钟)及独立看门狗使用,图中可以看出高速时钟也可以提供给RTC。内部时钟是在芯片内部RC振荡器产生的,起振较快,所以时钟在芯片刚上电的时候,默认使用内部高速时钟。而外部时钟信号是由外部的晶振输入的,在精度和稳定性上都有很大优势,所以上电之后我们再通过软件配置,转而采用外部时钟信号. 高速外部时钟(HSE):以外部晶振作时钟源,晶振频率可取范围为4~16MHz,我们一般采
[单片机]
<font color='red'>STM32</font>时钟小结
STM32开发笔记22: 手动添加驱动文件
单片机型号:STM32L053R8T6 我们可以通过STM32CubeMX生成工程代码,但是如果我们的工程已经建立完毕了,或者说我们在原有的工程上,开始新的项目设计,此时又需加入新的驱动,该如何呢?本文探讨其解决方法。 1、STM32CubeMX的驱动路径如下图所示,我们希望加入什么驱动,就直接将其对应的.c文件加入到工程中即可。 2、为了使该模块生效,我们还学将其使能。其使能宏,在stm32l0xx_hal_conf.h中,如下图所示。 3、上述工作完成后,我们就可以对工程进行编译了,至于驱动的具体调用方法,我们可以参看ST公司给出的例程,或者自己重新生成一个STM32CubeMX工程文件,进行对
[单片机]
<font color='red'>STM32</font>开发笔记22: 手动添加<font color='red'>驱动</font>文件
STM32存储器 — <1> 关于STM32的存储器
当我们在完成某一个实验,当我们正庆幸的时候,我们不由得产生一种不安的想法 我们是否已经少许明白其中的种种细节? 尤其,当我们所有的事情都依赖于编译环境或Firmware,抑或他人的程序,而自己仅仅是Copy和Modify,以致Using。当你还是一个初学者的时候,或许不会太过于关注于此,但是要想提高自己对单片机、处理器原理的理解,并且希望走得更远的时候,您就需要关注更为详细的内部知识,您需要明白编译环境、Firmware等为你的默默贡献。 1 STM32系统结构 要想深刻理解STM32的存储器,需要首先知道STM32的系统结构。 如Figure 1,是STM32系统结构框图。 根据STM32 Re
[单片机]
GD32与STM32兼容吗?
GD32与STM32是两个不同的微控制器系列,是由两个不同的公司设计和生产的。GD32系列是由国内的长沙国芯微电子设计和生产的,而STM32系列则是由欧洲的STMicroelectronics公司设计和生产的。 虽然GD32与STM32都是基于ARM Cortex-M内核的微控制器,但是它们并不完全兼容。由于两个公司的设计和生产流程不同,GD32系列和STM32系列的外设具有不同的寄存器映射和不同的寄存器位域。因此,任何在STM32上编写的应用程序不能直接在GD32上运行,需要对代码进行适当的修改。 在进行移植时,需要仔细研究两者之间的差异性,例如GPIO、串口、定时器等外设的差异,以及使用的库函数的不同。同时也需要检查时钟、中断
[单片机]
STM32嵌入式微控制器快速上手——笔记
1、大端格式:数据的高字节存在低地址,低字节存在高地址; 小端格式:数据的低字节存在低地址,高字节存在高地址。 2、arm公司推出的AMBA片上总线标准包括:AHB系统总线和APB外设总线。 3、最大寻址空间4GB(2的32次方)。 CPU最大能查找多大范围的地址叫做寻址能力 ,CPU的寻址能力以 字节 为单位 ,如32位寻址的CPU可以寻址2的32次方大小的地址也就是4G,这也是为什么32位的CPU最大能搭配4G内存的原因 ,再多的话CPU就找不到了。 4、ARM指令集32位,Thumb指令集是ARM指令集的一个子集,允许指令编码长度为16位。ARM核就好比一个高中学校,那种包含普通高中和职业高中的。普通高中就相当
[单片机]
STM32时钟系统介绍与总结
时钟树: 1. HSI振荡器时钟 The HSI clock signal is generated from an internal 8 MHz RC Oscillator and can be used directly as a system clock or divided by 2 to be used as PLL input. The HSI RC oscillator has the advantage of providing a clock source at low cost (no external components). It also has a faster startup time than
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved