基于ILI9341的TFT-LCD屏幕显示要点总结

目录

LCD常用引脚及其功能

LCD驱动流程

RGB565

关键指令

GRAM自增方向

设置开始坐标和结束坐标

写GRAM指令

读GRAM指令


本文主要参考视频如下:

第37讲 LCD-TFTLCD原理与配置介绍-M4_哔哩哔哩_bilibili

说明:

目前,市面上常见的TFT-LCD驱动芯片的原理都是大同小异的,这篇文章是基于驱动芯片ILI9341来说的。其实,只要弄懂了一种IC的原理,其他的都是差不多的,具体差异看一下具体芯片的数据手册就能明白了。

另外,对于TFT-LCD来说,使用并口刷新肯定是更优的选择,但是也有很多小屏幕用的是SPI接口。这篇文章参考的视频里用的是并口。

关于接口,可以参考这篇文章:LCD常见接口总结_lcd接口-CSDN博客

LCD常用引脚及其功能

常用引脚如下:

其中:

CS片选是选中芯片;

RD读信号和WR写信号决定当前是读还是写;

RS命令/数据决定当前是写入命令还是写入数据。

这里的DB是16位并口,但是也有的是使用SPI接口,具体看数据手册和硬件连接即可。

LCD驱动流程

说明,大部分TFT-LCD的驱动流程都是一样的,比较另类的可能也不常用。

流程如下:

复位部分一般都可以找厂家要,自己写的话,麻烦而且容易出错。

设置坐标,然后发一个写GRAM指令;

然后就可以开始写入颜色数据;

LCD显示;

要明确一个问题,那就是LCD显示,关键点其实就是坐标和颜色数据,任何图案都是在某个坐标上刷新颜色值(更底层是驱动LED亮),所以设置坐标后,发写GRAM指令,然后写入颜色数据,LCD就会在对应坐标位置显示给定的颜色了。

RGB565

如下图:

比如0xF800,对应二进制就是1111 1000 0000 0000,高5位都是1,其他位都是0,也就是说全是红色分量,没有另外两种颜色的分量,因此0xF800表示的就是纯红色。

关键指令

这里有个细节问题需要注意下,虽然所有指令和大部分操作参数都是8位的,但是它们整体是16位的,只是高8位无效而已,另外,RGB565的颜色数据也是16位的,而且,颜色数据是主要的数据源,所以我们在使用DMA时,可以将操作的数据位数设置成16位的,从而实现统一操作,省得又是8位又是16位。具体得看IC芯片是否支持。

以读ID指令为例说明下

顺序这一列说明的是发指令还是发参数;

控制这一列,是表示发送当前数据时,各控制位需要处于什么样的状态,比如第一行发送指令时,RS要置0,RD要置高,WR是有效的并且会在上升沿时写入;

再后面就是各位的描述以及对应的HEX码。

后面的参数行的WR置1,RD有向上的箭头,表示这四行数据是读出来的参数。

剩下的几条指令同理。 

GRAM自增方向

 

这里的三种关键控制位MY MX MV,决定了GRAM自增的方向,也就是LCD的扫描方向。

这个指令很重要。

正常我们如果想要往LCD上刷个像素点,就设置该点的坐标,然后刷上颜色值。

但是如果是想要刷一个区域的点呢?

最基础的方式就是设置一下坐标,刷一个点,再设置一下坐标,再刷一个点……如此循环往复,一次刷一个点,每次都要设置坐标。

但是这个GRAM自增指令就能让我们只用设置一个整体区域的开始和结束坐标,然后发送颜色数据时,GRAM坐标就会自动增长。这也是我们实现批量发送颜色数据的重要基础,我们可以通过DMA将数据批量发送出去,LCD收到数据时,就会按照设置好的坐标来刷新屏幕。

设置开始坐标和结束坐标

设置x的开始和x的结束坐标

设置y的开始和y的结束坐标

这里有个问题千万要注意,那就是最大的坐标会比屏幕的宽高各少1,因为坐标是从0开始的,和数组是一样的道理。

写GRAM指令

注意,GRAM是否自增是这个指令决定的,上面的0x36设置的是自增的方向。

读GRAM指令

注意,我们读数据时每读三个字节就要合成一个16位的颜色数据。

可以结合如下文章加深理解:

STM32实战总结:HAL之FSMC控制TFT-LCD_CSDN博客

TFT驱动ST7789使用总结-CSDN博客 

LCD常见接口总结_lcd接口-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/701475.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

程序员可以做什么副业呢?

如果你经常玩知乎、看公众号(软件、工具、互联网这几类的)你就会发现,好多资源连接都变成了夸克网盘、迅雷网盘的资源链接。 例如:天涯神贴,基本上全是夸克、UC、迅雷网盘的资源链接。 有资源的前提下,迅雷…

Django模型基础(ORM、字段类型、字段参数、增删改查和分页)

模型基础: 字段类型: django根据属性的类型确定以下信息 当前选择的数据库⽀持字段的类型渲染管理表单时使⽤的默认html控件在管理站点最低限度的验证django会为表增加⾃动增⻓的主键列,每个模型只能有⼀个主键列,如果使⽤选项…

【Java程序设计】【C00316】基于Springboot的中小型制造企业质量管理系统(有论文)

基于Springboot的中小型制造企业质量管理系统(有论文) 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的中小型制造企业质量管理设计与实现,本系统有管理员以及工作人员二种角色权限 管理员:首页、个…

如何安装自定义模块?

自定义模块的安装方式如下: 进行了这些操作之后,你就会发现,自己写的代码块,成了可以调用的模块了。

软考41-上午题-【数据库】-关系代数运算3-外连接

一、外连接 连接的拓展,处理由于连接运算而缺失的信息。 1-1、回顾自然连接 1-2、左外连接 示例: 左边的表,数值是全的 1-3、右外连接 示例: 右边的表,数值是全的 1-4、全外连接 示例: 自然连接左外连接…

Java----认识异常

目录 一、异常的概念与体系结构 1.异常的概念 2.异常的体系结构 3.异常的分类 1. 编译时异常 2. 运行时异常 二、异常的处理 1.认识防御式编程 2.异常的抛出 3.异常的捕获 3.1 异常声明throws throws与throw的区别: 3.2 try-catch捕获并处理 3.3 finally …

Java 面向对象进阶 18 JDK8、9开始新增的方法;接口的应用;适配器设计模式;内部类(黑马)

一、JDK8开始新增的方法 默认方法不是抽象方法,所以不强制被重写: 但是如果被重写,就要去掉default关键字: public可以省略,但是default不可以省略: public是灰色的,代表可以省略 但是default是…

使用Makefile对多个shell命令进行编排

一、背景 在日常运维过程中,我们都会需要写大量的shell命令,如果是工程相对复杂的话,shell命令往往会封装为函数,交由主函数按需调用。 本文将引入Makefile来对复杂shell命令进行封装,让其变得易读易懂。 下面以一个…

PyPDF2:Python里的PDF忍者

目录📑 1. 背景📑2. PyPDF2简介:你的PDF小帮手📑3. PyPDF2全能手册📑3.1 读取PDF文件内容3.2 合并PDF文件3.3 分割PDF文件3.4 加密PDF文件 4. 总结📑 1. 背景📑 又是一个实际需求,将…

java spring 01 IOC源码

01.spring 中的基础是IOC

6-pytorch-神经网络搭建

b站小土堆pytorch教程学习笔记 1.神经网络骨架搭建:Containers 官方文档代码: import torch.nn as nn import torch.nn.functional as Fclass Model(nn.Module):def __init__(self):super().__init__()self.conv1 nn.Conv2d(1, 20, 5)self.conv2 nn.…

“TypeError: utils request jS WEBPACK IMPORTED MODULE O .default is undefined‘报错

写项目时报下列错误,找了半天,结果才发现自己在request.js中少写了一行代码 一定不要少些代码 export default requestrequest.js完整代码 import axios from axios;//创建一个新的axios对象 const request axios.create({baseURL:http://localhost:…

C++ 二分法

目录 1、704. 二分查找 2、34. 在排序数组中查找元素的第一个和最后一个位置 3、69. x的平方根 4、35. 搜索插入位置 5、852. 山脉数组的峰顶索引 6、162. 寻找峰值 7、153. 寻找旋转排序数组中的最小值 8、LCR 173. 点名 1、704. 二分查找 ​ class Solution {…

C++入门2

目录 前言: 引用 引用特性: 常引用: 使用场景: 1. 做参数 2. 做返回值 3.引用做返回值(方便读写返回变量) 传值、传引用效率比较: 引用和指针的区别: 内联函数 auto关键字(C11) auto的使用细则&#xff1a…

访问raw.githubusercontent.com失败问题的处理

1 问题 GitHub上的项目的有些资源是放在raw.githubusercontent.com上的,通常我们在安装某些软件的时候会从该地址下载资源,直接访问的话经常容易失败。 # 安装operator kubectl apply -f https://raw.githubusercontent.com/oceanbase/ob-operator/2.1…

R3F(React Three Fiber)经验篇

之前一直在做ThreeJS方向,整理了两篇R3F(React Three Fiber)的文档,这是经验篇,如果您的业务场景需要使用R3F,可以参考一下这个文档。下面是目录,按照需求自取。 基础篇 ⬇️ R3F(…

Android 内存优化内存泄漏处理

一:匿名内部类/非静态内部类 匿名内部类的泄漏原因:匿名内部类会隐式地持有外部类的引用.当外部类被销毁时,内部类并不会自动销毁,因为内部类并不是外部类的成员变量, 它们只是在外部类的作用域内创建的对象,所以内部…

力扣细节题:翻转二叉树

细节一:递归采用前序递归 细节二:采用交换节点而不是交换数据因为左右树交换的同时左右树的所有子节点都要交换 细节三:采用外置函数因为return如果在本函数内操作会存在必须返回空指针的问题 /*** Definition for a binary tree node.* s…

01_02_mysql09_MySQL的数据目录

MySQL的数据目录 学习再总结宋红康老师课程内容1.MySQL8的主要目录结构 安装好MySQL8之后,查看如下的目录结构 find / -name mysql1.1数据库文件的存放路径 MySQL数据库文件的存放路径:/var/lib/mysql/ 1.2相关命令目录 相关命令目录:/u…

番外篇 | YOLOv5+DeepSort实现行人目标跟踪检测

前言:Hello大家好,我是小哥谈。DeepSort是一种用于目标跟踪的深度学习算法。它结合了目标检测和目标跟踪的技术,能够在视频中准确地跟踪多个目标,并为每个目标分配一个唯一的ID。DeepSort的核心思想是将目标检测和目标跟踪两个任务进行联合训练,以提高跟踪的准确性和稳定性…