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

news2024/12/25 12:31:36

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;
}

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

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

相关文章

从JSON数据到Pandas DataFrame:如何解析出所需字段

目录 一、引言 二、JSON数据的基本结构 三、使用Pandas从JSON数据中读取数据 四、从DataFrame中解析出所需字段 解析对象字段 解析嵌套对象字段 解析数组字段 五、案例与代码示例 六、总结 一、引言 在数据分析和处理的日常工作中&#xff0c;我们经常需要从各种…

基于单片机的空气质量检测系统设计(51+4G版)-设计说明书

设计摘要&#xff1a; 本设计是基于单片机的空气质量检测系统设计涉及以下主要功能&#xff0c;旨在监测甲烷和一氧化碳的浓度&#xff0c;并在浓度过高时采取相应措施&#xff0c;以确保室内空气质量的安全。该系统使用传感器对甲烷和一氧化碳的浓度进行检测。传感器将收集到…

大数据Scala教程从入门到精通第七篇:Scala在IDEA中编写Hello World

一&#xff1a;Scala在IDEA中编写Hello World 想让我们的idea支持scala的编写&#xff0c;需要安装一个插件。

kdb 调试内核-延迟驱动加载

说明: 系统在启动过程中&#xff0c;一些要调试的驱动在 "进入kdb 之前" 就已经加载了&#xff0c; 那么&#xff0c;我们就需要延迟 "加载驱动" #define XX_module_platform_driver(__platform_driver) \XX_module_driver(__platform_driver, platform_d…

以太ETH链市值机器人

在数字资产交易市场的浪潮中&#xff0c;如何高效地管理市值、提升交易流动性并保障资金安全&#xff0c;一直是交易所和项目方关注的焦点。市值管理机器人飞机//aishutuyu以太ETH链市值机器人凭借其卓越的功能和强大的安全保障&#xff0c;为数字资产交易市场带来了革命性的变…

python视频转码脚本

今天有一个临时的需求&#xff0c;就是需要将一个wmv的初步转码成mp4的格式。找了一圈&#xff0c;免费的工具少&#xff0c;即使有免费的工具&#xff0c;在功能上也是有所限制&#xff0c;或者会给你塞广告或者附带安装其它流氓小游戏或者杀毒程序。 我并非不支持正版&#…

矩阵稀疏扫描 - 矩阵

系列文章目录 文章目录 系列文章目录前言一、题目描述二、输入描述三、输出描述四、Java代码五、测试用例提示 前言 本人最近再练习算法&#xff0c;所以会发布一些解题思路&#xff0c;希望大家多指教 一、题目描述 如果矩阵中的许多系数都为零&#xff0c;那么该矩阵就是稀…

【Spring】初识 Spring AOP(面向切面编程)

目录 1、介绍AOP 1.1、AOP的定义 1.2、AOP的作用 1.3、AOP的核心概念及术语 2、AOP实现示例 3、EnableAspectJAutoProxy注解 1、介绍AOP 1.1、AOP的定义 AOP&#xff08;Aspect Orient Programming&#xff09;&#xff0c;直译过来就是面向切面编程&#xff0c;AOP 是一…

windows使用Docker-Desktop部署lobe-chat

文章目录 window安装docker-desktop下载和启动lobe-chatAI大语言模型的选择lobe-chat设置大模型连接 window安装docker-desktop docker-desktop下载地址 正常安装应用&#xff0c;然后启动应用&#xff0c;注意启动docker引擎 打开右上角的设置&#xff0c;进入Docker Engine设…

wangEditor富文本编辑器与layui图片上传

记录&#xff1a;js 显示默认的wangEditor富文本编辑器内容和图片 <style>body {background-color: #ffffff;}.layui-form-select dl{z-index:100000;} </style> <div class"layui-form layuimini-form"><div class"layui-form-item"…

【IC前端虚拟项目】验证环境env与base_teat思路与编写

【IC前端虚拟项目】数据搬运指令处理模块前端实现虚拟项目说明-CSDN博客 上一篇里解决了最难搞的axi_ram_model,接下来呢就会简单又常规一些了,比如这一篇要说的env和base_test的搭建。在这里我用了gen_uvm_tb脚本: 【前端验证】验证自动化脚本的最后一块拼图补全——gen_t…

一个全栈SpringBoot项目-Book Social Network

一个全栈SpringBoot项目-Book Social Network BSN是一个会员之间交换图书的社交网络平台。图书社交网络是一个全栈应用程序&#xff0c;使用户能够管理他们的图书收藏并与图书爱好者社区互动。它提供的功能包括用户注册、安全电子邮件验证、图书管理&#xff08;包括创建、更新…

使用SPI驱动串行LCD的驱动实现(STM32F4)

目录 概述 1. 硬件介绍 1.1 ST7796-LCD 1.2 MCU IO与LCD PIN对应关系 2 功能实现 2.1 使用STM32Cube配置Project 2.2 STM32Cube生成工程 3 代码实现 3.1 SPI接口实现 3.2 LCD驱动程序实现 3.3 测试程序实现 4 测试 源代码下载地址&#xff1a; https://gitee.com/mf…

[蓝桥杯]真题讲解:AB路线(BFS+分层图)

[蓝桥杯]真题讲解&#xff1a;AB路线&#xff08;BFS分层图&#xff09; 一、视频讲解二、正解代码1、C2、python33、Java 一、视频讲解 [蓝桥杯]真题讲解&#xff1a;AB路线&#xff08;BFS分层图&#xff09; 二、正解代码 1、C #include<bits/stdc.h> #define INF …

大数据Scala教程从入门到精通第八篇:Scala在IDEA中编写Hello World

一&#xff1a;Scala在IDEA中编写Hello World object HelloWorld {def main(args: Array[String]): Unit {println("hello world")}}这个对象也单例的。 特殊的Java类库需要import

【Java 查询树结构列表,递归删除子节点】

Java 获取列表树结构&#xff0c;递归删除子节点 数据库表结构ModelVO查询树结构列表递归删除子节点 数据库表结构 Model Data AllArgsConstructor NoArgsConstructor public class TBaseDept {/** ID */private String id;/** 单位名称 */private String fdName;/** 部门编码…

Python | Leetcode Python题解之第84题柱状图中最大的矩形

题目&#xff1a; 题解&#xff1a; class Solution:def largestRectangleArea(self, heights: List[int]) -> int:n len(heights)left, right [0] * n, [n] * nmono_stack list()for i in range(n):while mono_stack and heights[mono_stack[-1]] > heights[i]:righ…

scanf留下的那一片云彩

【题目描述】 给出一个由O和X组成的串&#xff08;长度为1&#xff5e;80&#xff09;&#xff0c;统计得分。每个O的得分为目前连续出现的O的个数&#xff0c;X的得分为0。例如&#xff0c;OOXXOXXOOO的得分为1200100123。 输入第一行表示有n个字符串&#xff0c;后续是n行字…

1056: 邻接表到邻接矩阵

解法&#xff1a; #include<iostream> #include<vector> #include<string> using namespace std; int arr[100][100]; int main() {int n;cin >> n;getchar();vector<string> s(n);for (int i 0; i < n; i) {getline(cin, s[i]);}for (int …

进程间通信:连接不同程序世界的桥梁

目录 一、进程间通信的重要性 二、常见的进程间通信方式 三、进程间通信的目的 四、进程间通信的本质 在计算机编程的领域中&#xff0c;进程间通信&#xff08;Inter-Process Communication&#xff0c;IPC&#xff09;是一个至关重要的概念。当我们在操作系统中运行多个程…