Arduino-ILI9341驱动开发TFT屏显示任意内容三

Arduino-ILI9341驱动开发TFT屏显示任意内容三

1.概述

这篇文章介绍使用ILI9341驱动提供的函数控制TFT屏显示字符串、图形、符号等等内容的编辑和展示。

2.硬件

2.1.硬件列表

名称数量
Arduino Uno1
2.8" TFT彩色液晶触摸屏模块(ILI9431)1
10K 电阻5
面包板1
杜邦线若干

2.2.TFT触摸屏介绍

1.TFT触摸屏官方资料

https://spotpear.cn/index/study/detail/id/632.html

2.引脚介绍
序号引脚编号说明
1VCC5V/3.3V电源输入
2GND接地
3CS液晶屏片选信号,低电平使能
4RESET液晶屏复位信号,低电平复位
5DC/RS液晶屏寄存器/数据选择信号,低电平:寄存器,高电平:数据
6SDI(MOSI)SPI总线写数据信号
7SCKSPI总线时钟信号
8LED背光控制,高电平点亮,如无需控制则接3.3V常亮
9SDO(MISO)SPI总线读数据信号,如无需读取功能则可不接
10以下为触摸屏信号线接线,如无需触摸或者模块本身不带触摸功能,可不连接
11T_CLK触摸SPI总线时钟信号
12T_CS触摸屏片选信号,低电平使能
13T_DIN触摸SPI总线输入
14T_DO触摸SPI总线输出
15T_IRQ触摸屏中断信号,检测到触摸时为低电平

2.3.硬件电路连接

Arduino接口端TFT触摸屏端
5VVCC
GNDGND
10串联10KΩ电阻到CS
8串联10KΩ电阻到REST
9串联10KΩ电阻到DC
11串联10KΩ电阻到MOSI
13串联10KΩ电阻到SCK
VCCLED
12MISO

在这里插入图片描述

3.ILI9341驱动库使用

这个章节介绍什么
这里主要介绍如何使用ILI9341驱动提供的函数,并且通过代码示例详细介绍每个参数的作用以及将程序烧录到Arduino上显示屏显示的结果。

如何介绍ILI9341驱动函数
该章节会按照显示内容对函数进行分类,比如字符、汉字、图形等等,方便根据需求查找相应函数的使用。

示例展示风格
在介绍示例时会将代码分成两个部分,一个是初始化设置部分,一个是函数介绍部分

  • 初始化设置部分的代码是不修改的,因此只介绍一次
  • 函数介绍部分是实现屏幕显示内容,因此在每个小节中单独介绍。

3.1.基本示例

下面通过一个完整的示例代码介绍在TFT屏幕显示内容,该完整代码包含了初始化设置部分的代码和函数介绍部分,在后面的示例代码中只会给出函数介绍部分代码,运行时只需要加上初始化设置部分代码即可。

1.输出HelloWorld

下面代码用注释方式将初始化设置部分函数介绍部分进行了区分,将全部代码复制到IDE后运行会在显示屏显示HelloWorld


/*********************** 一、初始化设置部分 **********************/#include "Adafruit_ILI9341.h"// 定义引脚功能
#define TFT_DC 9
#define TFT_CS 10
#define  TFT_RST 8
#define TFT_MISO 12
#define TFT_MOSI 11
#define TFT_CLK 13// 1.创建Adafruit_ILI9341类的对象tft,传入SPI引脚参数,
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST, TFT_MISO);void setup() {Serial.begin(9600);Serial.println("ILI9341驱动控制显示屏显示内容"); //2.初始化tfttft.begin();//在IDE控制台输出调试信息Serial.print(F("在IDE控制台输出文字内容"));Serial.println(testText());delay(3000);Serial.println(F("Done!"));}void loop(void) {//调用函数输出文本内容testText();
}/************************ 二、函数介绍部分 ***********************/// 创建函数定义ILI9341驱动操作屏幕输出字符串的功能
unsigned long testText() {//设置背景颜色tft.fillScreen(ILI9341_BLACK);unsigned long start = micros();// 设置文字显示的坐标tft.setCursor(100, 100);//设置文字颜色和字号tft.setTextColor(ILI9341_WHITE);  tft.setTextSize(1);//设置屏幕输出文字内容tft.println("Hello World!");return micros() - start;
}

下面开始介绍各个函数使用实例,介绍的所有函数如果想查看该函数的源代码都可以在Github找到,我们的第二篇文章Arduino-ILI9341驱动介绍二
介绍了Adafruit_ILI9341库的继承体系和项目地址,因此可以参考该篇文章找到。

3.2.输出字符与数字

创建一个函数testText 将输出字符的代码封装到函数中,下面详细介绍下使用
ILI9341驱动将字符输出到屏幕的操作步骤

1.设置屏幕背景颜色
fillScreen函数在Adafruit_GFX类中,该函数用来设置屏幕的背景颜色。
该函数传入的参数ILI9341_BLACKAdafruit_ILI9341类中定义的颜色常量。
如果要改变颜色可以查看该类中其他颜色定义的常量。

tft.fillScreen(ILI9341_BLACK);

2.设置文字在屏幕上显示的坐标位置

tft.setCursor(100, 100);

3.设置字符颜色和字号

tft.setTextColor(ILI9341_WHITE);
//数字越大,字号越大
tft.setTextSize(1);

4.设置输出到屏幕字符内容

tft.println("Hello World!");

计算内容输出时间
创建的testText函数定义了一个long类型的返回值用来接收屏幕显示一次内容的时间。

  • unsigned long start = micros(); 调用micros函数获取开始时间微妙
  • micros() - start; 再次获取一个结束时间减去开始时间就是屏幕上内容显示完成的时间。
unsigned long testText() {unsigned long start = micros();// 输出字符代码...return micros() - start;
}

设置输出字符完整代码

unsigned long testText() {//设置背景颜色tft.fillScreen(ILI9341_BLACK);unsigned long start = micros();// 设置文字显示的坐标tft.setCursor(100, 100);//设置文字颜色和字号tft.setTextColor(ILI9341_WHITE);  tft.setTextSize(1);//设置屏幕输出文字内容tft.println("Hello World!");return micros() - start;
}

3.3.线条

绘制线条使用Adafruit_GFX类中的drawLine函数,该函数接受x和y坐标系参数,其中x0、x1表示水平轴起点到终点坐标;y0、y1表示垂直轴起点到终点坐标。

/*函数名:drawLine返回类型:void,表示这个函数不返回任何值。函数修饰符:virtual,表示这个函数可以在派生类中被重写。参数列表:int16_t x0:表示线条起点的x坐标,使用16位有符号整数表示。int16_t y0:表示线条起点的y坐标,使用16位有符号整数表示。int16_t x1:表示线条终点的x坐标,使用16位有符号整数表示。int16_t y1:表示线条终点的y坐标,使用16位有符号整数表示。uint16_t color:表示线条的颜色,使用16位无符号整数表示。这通常是一个颜色代码,具体的解释(如RGB值)取决于上下文和drawLine函数的实现。*/tft.drawLine(1, 10, 100, 10, color); 

使用drawLine函数绘制线条操作步骤如下
1.定义x和y轴坐标系

//设置x和y轴起始到结束坐标变量 int x1, y1, x2, y2;

2.获取当前屏幕的宽高

//获取屏幕的宽高  int w = tft.width();  int h = tft.height(); 

3.设置背景颜色

// 设置背景颜色tft.fillScreen(ILI9341_BLACK);

4.设置x和y轴绘制坐标数据

//设置x轴起点坐标为0,终点坐标为屏幕的宽度x1 = 0; x2 = w;//设置y轴起点和终点都是高度的一半 y1 = y2 = h/2;  start = micros();  

5.调用drawLine函数绘制线条

tft.drawLine(x1, y1, x2, y2, color); 

完整代码示例实现了在屏幕高度一半的位置画一条水平线

/*创建一个绘制线条函数接受屏幕输出内容运行时间color参数是线条颜色
*/
unsigned long testLines(uint16_t color) {  unsigned long start, t; //设置x和y轴起始到结束坐标变量 int x1, y1, x2, y2;//获取屏幕的宽高  int w = tft.width();  int h = tft.height();  // 设置背景颜色tft.fillScreen(ILI9341_BLACK);   //设置x轴起点坐标为0,终点坐标为屏幕的宽度x1 = 0; x2 = w;//设置y轴起点和终点都是高度的一半 y1 = y2 = h/2;  start = micros();  /*函数名:drawLine返回类型:void,表示这个函数不返回任何值。函数修饰符:virtual,表示这个函数可以在派生类中被重写。参数列表:int16_t x0:表示线条起点的x坐标,使用16位有符号整数表示。int16_t y0:表示线条起点的y坐标,使用16位有符号整数表示。int16_t x1:表示线条终点的x坐标,使用16位有符号整数表示。int16_t y1:表示线条终点的y坐标,使用16位有符号整数表示。uint16_t color:表示线条的颜色,使用16位无符号整数表示。这通常是一个颜色代码,具体的解释(如RGB值)取决于上下文和drawLine函数的实现。*/tft.drawLine(x1, y1, x2, y2, color); // 在这里获取绘制线条所用的时间  t = micros() - start; // 直接返回绘制线条所用的时间  return t;  
}

setup函数中调用testLines函数

void setup() {Serial.begin(9600);Serial.println("ILI9341驱动控制显示屏显示内容"); //2.初始化tfttft.begin();//调用绘制线条函数Serial.print(F("Lines                    "));Serial.println(testLines(ILI9341_CYAN));delay(500);Serial.println(F("Done!"));}

修改坐标系值在屏幕中间绘制一条垂直线

//设置x轴起点坐标为0,终点坐标为屏幕的宽度x1 = w/2; x2 = w/2;//设置y轴起点和终点都是高度的一半 y1 = 0;y2 = h;  start = micros();  tft.drawLine(x1, y1, x2, y2, color); 

动态绘制垂直线和水平线

unsigned long testText() {//设置背景颜色tft.fillScreen(ILI9341_BLACK);unsigned long start = micros();// 设置文字显示的坐标tft.setCursor(100, 100);//设置文字颜色和字号tft.setTextColor(ILI9341_WHITE);  tft.setTextSize(1);//设置屏幕输出文字内容tft.println("Hello World!");tft.setTextColor(ILI9341_YELLOW); tft.setTextSize(2);tft.println(1234.56);return micros() - start;
}/*创建一个绘制线条函数*接受屏幕输出内容运行时间*color参数是线条颜色
*/
unsigned long testLines(uint16_t color) {  unsigned long start, t; //设置x和y轴坐标变量 int x1, y1, x2, y2;//获取屏幕的宽高  int w = tft.width();  int h = tft.height();  // 设置背景颜色tft.fillScreen(ILI9341_BLACK);   x1 = y1 = 0;  y2 = h - 1;  start = micros();  // 绘制垂直线条  for (x2 = 0; x2 < w; x2 +=6) {  tft.drawLine(x1, y1, x2, y2, color);  }  x2 = w - 1;  // 绘制水平线条  for (y2 = 0; y2 < h; y2 += 6) {  tft.drawLine(x1, y1, x2, y2, color);  }  // 在这里获取绘制线条所用的时间  t = micros() - start; // fillScreen的时间不包括在内  // 可以在这里保留或移除yield(),取决于你的具体需求  yield();  // 直接返回绘制线条所用的时间  return t;  
}

3.4.图形

下面是一个绘制矩形图形的函数

/*
int16_t x: 矩形的左上角的x坐标。int16_t是一个16位有符号整数类型,通常用于表示小范围的整数。
int16_t y: 矩形的左上角的y坐标。
int16_t w: 矩形的宽度。
int16_t h: 矩形的高度。
uint16_t color: 用于绘制矩形的颜色。uint16_t是一个16位无符号整数类型,常用于表示颜色值(虽然这取决于具体的颜色表示系统,如RGB565等)
*/
virtual void drawRect(int16_t x, int16_t y, int16_t w, int16_t h,uint16_t color);

绘制一个图形的示例操作步骤如下

unsigned long testRects(uint16_t color) {unsigned long start;// 设置背景颜色tft.fillScreen(ILI9341_BLUE);//定义xy轴和宽高变量int x,y,w,h;//设置绘制矩形x和y轴的起点位置x,y = 100;//设置矩形宽高w = tft.width()/2;h = tft.height()/2;start = micros();tft.drawRect(x, y, w, h, color);return micros() - start;
}

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

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

相关文章

SpringBootWeb 篇-深入了解请求响应(服务端接收不同类型的请求参数的方式)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 请求响应概述 1.1 简单参数 1.2 实体参数 2.3 数组集合参数 2.4 日期参数 2.5 json 参数 2.6 路径参数 3.0 完整代码 1.0 请求响应概述 当客户端发送不同的请求参…

中国1KM年相对湿度数据集1981-2020

大气相对湿度&#xff08;RH&#xff09;是气象/气候监测和研究的关键因素。然而&#xff0c;相对湿度在气候变化研究中的应用并不是很普遍&#xff0c;部分原因是相对湿度观测系列容易由于观测系统中的非气候变化而产生不均匀偏差。 该数据集是中国1km分辨率年相对湿度数据&am…

【MsSQL】数据库基础 库的基本操作

目录 一&#xff0c;数据库基础 1&#xff0c;什么是数据库 2&#xff0c;主流的数据库 3&#xff0c;连接服务器 4&#xff0c;服务器&#xff0c;数据库&#xff0c;表关系 5&#xff0c;使用案例 二&#xff0c;库的操作 1&#xff0c;创建数据库 2&#xff0c;创建…

华为配置Ethernet over GRE实现AC与无线网关之间的二层互通

华为配置Ethernet over GRE实现AC与无线网关之间的二层互通 组网图形 图1 通过Ethernet over GRE实现AC与无线网关之间的二层互通的组网图 组网需求数据规划配置思路操作步骤配置文件 组网需求 如图1所示&#xff0c;某企业通过无线网络为用户提供上网服务&#xff0c;其中A…

探索静态住宅代理IP:网络安全的隐形守护者

在当今这个数字化高速发展的时代&#xff0c;网络安全问题愈发凸显其重要性。无论是企业级的网络运营&#xff0c;还是个人用户的网络活动&#xff0c;都需要一个安全、稳定的网络环境。而在这个环境中&#xff0c;静态住宅代理IP以其独特的优势&#xff0c;逐渐成为了网络安全…

Java——类与对象

目录 一、面向对象的初步认识 1.1 什么是面向对象 1.2 面向对象与面向过程 二、类的定义与使用 2.1 简单认识类 2.2 类的定义格式 三、类的实例化 3.1 什么是实例化 3.2 类和对象的说明 四、this引用 4.1 为什么要有this引用 4.2 什么是this引用 ​编辑 4.3 this引用…

鸿蒙OpenHarmony:【常见编译问题和解决方法】

常见问题 常见编译问题和解决方法 鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 提示“usr/sbin/ninja: invalid option -- w” 现象描述&#xff1a; 编译失败&#xff0c;提示“usr/sbin/ninja: invalid…

设备二维码怎么生成?三分钟即可搞定

在现代工业生产中&#xff0c;设备的维护和巡检是保障生产连续性和安全性的重要环节。随着技术的发展&#xff0c;二维码技术因其便捷性和高效性被广泛应用于设备巡检中。 给每个设备配备一个二维码&#xff0c;一线人员用手机扫一扫&#xff0c;几秒钟就能上报巡检结果&#…

Measurement and Analysis of Large-Scale Network File System Workloads——论文泛读

ATC 2008 Paper 分布式元数据论文阅读笔记整理 问题 网络文件系统在当今的数据存储中发挥着越来越重要的作用。使用网络文件系统可以降低管理成本&#xff0c;从多个位置可靠地访问的数据。这些系统的设计通常以对文件系统工作负载和用户行为的理解为指导[12&#xff0c;19&a…

docker 容器无法直接读取宿主机文件

最近一个需求, 要在后端直接使用代码直接生成 pdf 文档, 由于使用的 apache 的工具包, 该工具包无法直接解析中文字体, 需要导入外部 中文插件包, 相关代码如下: PDPage page new PDPage(PDRectangle.A4);document.addPage(page);PDFont fontFile PDType0Font.load(document…

瑞友天翼应用虚拟化系统SQL注入漏洞

文章目录 漏洞描述漏洞原理影响版本漏洞复现防御方法 漏洞描述 瑞友天翼应用虚拟化系统是基于服务器计算架构的应用虚拟化平台&#xff0c;它将用户各种应用软件集中部署到瑞友天翼服务集群&#xff0c;客户端通过 WEB 即可访问经服务器上授权的应用软件&#xff0c;实现集中应…

Python中的多进程、多线程、协程

Python中的多线程、多进程、协程 一、概述 1. 多线程Thread &#xff08;threading&#xff09;&#xff1a; 优点&#xff1a;同一个进程中可以启动多个线程&#xff0c;充分利用IO时&#xff0c;cpu进行等待的时间缺点&#xff1a;相对于进程&#xff0c;多线程只能并发执…

深入理解JavaScript数组

深入理解JavaScript数组&#xff1a;玩转数据结构 前言数组的基础知识什么是数组如何创建一个数组如何访问数组元素 数组的常用操作数组的长度 length更改数组项数组的遍历数组类型的检测数组的添加和删除元素&#xff08;头尾操作 push()、pop()、unshift()、shift()&#xff…

enable_shared_from_this使用笔记

解决了&#xff1a; 不能通过原指针增加引用次数的问题 &#xff0c;通过weak_ptr实现。 class MyCar:public std::enable_shared_from_this<MyCar> { public:~MyCar() { std::cout << "free ~Mycar()" << std::endl; } };int main() { MyCar* _…

centos7下fastdfs分布式部署

需要先在159及120服务器上安装fastdfs服务 可参考&#xff1a;centos7部署FastDFS服务_centos fastdfs 增加到服务中-CSDN博客 1、整体架构&#xff0c;使用3个服务器节点&#xff0c;其中两台为跟踪器节点及存储节点&#xff0c;一台服务器搭建nginx做统一入口进行负载均衡 …

K8S安装并搭建集群

1. 先给每台机器安装docker环境 卸载旧的docker yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine 配置docker的yum库 yum install -y yum-utilsyum-config-manager --a…

JavaEE之线程(3)_线程的开始、中断、等待、休眠线程、线程的状态

前言 在本栏的上一节&#xff08;https://blog.csdn.net/2301_80653026/article/details/138500558&#xff09;&#xff0c;我们重点讲解了五种不同的创建线程的方式&#xff0c;我们还介绍了Tread类的常见构造方法和常见属性&#xff0c;在这一节中我们将会继续介绍Tread类。…

简单的Python HTML 输出

1、问题背景 一名初学者在尝试将 Python 脚本输出到网页上时遇到了一些问题。他当前使用 Python 和 HTML 进行开发&#xff0c;并且遇到了以下问题&#xff1a; 担心自己的代码过于复杂&#xff0c;尤其是 WebOutput() 函数。希望通过 JavaScript 使用 HTML 模板文件更新数据。…

【PG数据库】PostgreSQL 日志归档详细操作流程

1.1 日志归档的目的 pg数据库日志归档是将PostgreSQL数据库的日志文件进行归档的过程。 归档的主要目的是为了保留历史数据&#xff0c;确保数据的一致性和完整性&#xff0c;同时为数据恢复提供必要的支持。 pg数据库日志归档的目的包括&#xff1a; 1.数据恢复&#xff1…

Tomcat中服务启动失败,如何查看启动失败日志?

1. 查看 localhost.log 这个日志文件通常包含有关特定 web 应用的详细错误信息。运行以下命令查看 localhost.log 中的错误&#xff1a; sudo tail -n 100 /opt/tomcat/latest/logs/localhost.YYYY-MM-DD.log请替换 YYYY-MM-DD 为当前日期&#xff0c;或选择最近的日志文件日…