ESP32+PlatformIO库开发--TFT_eSPI库例程解析(学习笔记1)
文章目录
- 前言
- 一、TFT_Clock_Digital例程简介
- 二、代码记录
- 1.初始化全局变量
- 2.conv2d()函数
- 3.初始化
- 4.loop循环中的程序段
- 总结
前言
本文主要记录自己在VSCode+PlatformIO平台下学习ESP32-S的TFT_eSPI库时对库自带例程的学习。本次学习的第一个项目是TFT_Clock_Digital。本人作为一名单片机爱好者未写过自己的代码,仅仅在业余时间学习此类知识,希望通过阅读别人的代码提升自己的代码能力,难免出现各种错误,请大家批评指正。
一、TFT_Clock_Digital例程简介
TFT_Clock_Digital是一个简单的时钟例程,使用TFT屏幕展示时间。该例程能够更新时间但日期只能显示编译时的日期,没有更新功能。
例程更新时间的方式是通过编译时获取“TIME”并累加millis()函数计算时间。作者提示如果需要更加精确的时间,可以使用RTClib库。
二、代码记录
1.初始化全局变量
#include <TFT_eSPI.h>
#include <SPI.h>TFT_eSPI tft = TFT_eSPI(); //初始化TFT_eSPI对象
uint32_t targetTime = 0; //更新时间标志(本程序中为1秒更新)byte omm = 99;//时间的背景阴影的刷新标志
bool initial = 1;//代码段初始化标志
byte xcolon = 0;//xpos的中间储存变量
unsigned int colour = 0;
上述代码建立了各种后续代码中需要的全局变量,标志等。
2.conv2d()函数
static uint8_t conv2d(const char* p) {uint8_t v = 0;if ('0' <= *p && *p <= '9')//比较字符的ASCII码是否在0和9之间v = *p - '0';//转化为数字return 10 * v + *++p - '0';//把两个字符转化为两位数字
}uint8_t hh=conv2d(__TIME__), mm=conv2d(__TIME__+3), ss=conv2d(__TIME__+6); //从编译时间中分别获取小时分钟秒
该函数实现了将字符串中的前两位取出并转换为数字的功能,其中char*为字符串指针,需要保证输入的字符串为0-99之间的字符才能按照预想输出相应数字,此处输入的是__TIME__,TIME+3,TIME+6。__TIME__是内置宏定义,其意义为在源文件中插入当前编译时间。函数取出的数值为xx:xx:xx这个字符串的零一位,三四位,六七位。
3.初始化
void setup(void) {tft.init();tft.setRotation(1);//旋转90度tft.fillScreen(TFT_BLACK);//填满黑色tft.setTextColor(TFT_YELLOW, TFT_BLACK); // 文本颜色为黄,背景为黑targetTime = millis() + 1000; //初始化计时,单位为毫秒
}
初始化程序实现了调用了实例的函数,完成了相应的功能。
4.loop循环中的程序段
if (targetTime < millis()) {//每秒targetTime = millis()+1000;ss++; // Advance secondif (ss==60) {ss=0;omm = mm;//刷新标志,每分钟更新一次mm++; // Advance minuteif(mm>59) {mm=0;hh++; // Advance hourif (hh>23) {hh=0;}}}//更新时间的内容
首先判断targettime的值,其值在初始化时被赋值为millis()+1000,判断的目的是为了保证每一秒更新一次输出。当millis()函数计数达到上限,时钟就会停止更新。剩下的语句更新时间。
if (ss==0 || initial) {//每一分钟更新一次initial = 0;tft.setTextColor(TFT_GREEN, TFT_BLACK);tft.setCursor (8, 52);tft.print(__DATE__); // This uses the standard ADAFruit small fonttft.setTextColor(TFT_BLUE, TFT_BLACK);tft.drawCentreString("It is windy",120,48,2); // Next size up font 2//tft.setTextColor(0xF81F, TFT_BLACK); // Pink//tft.drawCentreString("12.34",80,100,6); // Large font 6 only contains characters [space] 0 1 2 3 4 5 6 7 8 9 . : a p m}
在第一次更新或每一分钟开始,都会更新当前日期(绿色)和字符串“It is windy”(蓝色)。
// Update digital time更新显示byte xpos = 6;byte ypos = 0;if (omm != mm) { // Only redraw every minute to minimise flicker// Uncomment ONE of the next 2 lines, using the ghost image demonstrates text overlay as time is drawn over ittft.setTextColor(0x39C4, TFT_BLACK); // Leave a 7 segment ghost image, comment out next line!//tft.setTextColor(TFT_BLACK, TFT_BLACK); // Set font colour to black to wipe image// Font 7 is to show a pseudo 7 segment display.// Font 7 only contains characters [space] 0 1 2 3 4 5 6 7 8 9 0 : .tft.drawString("88:88",xpos,ypos,7); // Overwrite the text to clear ittft.setTextColor(0xFBE0); // Orangeomm = mm;//omm此处作为刷新标志,每分钟刷新分钟和小时这两个数if (hh<10) xpos+= tft.drawChar('0',xpos,ypos,7);//多绘制一个零xpos+= tft.drawNumber(hh,xpos,ypos,7);//写小时,并返回位置保存在xposxcolon=xpos;//记录小时后面的坐标位置xpos+= tft.drawChar(':',xpos,ypos,7);//写冒号if (mm<10) xpos+= tft.drawChar('0',xpos,ypos,7);//多绘制一个零tft.drawNumber(mm,xpos,ypos,7);//分钟}
在这个程序段中,会显示整个程序中最主要的部分——电子时钟。电子时钟前景数字(橘色)和阴影(灰色)组成,字体为7号字体(七段数码管样式),程序通过TFT库的绘制函数将每个部分分别绘制出来。
if (ss%2) { // Flash the colon每两秒刷新冒号tft.setTextColor(0x39C4, TFT_BLACK);xpos+= tft.drawChar(':',xcolon,ypos,7);tft.setTextColor(0xFBE0, TFT_BLACK);}else {tft.drawChar(':',xcolon,ypos,7);colour = random(0xFFFF); // Erase the old text with a rectangle, the disadvantage of this method is increased display flickertft.fillRect (0, 64, 160, 20, TFT_BLACK);tft.setTextColor(colour);tft.drawRightString("Colour",75,64,4); // Right justified string drawing to x position 75String scolour = String(colour,HEX);scolour.toUpperCase();//小写变大写char buffer[20];scolour.toCharArray(buffer,20);tft.drawString(buffer,82,64,4);//tft.drawString(scolour,82,64,4);//这样也能实现效果,但时常花屏和画面出错。作者用的是buffer数组实现}
上述程序段完成偶数秒绘制阴影颜色(0x39C4)的冒号,奇数秒绘制文本颜色(0xFBE0)的冒号,同时绘制随机颜色的字符串Colour,并输出Colour颜色的十六进制数值。在程序中通过实例化一个String对象获取字符串,转换为大写,储存在了数组中,最后绘制在了屏幕上。经试验,drawString()函数也能通过直接输出String对象实现字符输出,此处创建一个数组暂未知作者用意。
总结
本文试图通过详细阅读TFT_eSPI库作者提供的例程学校库的用法,并加以记录,希望能在学习库的过程中借鉴其编程方法,提高自身编程技巧。
ESP32+PlatformIO库开发--TFT_eSPI库例程解析(学习笔记1)相关推荐
- python web开发入门_python大佬整理的python web开发从入门到精通学习笔记
原标题:python大佬整理的python web开发从入门到精通学习笔记 Python(发音:英[?pa?θ?n],美[?pa?θɑ:n]),是一种面向对象.直译式电脑编程语言,也是一种功能强大的通 ...
- 《Java Web开发入门很简单》学习笔记
<Java Web开发入门很简单>学习笔记 1123 第1章 了解Java Web开发领域 Java Web主要涉及技术包括:HTML.JavaScript.CSS.JSP.Servlet ...
- 《Node.js开发实战详解》学习笔记
<Node.js开发实战详解>学习笔记 --持续更新中 一.NodeJS设计模式 1 . 单例模式 顾名思义,单例就是保证一个类只有一个实例,实现的方法是,先判断实例是否存在,如果存在则直 ...
- 深入浅出图神经网络|GNN原理解析☄学习笔记(四)表示学习
深入浅出图神经网络|GNN原理解析☄学习笔记(四)表示学习 文章目录 深入浅出图神经网络|GNN原理解析☄学习笔记(四)表示学习 表示学习 表示学习的意义 离散表示与分布式表示 端到端学习 基于重构损 ...
- 算法学习 (门徒计划)4-3 专项面试题解析 学习笔记
算法学习 (门徒计划)4-3 专项面试题解析 学习笔记 前言 LeetCode 1367. 二叉树中的列表 解题思路 示例代码 LeetCode 958. 二叉树的完全性检验 解题思路 示例代码 Le ...
- Arduino开发-TFT_eSPI库学习
TFT_eSPI库学习 文章目录 TFT_eSPI库学习 TFT_eSPI库安装以及配置 TFT_eSPI库文件目录 配置文件 1.User_Setup_.h 2. User_Setup_Select ...
- PlatformIO平台使用TFT_eSPI库驱动IC为ST7789的TFT屏幕(TFT_eSPI详解)
TFT_eSPI库的安装 首先在Libraries里面搜索安装TFT_eSPI库到你的工程文件里面. 我们需要在这里选择要添加TFT_espi库的工程里面,选择完之后就直接Add就添加好了. TF ...
- 【08】STM32·HAL库开发-HAL库介绍 | STM32Cube固件库介绍 | HAL库框架结构 | 如何使用HAL库及使用注意事项
目录 1.初识HAL库(了解) 1.1CMSIS简介 1.2HAL库简介 2.STM32Cube固件包浅析(了解) 2.1如何获取STM32Cube固件包? 2.2STM32Cube固件包文件夹简介 ...
- Mixly第三方库开发——OLED库
前言 Mixly自从2015年问世以来,就深受国内创客.中小学教师喜爱,如今已经成为国内最好用的Arduino图形化软件之一.Mixly最大的优点就是其开放性,Mixly建立了一个生态圈,这个生态圈欢 ...
最新文章
- Java Persistence API中的FetchType LAZY和EAGER之间的区别?
- 置换怎么表示成轮换_§2.3 置换群
- 服务器mysql显示链接次数太多,服务器mysql显示链接次数太多
- MySQL 迁移到半同步模式
- 工作278:控制数据从字典表获取
- perl中的文件句柄
- CGI-Plus v5.0.0.6 一键系统备份恢复工具箱单文件增强版
- 因多次登录失败导致的账户锁定,ssh无法登录处理
- Packet Tracer 思科模拟器入门教程
- 定时任务cron表达式详解
- java高级进阶面试题
- python爬楼梯多少种_LeetCode70爬楼梯-Python3-两种方法实现
- android 打开闹钟,Android中的闹钟设置关闭和打开
- 学车考试技巧(图解)
- navicat如何粘贴多行数据
- 【论文笔记】EagerMOT:3D Multi-Object Tracking via Sensor Fusion
- 使用Windows PE部署Windows镜像
- 使用孪生网络和零样本学习进行文本分类
- U盘写保护无法格式化
- POI java导出Excel设置自适应行高
热门文章
- 笔记本计算机恢复出厂设置软件,恢复出厂设置的笔记本怎样恢复数据?
- python3实现二维码定位及识别
- 【STM32F407开发板用户手册】第35章 STM32F407的FSMC总线应用之驱动AD7606(8通道同步采样, 16bit, 正负10V)
- 【STM32F429开发板用户手册】第35章 STM32F429的FMC总线应用之驱动AD7606(8通道同步采样, 16bit, 正负10V)
- 07 Linux软件包管理
- 打包工具-rollup
- 帧率越高越清晰吗?怎么提高视频画质质量?
- Android App 性能优化之启动优化
- windows如何查看jdk安装目录
- linux驱动开发笔记 一 基本流程