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软件的“寄存器窗口”中,SLEEPDISPLAY位分别代表相应的模式(0为关闭,1为开启)。

值得一提的是:ILI9341仿真模型还添加了预置数据处理状态,在“输出”窗口的信息栏中可以显示当前预置数据的解析状态。例如,我在前述预置数据后再添加一条指令(0x14)与两条任意数据,如下图所示:

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

那如何往指定的GRAM地址写入指定的显示数据呢?这与以往ST7920、KS0108B之类的驱动芯片还有点不太一样,我们下一期再会吧!

基于ILI9341的TFT液晶显示模组LCM240320详解(1)的更多相关文章

  1. Netsuite Formula > Oracle函数列表速查(PL/SQL单行函数和组函数详解).txt

    PL/SQL单行函数和组函数详解 函数是一种有零个或多个参数并且有一个返回值的程序.在SQL中Oracle内建了一系列函数,这些函数都可被称为SQL或PL/SQL语句,函数主要分为两大类: 单行函数 ...

  2. 基于集合成工控机Ubuntu系统安装分区详解

    基于集合成工控机Ubuntu系统安装分区详解 硬件描述:双核的CPU,128G的固态硬盘 软件描述:使用Ubuntu12.04系统,内核3.8.0-29版本,QT4.8.1版本 1.新建分区表 /de ...

  3. 基于双向BiLstm神经网络的中文分词详解及源码

    基于双向BiLstm神经网络的中文分词详解及源码 基于双向BiLstm神经网络的中文分词详解及源码 1 标注序列 2 训练网络 3 Viterbi算法求解最优路径 4 keras代码讲解 最后 源代码 ...

  4. spring基于通用Dao的多数据源配置详解【ds1】

    spring基于通用Dao的多数据源配置详解 有时候在一个项目中会连接多个数据库,需要在spring中配置多个数据源,最近就遇到了这个问题,由于我的项目之前是基于通用Dao的,配置的时候问题不断,这种 ...

  5. “全栈2019”Java多线程第十三章:线程组ThreadGroup详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  6. 基于ORA-12170 TNS 连接超时解决办法详解

    转自原文 基于ORA-12170 TNS 连接超时解决办法详解 1.开始----程序-----Oracle------配置和移植工具-----Net Manager----本地----服务命名---o ...

  7. Jmeter线程组使用详解,持续加压线程组详解

    以下罗列的是Jmeter 所有线程组的详解,包括官方自带的线程组,和官方插件的线程组.官方线程组安装,详见之前的文章:https://www.cnblogs.com/beimingyouyuqingc ...

  8. 基于python的直播间接口测试实战 详解结合项目

    基于python的直播间接口测试详解 一.基本用例内容描述 以设置白名单 /advisor/setUserWhiteList.do接口为例,该方法为POST at first,先要导入一些常用到的模块 ...

  9. IdentityServer4实战 - 基于角色的权限控制及Claim详解

    一.前言 大家好,许久没有更新博客了,最近从重庆来到了成都,换了个工作环境,前面都比较忙没有什么时间,这次趁着清明假期有时间,又可以分享一些知识给大家.在QQ群里有许多人都问过IdentityServ ...

随机推荐

  1. 是时候学习Linux了

    前言: Linux是一个开源.免费的操作系统.其稳定性.安全性.处理多并发已经得到业界的认可,目前很多企业级的项目都会部署到Linux/unix系统上.如果你还不太了解Linux,希望本篇文章能够带你 ...

  2. Redis内存——内存消耗(内存都去哪了?)

    最新:Redis内存--三个重要的缓冲区 最新:Redis内存--内存消耗(内存都去哪了?) 最新:Redis持久化--如何选择合适的持久化方式 最新:Redis持久化--AOF日志 更多文章... ...

  3. Scrum Meeting 4

    Basic Info where:共享空间 when:2021/4/29 target: 简要汇报一下已完成任务,下一步计划与遇到的问题 Progress Team Member Position A ...

  4. DataGear 变更部署数据库为SQL Server填坑指南(含转写后的SQL server代码及SQL server配置文件)

    1. 引言 2. 配置数据库链接 3. 引入数据库驱动 4. 手动初始化数据库 5. 改写SQL 6. 其他 7. 参考 1. 引言 DataGear默认使用Derby数据库作为系统的元数据库,至于待 ...

  5. [c++] STL 标准算法

    _if 1 #include <iostream> 2 #include <vector> 3 #include <algorithm> 4 using names ...

  6. 笔记本用HDMI转VGA 使用双屏办公 听语音

    笔记本用HDMI转VGA 使用双屏办公 听语音 原创 | 浏览:1212 | 更新:2019-11-12 12:16 1 2 3 4 5 6 7 分步阅读 笔记本使用 转接头扩展出一块屏幕.使用多屏办 ...

  7. 性能工具 stream 最新版本5.10 The STREAM benchmark

    官网下载最新性能工具 stream 最新版本5.10 https://github.com/jeffhammond/STREAM 官网下载最新性能工具 stream 最新版本5.10   http:/ ...

  8. Zabbix5.0服务端部署

    Zabbix5.0服务端部署 基础环境配置 [root@localhost ~]# systemctl disable --now firewalld Removed symlink /etc/sys ...

  9. 基于多IP地址Web服务

    [Centos7.4版本] !!!测试环境我们首关闭防火墙和selinux [root@localhost ~]# systemctl stop firewalld [root@localhost ~ ...

  10. IT菜鸟之路由器基础配置(静态、动态、默认路由)

    路由器:连接不同网段的设备 企业级路由和家用级路由的区别: 待机数量不同(待机量) 待机量:同时接通的终端设备的数量 待机量的值越高,路由的性能越好 别墅级路由,表示信号好,和性能无关 交换机:背板带 ...