ILI9341液晶显示
17.1液晶显示原理
TFT-LCD(Thin Film Transistor Liquid Crystal Display)即薄膜晶体管液晶显示器,是微电子技术与液晶显示器技术巧妙结合的的一种技术。
CRT显示器的工作原理是通电后灯丝发热,阴极被激发后发射出电子流,电子流受到高电压的金属层的加速,经过透镜聚焦形成极细的电子束打在荧光屏上,使荧光粉发光显示图像。LCD显示器需要来自背后的光源,当光束通过这层液晶时,液晶会呈不规则扭转形状(形状由TFT上的信号与电压改变实现),所以液晶更像是一个个闸门,选择光线穿透与否,这样就可以在屏幕上看到深浅不一,错落有致的图像。目前主流的LCD显示器都是TFT-LCD,是由原有液晶技术发展而来。TFT液晶为每个像素都设有一个半导体开关,以此做到完全的单独控制一个像素点,液晶材料被夹在TFT阵列和彩色滤光片之间,通过改变刺激液晶的电压值就可以控制最后出现的光线强度和色彩,如图7-1所示。
图7-1 液晶显示屏结构图
Kingst-32F1开发板配套的TFT-LCD是3.2寸大小,分辨率为240*320,即一共有240×320=76800个像素点,每个像素都设有一个半导体开关,像素之间是相对独立的,这么多像素如何控制呢?联想一下51单片机驱动LED点阵时,为了减少IO口的使用,采用三八译码器驱动点阵模块。同理,TFT-LCD也可以用专门的驱动器来驱动,教材所用的TFT-LCD采用ILI9341驱动芯片。该控制芯片是封装在TFT-LCD内部,只留有外部引脚接口。对于用户来说,只要掌握如何向ILI9341控制器发送指令和读写数据,并不需要再设计额外的驱动电路,该液晶的具体参数如表7-1所示。
7.1.1ILI9341硬件接口和像素格式
ILI9341驱动芯片主要由接口电路、显存(GRAM)、LCD驱动电路、背光控制、电源等部分组成,主要结构如图7-2所示。
由于STM32的I/O口资源丰富,为了提高数据的读写效率,采用16位的8080并行接口,可以比8位的8080并行接口的传输速率高出一倍(数据线多出一倍),由于是并行接口,比SPI串行接口的传输速率更快,并且通讯时序简单,因此这里将TFT-LCD的IM2~IM0引脚接地。
7.1.4 ILI9341 GRAM指令和像素格式
GRAM(Graphics RAM)——显存,也称作帧存储器,是ILI9341用来存储显示数据的图像RAM。GRAM中一个像素点的颜色数据用18bit表示,GRAM的大小为240*320*18/8=172800字节,所有像素数据都存储在GRAM中。当TFT-LCD开显示时,LCD源极驱动会根据GRAM中存储的数据对液晶像素进行刷新,从而实现图像显示。如果改变GRAM中单个像素点的数据,刷新显示时,TFT-LCD对应的像素状态也会改变。如何才能准确的向每个像素对应的数据位写入显示数据呢?ILI9341控制器内部设计了一个“控制寄存器”,用户只需要按照要求发送相应的控制指令,“控制寄存器”收到控制指令后,通过“地址计数器”在对应的像素位置写入像素数据,最终通过LCD源极驱动LCD刷新显示,ILI9341控制器内部结构如图7-8所示。
ILI9341控制器共有76条控制指令,每条指令的控制功能在手册中都有详细描述,本书只针对常用指令做重点说明。
1、读取驱动器ID:用于读取TFT-LCD的驱动器的的ID,板载液晶的驱动器是ILI9341,ID固定为0x9341。在读取的过程中,首先通过写命令函数发送指令0xD3,然后连续读取4次数据。其中第1次是无效数据,第二次是版本号,也是无效数据,第三次和第四次的高8位也是无效数据,只有第三次和第四次的低8位才是有效的ID数据,读取ID成功,表明单片机和驱动器通信正常,读ID指令如图7-9所示。
2、设置显示窗口:当用户将一部分要显示的内容填充到液晶显示屏的某一个区域,这个区域的列范围用0x2A这条指令设置,行范围用0x2B这条指令设置。首先通过写命令函数发送指令0x2A,紧跟着列起始地址的高字节、列起始地址的低字节、列结束地址的高字节、列结束地址的低字节;然后通过写命令函数发送指令0x2B,紧跟着行起始地址的高字节、行起始地址的低字节、行结束地址的高字节、行结束地址的低字节。注意:结束地址只能大于等于起始地址,不能小于起始地址。
通过限定这4个角的坐标,就可以从液晶中选取其中一个区域作为显示窗口。指令和地址都只有低8位数据有效,发送过程如图7-10和图7-11所示。
3、写存储器指令:设置好显示窗口后,在写入数据之前,需要先写入0x2C指令。无论当前行寄存器和列寄存器的地址是多少,写入0x2C后,行寄存器和列寄存器会自动复位,复位值就是通过0x2A和0x2B写入的列起始地址和行起始地址,此时如果发送数据,数据会写入帧存储器对应地址中,数据写入具体流程如图7-12所示。
4、帧存储器扫描方向控制指令:设置显示窗口后,发送0x2C指令开始向内存中写数据,数据是从设置窗口的起始地址开始写入,先写行,行地址自增直至该行的终止地址,然后列地址加1,数据再从下一行的起始地址开始写入,如此循环直至将整个显示窗口的数据写入到帧存储器中。帧存储器读/写扫描方向如图7-13所示,图中B表示起始位置,E表示终止位置。
数据按照上面介绍的顺序写入,但是液晶屏刷新显示时,并不一定按照写入的顺序刷新数据,而是可以通过“存储器访问控制”指令0x36设置帧存储器的扫描方向(即行列方向)。设置帧存储器扫描方向时,先发送指令0x36,紧跟着发送设置参数,参数由18位组成,只有2~7位有效。其中D7:MY-设置行地址方向;D6:MX-设置列地址方向;D5:MV-设置行列地址交换;D4:ML-设置垂直刷新方向;D3:BGR-设置刷新像素格式为BGR或RGB;D2:MH-设置水平刷新方向,存储器访问控制指令如图7-14所示。
其中MY、MX、MV这三位用来设置扫描方向,也是重点介绍的地方,MX和MY分别设置行列扫描方向,MV设置行列交换,它们可以组合成23=8种扫描模式,如图7-15所示。
注意:无论MY、MX、MV设置的存储器扫描方向如何,数据总是以相同的顺序写入帧存储器。设置扫描方向后,还需要通过0x2A、0x2B指令重新设置显示窗口大小。
其中模式0和3为竖屏显示,模式5和6为横屏显示,这四种模式的扫描方向和稍后所讲的文字取模方向相同,旋转液晶屏即可达到阅读效果,其他模式直接显示时呈现乱码,需要根据扫描方向重新取模。
ML和MH主要设置帧存储器到LCD显示面板的数据刷新方向,就像过年贴春联,可以选择从上向下贴,或者从下向上贴,无论哪种方式,最后的显示效果是不变的,默认ML和MH都为0。
5、像素格式:
TFT-LCD的每个像素点由红(R)、绿(G)、蓝(B)三原色组成,帧存储器为每个像素分配了18bit的存储空间,三原色各用6个数据位表示,也就是常说的RGB666格式,该模式色彩度最大,它们按不同比例的混合可以组成218种颜色,俗称262K色。同时ILI9341还支持16位、9位数据格式。
GRAM选择16位数据格式,16位数据格式下按照R:G:B =5:6:5格式存储,俗称RGB565格式,由于GRAM为每个像素预留的存储空间是18bit,为了保证写入的16bit像素数据能够正常匹配GRAM中18bit像素存储空间,控制器会自动将RGB565格式转换成RGB666格式,转换后数据存储形式如图7-16所示,空白位置表示没有数据。由于缺少了两位数据,此时TFT-LCD最大支持216种色彩度,也就是65K色
像素数据在帧存储器按照图7-18的格式存储,即R位于高位,B位于低位。但是像素数据刷新到LCD显示屏上时,可以通过“存储器访问控制(0x36)”指令中的 BGR位选择像素数据写入到显示屏的方向,当BGR位为 0时,数据按照RGB(即R在高位,B在低位)的顺序写入;当BGR位为1时,数据沿BGR(即B在高位,R在低位)的顺序写入到液晶面板中。默认BGR位为1,该模式下写入的颜色与显示效果相同,像素刷新示意图如图7-17所示。
6、读存储器指令;读存储器指令为0x2E,与上面介绍的写存储器指令0x2C类似,首先发送0x2A和0x2B设置行列起始和终止地址,然后发送0x2E,行列地址自动复位。通过读数据函数可以读取帧存储器存储的像素数据,第一次读取的数据无效,之后每一次读取16bit数据,由于帧存储器中每个像素占18位,因此一个像素点的数据需要分两次读取,第一次读取RG的值,第二次读取B值。读数据时行列地址会自增,直至读完整个显示窗口,读存储器指令如图7-18所示。
7、ILI9341初始化
由于ILI9341液晶屏初始化需要设置的参数比较多,在此就不再一一讲解,仅提供初始化代码。如果想深入研究,可以按照上面介绍指令的方式,到ILI9341参考手册中查找相关指令和对应参数位的作用。
27.2ILI9341 TFT-LCD 显示操作
7.2.1 画点
画点就是向单个像素点填充颜色,画点主要分为三部分:
第一步、通过窗口设置函数设置像素点的坐标,由于设置的是一个像素点,所以窗口设置函数的起始和终止坐标相同;
第二步、发送写存储器指令0x2C;
第三步、写入像素数据。为了提高速率,通过写指令和数据函数一并将指令和数据写入。
7.2.2 读点
读点就是读取帧存储器中相应像素点的数据。读点也分为三部分:
第一步、通过窗口设置函数确定像素点的坐标;
第二步、发送读存储器指令0x2E;
第三步、读取像素数据。
由于帧存储中像素数据为18bit,写入帧存储器中的像素数据是RGB565格式,帧存储器中存储的数据是RGB666格式。16位并口模式下读取一个像素点数据需要读两次,数据按照高位在前,低位在后顺序输出。第一次读取的数据无效,之后读取的才是真正的像素数据;第二次读取的是RG值,其中高8位为R值,有效位为[15:11]位,低8位为G值,有效位为[7:2]位,第三次读取的B值位于高8位,有效位为[15:11]位,像素数据读取完毕后还需要转换为RGB565格式。需要注意的是读数据时需要设置数据总线为输入模式,读取完毕后再重新设置为输出模式。
7.2.4 填充和清屏
填充是对某一区域填充特定颜色。首先通过“显示窗口设置函数”设置被填充区域范围,然后发送0x2C写存储器指令,最后通过写数据函数写入像素数据。该函数如下所示:其中xStart、yStart、xEnd、yEnd表示填充区域起始和终止坐标,Color表示填充的颜色。
void LcdFill(u16 xStart, u16 yStart, u16 xEnd, u16 yEnd, u16 Color)
清屏函数实际是一个填充函数,只不过清屏函数的显示窗口大小设置为全屏。该函数如下所示,Color表示全屏填充的颜色。
void LcdClear(u16 Color)
参考了网友的文章:https://mp.weixin.qq.com/s/JME3VArPETgPjD0n_cHKNQ
ILI9341液晶显示的更多相关文章
- (stm32学习总结)—LCD—液晶显示
显示器简介 显示器属于计算机的 I/O 设备,即输入输出设备.它是一种将特定电子信息输出到屏幕上再反射到人眼的显示工具.常见的有 CRT 显示器.液晶显示器.LED 点阵显示器及OLED 显示器 本章 ...
- 如何为编程爱好者设计一款好玩的智能硬件(九)——LCD1602点阵字符型液晶显示模块驱动封装(下)
六.温湿度传感器DHT11驱动封装(下):如何为编程爱好者设计一款好玩的智能硬件(六)——初尝试·把温湿度给收集了(下)! 七.点阵字符型液晶显示模块LCD1602驱动封装(上):如何为编程爱好者设计 ...
- 如何为编程爱好者设计一款好玩的智能硬件(八)——LCD1602点阵字符型液晶显示模块驱动封装(中)
六.温湿度传感器DHT11驱动封装(下):如何为编程爱好者设计一款好玩的智能硬件(六)——初尝试·把温湿度给收集了(下)! 七.点阵字符型液晶显示模块LCD1602驱动封装(上):如何为编程爱好者设计 ...
- 如何为编程爱好者设计一款好玩的智能硬件(七)——LCD1602点阵字符型液晶显示模块驱动封装(上)
当前进展: 一.我的构想:如何为编程爱好者设计一款好玩的智能硬件(一)——即插即用.积木化.功能重组的智能硬件模块构想 二.别人家的孩子:如何为编程爱好者设计一款好玩的智能硬件(二)——别人是如何设计 ...
- SMG12232A2标准图形点阵型液晶显示模块的演示程序[C51编程语言]
//SMG12232A2标准图形点阵型液晶显示模块的演示程序[C51编程语言][MCS51总线接口方式] //应用产品: SMG12232A2标准图形点阵型液晶显示模块 // 本演示程序适用于SMG1 ...
- SMG12232ZK标准字符点阵型液晶显示模块的演示程序[C51编程语言][MCS51并行接口方式]
//SMG12232ZK标准字符点阵型液晶显示模块的演示程序[C51编程语言][MCS51并行接口方式] //应用产品: SMG12232ZK标准中文字符点阵型液晶显示模块 // 本演示程序适用于SM ...
- STM32的FSMC总线驱动ili9341,掉电重启无法正常显示的问题
问题描述 通过STM32的FSMC总线驱动ili9341,程序调试和刚下载的时候,显示完全正常.可是就在我掉电关机,重新启动的时候就完全跑飞了.这令我非常疑惑.以下是我的FSMC总线配置程序, sta ...
- TOPWAY智能彩色TFT液晶显示模块
TOPWAY 20年来专注工业显示, 以为全球工业用户提供稳定可靠和容易使用的液晶显示模块为己任, 智能彩色TFT液晶显示模块(以下简称智能模块), 就是我们在容易使用TFT 彩色液晶显示方向上为广大 ...
- 拓普微智能TFT液晶显示模块
关键词: 串口屏, 液晶屏, TFT,人机界面 概述: 智能模块(Smart LCD)是专为工业显示应用而设计的TFT液晶显示模块. 模块自带主控IC.Flash存储器.实时嵌入式操作系统,客户主机可 ...
随机推荐
- sql server存储过程返回数据只有一个字符
SqlParameter[] param = { new SqlParameter("@shopId",shopId), new SqlParameter("@newSh ...
- 如何将Chrome本地安装的扩展应用导出到本地
有时由于种种原因,我们不能直接使用Chrome web store进行Chrome扩展应用的安装,这时可以让一位已经安装了某Chrome扩展应用的朋友将他的应用导出到本地成为.crx文件,然后发给你, ...
- Java基础加强-jdk1.5的一些新特性
JDK 5.0 特性 1.静态导入(import static 语句导入一个类中的某个静态方法或所有静态方法) 如: import static java.lang.Math.*; 2.可变参数 1. ...
- 【Distributed】网站跨域解决方案
一.概述 1.1 什么是网站跨域 1.2 网站跨域报错案例 二.五种网站跨域解决方案 三.使用JSONP解决网站跨域[1] 3.1 前端代码 3.2 后端代码 四.使用设置响应头允许跨域[2] 4.1 ...
- 惊呆!Java程序员等级一览
凡人:买本书凑凑热闹,听得多写的少,过段时间就把老师教的都忘了.这个阶段是刷掉人最多的阶段,也是从凡人到程序员本质区别的阶段.你的日后成就在于你的习惯与态度.隔一段时间整理自己的知识体系是重中之重 ...
- CentOS7安装Oracle11g数据库
1.关闭防火墙systemctl stop firewalled servicesystemctl disable firewalled service 2.关闭selinuxvim /etc/sel ...
- ARP、Proxy ARP、Gratuitous ARP
Proxy ARP 什么是Proxy ARP? 一个主机A(通常是路由器)有意应答另一个主机B的ARP请求(ARP requests).主机A通过伪装其身份,承担起将分组路由到真实目的地的责任.代理A ...
- linux 基础10-磁盘配额管理
1. 基本概念 1.1 概念: 在linux系统中,由于是多人多任务的使用环境,所以会有多人共同使用一个硬盘空间的情况,如果其中少数几个人大量使用了硬盘空间的话,势必会压缩其他使用者的使用空间,因此管 ...
- ndk学习之C语言基础复习----结构体、共用体与C++开端
自己实现sprintf功能: 关于C中的系统函数sprintf在上次[https://www.cnblogs.com/webor2006/p/7545627.html]学习中已经用到过了,这里再来回顾 ...
- HDU 6735 结论网络流 机器人不重叠路径
我们可以得到一个结论:没有两个机器人走过的路会重叠 所以题目就转变为了能不能让机器人的路径不重叠且每个机器人能到达终点 直接一个点朝他四连通方向的四个点连容量为1的边即可 #include<bi ...