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.初始化tft
  tft.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.初始化tft
  tft.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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

什么是web3D?应用场景有哪些?如何实现web3D展示?

Web3D是一种将3D技术与网络技术完美结合的全新领域&#xff0c;它可以实现将数字化的3D模型直接在网络浏览器上运行&#xff0c;从而实现在线交互式的浏览和操作。 Web3D通过将多媒体技术、3D技术、信息网络技术、计算机技术等多种技术融合在一起&#xff0c;实现了它在网络上…

QT6 android程序界面强制横屏显示不旋转

QT6开发的Android程序有时候旋转后程序会变形&#xff0c;比如想让其固定位横屏显示&#xff0c;就需要进行特殊设置&#xff0c;本文提供一种简便的设置方法。 一.AndroidManifest.xml文件介绍 Android的Manifest.xml文件是一个重要的配置文件&#xff0c;用于描述应用程序的…

2024.5.9 关于 SpringCloud —— Nacos 的安装与配置

目录 Windos 安装步骤 docker 启动 nacos Windos 安装步骤 1&#xff09;点击下方链接&#xff0c;进入并访问 nacos 官网 Nacos官网 | Nacos 官方社区 | Nacos 下载 | Nacos 2&#xff09;按照下图箭头指示下载对应版本的压缩包 3&#xff09;此时我们将得到一个压缩包&…

ARM时钟树结构(GD32)

时钟树的简易框图 初始化配置系统时钟 配置系统初始化时钟&#xff08;参考手册&#xff09; 对应hal库函数 使用72MHz的系统时钟 do -----------while&#xff08;0&#xff09;的使用方法 系统时钟 #include <stdint.h> #include "gd32f30x.h"int main(void)…

分布式事务技术方案

什么是分布式事务 一次课程发布操作需要向数据库、redis、elasticsearch、MinIO写四份数据&#xff0c;这里存在分布式事务问题。 什么是分布式事务&#xff1f; 首先理解什么是本地事务&#xff1f; 平常我们在程序中通过spring去控制事务是利用数据库本身的事务特性来实现…

Rancher-Kubewarden-保姆级教学-含Demo测试

一、什么是Kubewarden&#xff1f; What is Kubewarden? | Kubewarden 1、就是容器集群的准入策略引擎。 1、使用的策略其实就是k8s原生的security context. 2、使用WebAssembly来编写策略。 1、WebAssembly&#xff0c;可以使用擅长的开发语言来编写策略。&#xff08;下面的…

shared_ptr 引用计数相关问题

前言 智能指针是 C11 增加的非常重要的特性&#xff0c;并且也是面试的高频考点&#xff0c;本文主要解释以下几个问题&#xff1a; 引用计数是怎么共享的、怎么解决并发问题的资源释放时&#xff0c;控制块的内存释放吗weak_ptr 怎么判断对象是否已经释放 文中源码用的是 L…

CSS的基础语法和常见的语法简单归纳

CSS CSS 是层叠样式表&#xff08;Cascading Style Sheets&#xff09;的缩写。它是一种用来控制网页样式和布局的标记语言。通过 CSS&#xff0c;可以定义网页中的元素&#xff08;如文字、图像、链接等&#xff09;的外观和排版方式&#xff0c;包括字体、颜色、大小、间距、…

【Android】Apk图标的提取、相同目录下相同包名提取的不同图标apk但是提取结果相同的bug解决

一般安卓提取apk图标我们有两种常用方法&#xff1a; 1、如果已经获取到 ApplicationInfo 对象&#xff08;假设名为 appInfo&#xff09;&#xff0c;那么我们获取方法为&#xff1a; appInfo.loadIcon(packageManager)// 返回一个 Drawable 对象2、 如果还没获取到 Applica…

静态分析-RIPS-源码解析记录-01

token流扫描重构部分&#xff0c;这一部分主要利用php的token解析api解析出来的token流&#xff0c;对其中的特定token进行删除、替换、对于特定的语法结构进行重构&#xff0c;保持php语法结构上的一致性 解析主要在lib/scanner.php中通过Tokenizer这个类来实现,也就是在main…

ICode国际青少年编程竞赛- Python-4级训练场-列表综合练习

ICode国际青少年编程竞赛- Python-4级训练场-列表综合练习 1、 Flyer[3].step(1) Flyer[7].step(2) Flyer[11].step(1) for i in range(4):Flyer[i * 2].step(1) Flyer[8].step(3)for i in range(3):Dev.turnRight()Dev.step(-5)2、 for i in range(5):Flyer[i5].step(Flyer[…

git 推送github 选https遇到登录 openSSH问题

使用https需要使用github令牌token作为密码&#xff0c; 使用SSH不需要登录。 还有一个问题&#xff1a; 创建github仓库后没有quick setup页面解决办法 千万不要点击任何多的操作&#xff01;&#xff01;&#xff01;输入仓库名&#xff0c;直接create&#xff01;&#x…

数据分析——业务指标分析

业务指标分析 前言一、业务指标分析的定义二、业务问题构建问题构建的要求 三、业务问题的识别在识别问题的阶段对于企业内部收益者的补充 四、竞争者分析竞争者分析的内容竞争者分析目的案例 五、市场机会识别好的市场机会必须满足的条件市场机会案例 六、风险控制数据分析师常…

多模态CLIP和BLIP

一、CLIP 全称为Contrastive Language-Image Pre-Training用于做图-文匹配&#xff0c;部署在预训练阶段&#xff0c;最终理解为图像分类器。 1.背景 以前进行分类模型时&#xff0c;存在类别固定和训练时要进行标注。因此面对这两个问题提出CLIP&#xff0c;通过这个预训练…

1.前端环境搭建

1.安装nodejs 因为我们开发Vue项目需要使用npm命令来创建和启动&#xff0c;安装node.js是为了获得这个命令&#xff0c;目前和使用node.js无关 下载地址&#xff1a;http://nodejs.cn/download/ 下载完之后安装&#xff0c;通过cmd查看是否安装成功 node --version2.创建项目…

老板必读:防数据泄露,保卫您的商业秘密

在信息技术高速发展的今天&#xff0c;数据泄露已成为所有企业都必须正视的风险。对于企业而言&#xff0c;数据不仅仅是一堆数字和信息的集合&#xff0c;更是企业的核心竞争力与商业秘密的载体。一旦数据泄露&#xff0c;不仅会导致经济损失&#xff0c;还可能使企业信誉受损…

如何解读 Web 自动化测试 Selenium API?

Web自动化测试是一种通过编写代码来模拟用户操作&#xff0c;并验证Web应用程序的功能和性能的技术。Selenium是一个流行的Web自动化测试工具&#xff0c;它提供了一组API来与Web浏览器进行交互。在本文中&#xff0c;我们将深入探讨Selenium API&#xff0c;并解释如何从零开始…

conan2 基础入门(01)-介绍

conan2 基础入门(01)-介绍 文章目录 conan2 基础入门(01)-介绍⭐什么是conan官网Why use Conan? ⭐使用现状版本情况个人知名开源企业 ⭐ConanCenter包中心github ⭐说明文档END ⭐什么是conan 官网 官网&#xff1a;Conan 2.0: C and C Open Source Package Manager 一句话来…

二维视觉尺寸测量简单流程

代码示例&#xff1a;opencv实战---物体尺寸测量_opencv尺寸测量精度-CSDN博客 灰度化 简化图像处理&#xff1a;灰度图像只包含亮度信息&#xff0c;不包含颜色信息&#xff0c;因此数据量比彩色图像小&#xff0c;处理起来更加简单和快速。这对于需要实时处理大量图像数据的场…

virtualbox下ubantu20.04版本实现与window的复制粘贴

1.建议开启双向 2.打开Ubuntu命令终端 快捷键 ctrialtt&#xff0c;具体在设置里面查看快捷键 3.卸载已有工具 sudo apt-get autoremove open-vm-tools4.安装 sudo apt-get install open-vm-tools-desktop5.记得sudo reboot重启 sudo reboot这里记得加上sudo&#xff0c;…