基于ILI9341的TFT液晶显示模组LCM240320详解(1)
Hello,大家好,今天我们来讨论当下非常流行的TFT液晶显示模组,它最大的特点是可以显示出效果非常好的彩色信息,绝大多数手机、液晶显示器,液晶电视、MID、MP4等产品都在使用它,你想抗拒它的魅力还真的很难。
我们主要讨论基于ILI9341的TFT液晶显示模组,但在正式讨论之前,还是得先了解一下TFT液晶显示器的彩色产生原理,它是基于大家都熟悉的红(Red)、绿(Green)、蓝(Blue)三原色光混合原理,例如,绿色+红色=黄色,绿色+蓝色=青色,红色+蓝色+绿色=白色,如下图所示:

虽然上图仅显示了7种颜色,但是只要我们能够得到红、绿、蓝三种颜色(原色),然后调节它们的亮度比例,就可以得到你想要的五颜六色,而得到的颜色数量则称为色深(Color Depth)。
根据各原色的调节级数也可以分为很多颜色模式,比较常用的是三原色各占8位,即每种原色有2的8次方(256)种亮度变化,相应的色深为256*256*256=16777216(俗称16兆彩色),我们称其为RGB888模式。RGB配色通常使用RGB(rr,gg,bb)来表示,例如RGB(0xFF, 0x00, 0x00)表示红色,RGB(0xFF, 0xFF, 0xFF)表示白色。在进行C源代码编程时,经常会使用宏来定义一些常用的颜色,部分RGB888颜色如下:

当然,并不是所有场合都需要这么多颜色,RGB565与RGB666模式也很常用(其它还有RGB332、RGB555等等),相应的色深分别为32*64*32=65536(65千色)及64*64*64=262144(262千色)。RGB666模式部分常用颜色的宏定义如下图所示:

现在的问题是:怎么产生三原色呢?看下图吧

教堂彩色玻璃上绘有各种人物图案,每一幅都是一个宗教故事,一些教会本地的传说也会作为主题出现,以这种方式向民众宣传教义,也成就了它的艺术……这位同学你干嘛呢?在座的其它同学可都是有志于献身电子技术领域,并以“为社会谋求福祉”的目标而奋斗着,你要是喜欢讲故事瞎扯淡就赶紧学厨师当个裁缝比较好一些….等等,我还没说完(摔门的声音响起来了)。
呵呵!宗教那啥的我不太懂,只知道上图已经告诉我们如何产生三原色,那就是:使用一个红、绿、蓝色的薄膜对光源进行过滤就可以了。TFT液晶显示模组中总会有一个白光源(CCFL或LED,此处不赘述,具体原理及相应的驱动电路请参考《显示器件应用精粹》(以下简称“显示器件”)与一片彩色滤光膜。假设TFT屏当前正显示纯白的画面,你用放大镜去观察,会发现有屏上有很多红、绿、蓝的方块,如下图那样:

我们把每一个点称为子像素(SubPixel),三个子像素组成一个显示像素。对于分辨率为240列320行的TFT屏,它需要240*3=720个列驱动(320个行驱动)引脚。每个显示像素都会对应驱动芯片中显存(Graphics RAM, GRAM)里的一个地址,分辨率为240*320的TFT屏对应的GRAM地址应该有240*320=76800个,具体容量为多少则取决于芯片支持的RGB模式。例如,ILI9341有720列320行驱动输出,支持RGB565与RGB666模式,按最大位数(18位)来计算,相应的GRAM容量大小应该为240*320*18=138240bits(位)=172800bytes(字节),数据手册标记的特点如下图所示:

我们使用VisualCom软件平台中 “基于ILI9341的320X240的TFT液晶显示模组”来仿真一下,相应的效果如下图所示。

ILI9341的指令比较多,英文数据手册超过200页,涉及的寄存器数量也非常庞大,VisualCom软件平台按功能相近的原则将其划分为多个类别。由于这是我们第一次接触TFT液晶显示模组,所以先给大家演示如何以最少的指令点亮TFT屏,后续文章会按类别详细讨论其它指令功能。
首先我们先注意“属性”窗口的“高级”组合框中有三个选项,其一为起始页。“页”就是行,它与“列”是对GRAM地址的定位方式。ILI9341的GRAM共划分为320页,每页240列。在“单步运行”仿真模式下,“内存窗口”可以实时观察GRAM空间的显示数据,但是由于320页的数据量太过庞大,为避免加载时间过慢(不影响单步运行时数据的刷新时间,只是当重新打开另一个文件或更换器件时,VisualCom软件平台需要对当前工程的内存与寄存器数据进行清理的时间比较长),我们限制一次性只能加载8页内存(通常也不需要全部载入),你所需要做的就是指定起页始。上图指定的起始页为32,所以加载的内存页为32~39页。当然,在单步运行时,你可以随时更改起始页,内存窗口会在下一步运行时进行相应的刷新。
假设现在要求显示一张图片,怎么办?由于ILI9341的GRAM空间太大,如果仍然按以往的方式(预置数据)来写满GRAM,需要预置的数据至少为76800条,恐怕根本不会有人会这么做,即便像ST7920、KS0108B那样相对小一点的“黑白”点阵LCD驱动芯片,通过预置数据来连续写入显存的方式也并不讨好。VisualCom软件平台当然不会只提供半套解决方案,它允许你指定一个.BMP图像文件对GRAM进行初始化,当你运行仿真之后,首先会使用指定的图片初始化ILI9341的GRAM,爽歪歪!
前面已经提过,ILI9341支持RGB565与RGB666两种像素格式。从“高级”属性中选择一种后,你刚才指定的图片会以相应像素格式写入到GRAM中。需要注意的是:属性窗口里的“像素格式”只是用来控制图片初始化到GRAM的显示数据,而不是用来设置ILI9341状态的(需要指令,后述)。
好的,现在咱们来看看需要哪些指令才能让屏幕有所显示呢?相应的预置数据如下图所示:

乖乖,我们只预置了两条指令,它首先退出了睡眠模式,然后打开了显示。我们来看看数据手册中复位后的状态,如下图所示:

整个表格中,只有“睡眠(Sleep)”与“显示(Display)”两项影响屏幕的显示,ILI9341上电复位后默认处于睡眠模式(Sleep In),并且显示也是关闭的(Off)。“空闲(Idle)”模式下是可以显示的,只不过显示的颜色比较少(后述),更何况还并不在空闲模式下(Idle Off)。(其它是一些地址设置或读寄存器等等,咱们暂时忽略)
睡眠模式是个虾米东东呢?不知道,还是翻翻数据手册吧!其中有一条“进入睡眠模式”指令,如下图所示:

哦!原来睡眠模式主要是为了省电,此时内部电荷泵升压(Pump DC/DC Converter)电路(有关硬件电路原理请参考《显示器件》)、系统振荡器都会关闭(但是已经写入到GRAM的数据仍然保持不变),那这个屏幕还显示个毛线,所以执行“退出睡眠模式”指令是让屏幕能够显示GRAM数据前必须要做的一步。我们再来看看相应的指令,如下图所示:

可以看到,“退出睡眠”指令为0x11,这也是我们预置的第一条指令,接下来使用“打开显示”指令0x29,咱们指定的初始化图片就显示出来了。在VisualCom软件的“寄存器窗口”中,SLEEP与DISPLAY位分别代表相应的模式(0为关闭,1为开启)。
值得一提的是:ILI9341仿真模型还添加了预置数据处理状态,在“输出”窗口的信息栏中可以显示当前预置数据的解析状态。例如,我在前述预置数据后再添加一条指令(0x14)与两条任意数据,如下图所示:

由于ILI9341不存在0x14对应的指令,所以信息栏中会显示相应指令为无效。同样,后面跟随的多个数据也是无效的,这样的实时信息反馈能够进一步帮助使用者应证自己对芯片指令作用的理解(如果指令解析结果不是你需要的,肯定哪里出错了,而不像以往那样只能看屏幕、内存、寄存器窗口),相应的效果如下图所示。

那如何往指定的GRAM地址写入指定的显示数据呢?这与以往ST7920、KS0108B之类的驱动芯片还有点不太一样,我们下一期再会吧!
基于ILI9341的TFT液晶显示模组LCM240320详解(1)的更多相关文章
- Netsuite Formula > Oracle函数列表速查(PL/SQL单行函数和组函数详解).txt
PL/SQL单行函数和组函数详解 函数是一种有零个或多个参数并且有一个返回值的程序.在SQL中Oracle内建了一系列函数,这些函数都可被称为SQL或PL/SQL语句,函数主要分为两大类: 单行函数 ...
- 基于集合成工控机Ubuntu系统安装分区详解
基于集合成工控机Ubuntu系统安装分区详解 硬件描述:双核的CPU,128G的固态硬盘 软件描述:使用Ubuntu12.04系统,内核3.8.0-29版本,QT4.8.1版本 1.新建分区表 /de ...
- 基于双向BiLstm神经网络的中文分词详解及源码
基于双向BiLstm神经网络的中文分词详解及源码 基于双向BiLstm神经网络的中文分词详解及源码 1 标注序列 2 训练网络 3 Viterbi算法求解最优路径 4 keras代码讲解 最后 源代码 ...
- spring基于通用Dao的多数据源配置详解【ds1】
spring基于通用Dao的多数据源配置详解 有时候在一个项目中会连接多个数据库,需要在spring中配置多个数据源,最近就遇到了这个问题,由于我的项目之前是基于通用Dao的,配置的时候问题不断,这种 ...
- “全栈2019”Java多线程第十三章:线程组ThreadGroup详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- 基于ORA-12170 TNS 连接超时解决办法详解
转自原文 基于ORA-12170 TNS 连接超时解决办法详解 1.开始----程序-----Oracle------配置和移植工具-----Net Manager----本地----服务命名---o ...
- Jmeter线程组使用详解,持续加压线程组详解
以下罗列的是Jmeter 所有线程组的详解,包括官方自带的线程组,和官方插件的线程组.官方线程组安装,详见之前的文章:https://www.cnblogs.com/beimingyouyuqingc ...
- 基于python的直播间接口测试实战 详解结合项目
基于python的直播间接口测试详解 一.基本用例内容描述 以设置白名单 /advisor/setUserWhiteList.do接口为例,该方法为POST at first,先要导入一些常用到的模块 ...
- IdentityServer4实战 - 基于角色的权限控制及Claim详解
一.前言 大家好,许久没有更新博客了,最近从重庆来到了成都,换了个工作环境,前面都比较忙没有什么时间,这次趁着清明假期有时间,又可以分享一些知识给大家.在QQ群里有许多人都问过IdentityServ ...
随机推荐
- 使用DevExpress的GridControl实现多层级或无穷级的嵌套列表展示
在我早期的随笔<在GridControl表格控件中实现多层级主从表数据的展示>中介绍过GridControl实现二级.三级的层级列表展示,主要的逻辑就是构建GridLevelNode并添加 ...
- Davinci 可视化系统部署安装及简单使用
Davinci 是一个目前比较热门的国内开源BI系统,功能比较完善,各种可视化效果也挺不错.主要获取数据的方式是通过编写SQL 创建数据视图来展示各种图表的. Davinci面向业务人员/数据工程师/ ...
- 透过“锁”事看InnoDB对并发的处理?
一. 并发场景下的问题 相对于串行处理方式,并发的事务处理可显著提升数据库的事务吞吐量.提高资源利用率.在MySQL实际应用中,根据场景的不同,可以分为以下几类: 读读并发 读写并发 写写并发 在这些 ...
- [设计模式] 设计模式课程(十六)-- 备忘录模式(Memento)
概述 也叫快照(SnapShot) 属于行为类设计模式 允许在不暴露对象实现细节的情况下保存和恢复对象之前的状态 软件构建过程中,某些对象的状态在转换过程中,可能由于某种需要,要求程序能回溯到对象之前 ...
- [bug] Maven每次都自动下载jar包非常慢
解决 方法一:将maven改为离线模式,自己下载jar包复制到仓库中 eclipse中Window>preferences>maven>勾选Offline 方法二:将maven镜像改 ...
- Scala 安装与配置
安装准备 由于 Scala 运行于 Java 平台,因此 Scala 之前需要确保系统安装 JDK Windows 中安装 Scala 1. 下载 scala-2.11.2.msi 安装包 点击安装文 ...
- Linux_网络基础管理
一.网卡的命名 1.传统网卡命名 eth0.eth1.eth2.eth3......... wlan0.wlan1.waln2.wlan3......... 2.RHEL7命名机制 systemd对网 ...
- Jinja2模板概述
例子一 循环语句 [root@m01 ~]# cat upstream.conf upstream web { {% for i in range(1,11) %} server 172.16.1.{ ...
- k8s集群部署(2)
一.利用ansible部署kubernetes准备阶段 1.集群介绍 基于二进制方式部署k8s集群和利用ansible-playbook实现自动化:二进制方式部署有助于理解系统各组件的交互原理和熟悉组 ...
- IT菜鸟之网线制作
网线是属于OSI七层模型中的物理层:网络中的数据传输媒介 备注:OSI七层模型后面会记录 网线制作所需要的资源素材: 1.网线 2.水晶头(类型:电话线RJ11,宽带线RJ45) 3.网线钳(非必需) ...