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. 头文件string.h,cstring与string

    string.h string.h是一个C标准头文件,所有的C标准头文件都形如name.h的形式,通过#include <string.h>可以导入此头文件.之后我们就可以在程序中使用st ...

  2. 从 demo 到生产 - 手把手写出实战需求的 Flink 广播程序

    Flink 广播变量在实时处理程序中扮演着很重要的角色,适当的使用广播变量会大大提升程序处理效率. 本文从简单的 demo 场景出发,引入生产中实际的需求并提出思路与部分示例代码,应对一般需求应该没有 ...

  3. 关于Java的 long,float 类型

    发现了这么一个坑: 1.2f+3.4f=4.60000014305114751.2d+3.4d=4.6

  4. 反向解析 参数替换 reverse

  5. .NET程序崩溃了怎么抓 Dump ? 我总结了三种方案

    一:背景 1. 讲故事 最近几天接到了几个crash的求助,可能这几个朋友没玩过怎么去生成dump,只能手把手教,感觉也不是一个办法,所以有必要总结一下,后续再有朋友咨询的话,我就可以把这篇文章丢过去 ...

  6. [bug] C:error: initializer element is not constant

    参考 http://codingdict.com/questions/45121

  7. [java] 转型

    A为父类,子类B.C 第20行发生向上转型,a对象调用C覆写过的print()方法 若为A a = new B(); 则调用B覆写过的print()方法 创建对象时使用向上转型,能够统一参数类型(23 ...

  8. 一文详解 Linux 系统常用监控工一文详解 Linux 系统常用监控工具(top,htop,iotop,iftop)具(top,htop,iotop,iftop)

    一文详解 Linux 系统常用监控工具(top,htop,iotop,iftop)     概 述 本文主要记录一下 Linux 系统上一些常用的系统监控工具,非常好用.正所谓磨刀不误砍柴工,花点时间 ...

  9. shell 获取MySQL查询结果并处理

    主要应用到shell for循环 定义数据库连接信息 HOST_NAME='127.0.0.1' DB_PORT='3306' DB_NAME='数据库名' USER_NAME='root' PASS ...

  10. Linux学习之路-Linux-at及cron命令【7】---20171215

    Linux学习之路-Linux-at及cron命令[7]---20171215 DannyExia000人评论986人阅读2017-12-24 17:28:03   ntpdate 命令 [root@ ...