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 请求响应概述 当客户端发送不同的请求参…

Selenium定位方法及代码

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

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

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

使用依赖注入(DI)的方式实现对冗余代码的解耦

1.1、优化前代码 GetMapping("/test") public void test(RequestParam("params") String params){if("1".equals(params)){// 逻辑代码}if("2".equals(params)){// 逻辑代码}if("3".equals(params)){// 逻辑代码} }1.2、优…

『大模型笔记』Google DeepMind and Isomorphic Labs联合发布AlphaFold 3!

Google DeepMind and Isomorphic Labs联合发布AlphaFold 3! 文章目录 一. Google DeepMind and Isomorphic Labs联合发布AlphaFold 3!AlphaFold 3 及其后续研究总结视频中提到的局限性AlphaFold Server结论二. 参考文献中文字幕视频链接,欢迎关注我的xhs账号:Google CEO 皮…

【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…

GO: 定时器NewTimer、NewTicker 和time.After

Go 之iota iota是一个常量计数器&#xff0c;一般在常量表达式中使用&#xff0c;可以理解为const定义常量的行数的索引&#xff0c;注意是行数 使用场景 主要应用在需要枚举的地方 示例1 package main import "fmt" const (NoPay iota // 订单未支付 0Pai…

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

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

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

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

Chrome浏览器的一些实用命令

Chrome浏览器提供了许多实用的命令和内部页面&#xff0c;可以帮助用户更高效地管理和使用浏览器。以下是一些常用的Chrome命令和内部页面&#xff1a; chrome://about/: 查看所有支持的命令和内部页面。在地址栏中输入这个命令后&#xff0c;会列出所有可用的内部命令和URL&a…

C++ LCR 090. 打家劫舍 II

文章目录 一、题目描述二、参考代码 一、题目描述 一个专业的小偷&#xff0c;计划偷窃一个环形街道上沿街的房屋&#xff0c;每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 &#xff0c;这意味着第一个房屋和最后一个房屋是紧挨着的。同时&#xff0c;相邻的房屋…

408数据结构算法题专项-链表总结归纳

历年链表题目详解&#xff1a; 2009 倒数第k结点 2012 找共同后缀起始 2015 删除绝对值相同点 2019 重新排列结点 分析&#xff1a;难度整体来说不难&#xff0c;重点考察的是基本功和画图。 重点需要掌握的技巧&#xff1a; ①增 增加即利用头插法或尾插法进行结点添加 …

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

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

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

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

MutationObserver对象

MutationObserver对象 MutationObserver (W3C DOM4)对象提供了监视对DOM树所做更改的能力,其被设计为旧的Mutation Events功能的替代品(该功能是DOM3 Events规范的一部分)。 描述 Mutation Observer用来监视DOM变动,DOM的任何变动,例如节点的增减、属性的变动、文本内容的…

JavaScript之importrequire总结

概述 我们在写js代码时&#xff0c;为了方便维护&#xff0c;会使用高内聚低耦合的方式把不同的功能写入不同的文件中&#xff0c;但是不同的文件如何交互呢&#xff1f; 这个时候我们的import、require就可以出场了&#xff0c;它们就是为了解决在A文件中引入B文件中的内容的…