(ESP32学习13)驱动TFTLCD(SPI接口)

2023-11-13

本篇博文教大家ESP32 驱动TFT(SPI驱动),本文给大家的库直接适用于2寸(240*320)的SPI-TFT,但实际上这种驱动移植适用于所有的SPI驱动的TFT屏幕,底层代码把LCD初始化里面的寄存器参数改一改就适用了(这些寄存器参数在你买的屏幕的官方驱动里面有)

首先我们要知道我们要把移植的代码写在什么地方

在这里插入图片描述
这就是我们的代码要移植到的地方

看看驱动效果

在这里插入图片描述

直接给大家上代码,由于我们使用的是SPI,不受IO限制,我在底层写了一个IO绑定函数(lcd_io_set),我们直接用这个函数把我们要连接的脚传入即可(具体再代码中可以看到)

#include "2_TFT_SPI.h"  
extern char FONT16[][32];
extern char FONT24[][72];
extern char FONT32[][128];
extern unsigned char gImage_uzi[96000];

void setup() {
  Serial.begin(115200);
  lcd_io_set(2,4,5,19,22,23);  //LCD IO 的设置 ,传入参数顺序分别是:SCL SDA DC CS RES BLK (BLK可以填写零,那么我们直接把BLK接在3.3v高电平上就可以不用IO控制背光)
  LCD_Init();
  }

void loop() {
  LCD_Clear(WHITE);
  /* 这两个参数叫做默认画笔参数,是在模块驱动内定义好的,一个是画笔颜色一个是背景颜色,设置之后凡是不传入颜色的画图,显示字符等都是用这一对参数,我们可以改变它 */
  POINT_COLOR = GREEN;  BACK_COLOR = 0xffff;   
  
  LCD_Fill(20, 20, 220, 80, RED);  //指定矩形区域填充什么颜色,参入参数分别是矩形区域左上角XY坐标以及右下角XY坐标,然后是填充的颜色
  LCD_DrawLine(20, 20, 220, 80);  //画线函数,颜色使用上面的默认的那种
  LCD_DrawRectangle(20, 100, 120, 140);  //画矩形函数,传入参数直接是左上角和右下角的XY坐标,颜色就是使用默认的上面那对画笔参数
  gui_circle(30, 180, YELLOW, 30, 1);  //画圆函数,传入参数分别为:圆心XY坐标,颜色,半径,以及是否填充(1为填充,0为不填充)
  gui_circle(120, 180, BLUE, 30, 0);
  Draw_Triangel(30, 220, 0, 260, 60, 260);  //在指定位置画三角形,传入参数就是三角形的三个点(上-左-右)
  Fill_Triangel(90, 220, 60, 260, 120, 260);  //在指定位置填充三角形,用法与上面画三角形一样,但是会填充为画笔颜色的颜色
  
  delay(2000);
  LCD_Clear(BLACK);
  POINT_COLOR = RED;  BACK_COLOR = BLACK;
  LCD_ShowChar(20, 0, RED, BLACK, 'C', 16, 1);
  //显示英文字符串,传入参数分别是:显示字符串起始位置XY坐标,字体大小(可以选12或者16,分别代表1206和1608两种字体),最后是是否进行覆盖(0是不覆盖,1是覆盖),颜色用的是默认的画笔参数
  LCD_ShowString(20,20, 12, "hello", 1);  
  LCD_ShowString(20,40, 16, "world", 1);
  
  LCD_ShowNum(20, 60, 615, 6, 16);  //显示数字(整数),传入参数为:显示的起始XY坐标,要显示的数字(这里我写的615),数字长度(这里写6就是可以显示6位以内,可以自己改),然后是字体大小,同样是填12或者16
  //显示小数的方法:
  char buffer_temp[20] = "";
  sprintf(buffer_temp, "show float num:%0.3f", 13.14);  //把小数强制转化到一个数组里面进行显示,这种方法同样适用于其他类型的数字,也可以用0.3f%这种保存一定精度
  LCD_ShowString(20,80, 16, buffer_temp, 1);
  memset(buffer_temp, 0, sizeof(buffer_temp));    //清空字符串

  DrawFont16(20, 100, GREEN, RED, FONT16[0], 1);  //写一个16x16中文字符,FONT16[0]就代表第零个中文字符
  DrawFont16(20+16, 100, GREEN, RED, FONT16[1], 0);  //写一个16x16中文字符,FONT16[0]就代表第零个中文字符

  DrawFont24(20, 125, GREEN, RED, FONT24[0], 1);  //写一个16x16中文字符,FONT16[0]就代表第零个中文字符
  DrawFont24(20+24, 125, GREEN, RED, FONT24[1], 0);  //写一个16x16中文字符,FONT16[0]就代表第零个中文字符

  DrawFont32(20, 165, GREEN, RED, FONT32[0], 1);  //写一个16x16中文字符,FONT16[0]就代表第零个中文字符
  DrawFont32(20+32, 165, GREEN, RED, FONT32[1], 0);  //写一个16x16中文字符,FONT16[0]就代表第零个中文字符
  
  delay(2000); 
  showimage(gImage_uzi, 200, 240, 0, 0);
  delay(2000);
}       

/* ******************************************************************************************************************************************************** */
/* ********************************************* 我们取的字模,取字模配置及其大小不能变但是字体形式可以自己选 ************************************************ */
/* ******************************************************************************************************************************************************** */
char FONT16[][32] =  /* 16x16 大小字体的字模,取模方法在博文中已经给出,取出后放在这里,记住按顺序填好后面“深,0”这样的标号方便自己知道是哪个 */
{
0x00,0x00,0x27,0xFC,0x14,0x04,0x14,0xA4,0x81,0x10,0x42,0x08,0x40,0x40,0x10,0x40,
0x17,0xFC,0x20,0x40,0xE0,0xE0,0x21,0x50,0x22,0x48,0x2C,0x46,0x20,0x40,0x00,0x40,/*深,0*/
0x11,0x04,0x11,0x24,0x11,0x24,0x11,0x24,0x11,0x24,0xFD,0x24,0x11,0x24,0x11,0x24,
0x11,0x24,0x11,0x24,0x11,0x24,0x1D,0x24,0xE1,0x24,0x42,0x24,0x02,0x04,0x04,0x04,/*圳,1*/
};

char FONT24[][72] =
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,
0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x3F,0xFF,0xFE,0x30,0x18,0x06,0x30,0x18,
0x06,0x30,0x18,0x06,0x30,0x18,0x06,0x30,0x18,0x06,0x3F,0xFF,0xFE,0x30,0x18,0x06,
0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*中,0*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x1C,0x00,0x00,
0x06,0x00,0xFF,0xFF,0xFF,0x06,0x00,0x30,0x06,0x00,0x30,0x03,0x00,0x60,0x03,0x00,
0x60,0x01,0x80,0xC0,0x00,0xC1,0x80,0x00,0xE3,0x00,0x00,0x36,0x00,0x00,0x1C,0x00,
0x00,0x77,0x00,0x03,0xC1,0xE0,0x1E,0x00,0x3C,0x60,0x00,0x07,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*文,1*/
};

char FONT32[][128] =
{
0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0xC0,0x00,
0x00,0x01,0xC0,0xC0,0x00,0x01,0x07,0xC0,0x00,0x01,0xFF,0x00,0x02,0x1F,0xFE,0x00,
0x07,0xF0,0x1C,0x00,0x07,0xC0,0x70,0x00,0x0F,0x00,0xE0,0x00,0x0E,0x03,0xF0,0x00,
0x1C,0x0F,0xF0,0x00,0x3C,0x0F,0x70,0x00,0x3C,0x00,0xE0,0x00,0x18,0x00,0xC0,0x00,
0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x20,0x00,
0x00,0x00,0x37,0x00,0x00,0x01,0xFF,0x00,0x00,0x7F,0xF8,0x00,0x07,0xF8,0x30,0x00,
0x1F,0x80,0x30,0x00,0x00,0x80,0x30,0x00,0x00,0xC0,0x30,0x00,0x00,0x60,0x60,0x00,
0x00,0x18,0xE0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,/*字,0*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xE0,
0x00,0x20,0x01,0xB8,0x00,0x70,0x3F,0xF8,0x00,0x61,0xFF,0xC0,0x00,0xC3,0x03,0x00,
0x01,0xC6,0x06,0x00,0x03,0x8C,0x06,0x00,0x03,0x08,0x0C,0x00,0x06,0x08,0x0C,0x00,
0x0E,0x18,0x18,0x3F,0x1E,0x10,0x1B,0xF3,0x1F,0x90,0x3F,0x07,0x00,0x80,0x3C,0x1C,
0x01,0x90,0x70,0x7C,0x01,0x90,0x60,0xFE,0x01,0xA0,0xC3,0xF8,0x01,0xA0,0x0F,0xD8,
0x03,0xA0,0x08,0x18,0x03,0x60,0x00,0x18,0x03,0x40,0x00,0x18,0x03,0xC0,0x00,0x18,
0x03,0x80,0x00,0x18,0x03,0x00,0x00,0x18,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x10,
0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*体,1*/
};

unsigned char gImage_uzi[96000] = {  }  //这里就太长了,所以不贴出整个图像数组

底层驱动下载:下载之后把代码放到我文章开头说的位置,就可以直接使用我的库了(实际上只有一个.C .H 以及一个一个字库文件,我把他们集合到一起了,虽然看起来有千把行代码,但是加上不难哈,有兴趣的话看一看,很容易看懂,而库的具体用法直接看上面的代码,写的很明白了哈)

百度云盘:https://pan.baidu.com/s/1EwQzfXXMDJkx_8p8PHCPcA
提款码:phh1

关于取字模,图模

去我的STM32系列教程里面有一篇驱动4寸SPI的文章,里面的取字模方法和取图模方法和这个是一样的

最后

我的ESP32的基础教程我觉得也更近半了把,下一步我会更使用ESP32驱动 SPI 和 IIC的一些模块,至少会更软件SPI驱动2.0寸TFT的博文和4.0寸带触摸的TFT的博文,然后还会更一篇用ESP32驱动NFR24L01无线模块的博文,这是非常有用的,我们可以直接让ESP32带着这种无线模块(ZIGBEE – LORA等等),直接成为我们局域组网的中心,把数据汇总并且上传到网络上(后面会讲ESP32对接阿里云物联网平台),所以ESP32的教程可能会拉到40篇甚至往上,后面还会更SD卡和ESP32-CAM的使用,道阻且长,同时也相当于我用这个东西这么长时间以来的一种总结,笔记

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(ESP32学习13)驱动TFTLCD(SPI接口) 的相关文章

  • MYSQL导出数据出现The MySQL server is running with the --secure-file-priv option

    今天尝试使用 into outfile导出数据的时候出现错误 The MySQL server is running with the secure file priv option so it cannot execute this st
  • 服务器r730系统备份软件,r730服务器

    r730服务器 内容精选 换一换 创建外表语法 CREATE FOREIGN TABLE SQL on Hadoop or OBS 中 需指定一个与MRS数据源连接相关联的外部服务器 当您通过GaussDB DWS 管理控制台创建MRS数据
  • 区块链为每一笔交易盖上时间戳

    黄老邪在传授记账方法时 要求居民将发生在桃花岛上的每一笔交易都记录下来 并且要求他们将交易发生的时间也一并记录在账本上 这就相当于区块链为每一笔交易在发生时盖上了时间戳 在区块链中 时间戳的应用是对每一次交易记录的认证 它就像交易合同公证一
  • 判断map集合是否为空和是否为null

  • 稀疏矩阵转置(C语言)

    最近有数据结构实验课了 还得学一学数据结构喽 以后就把学习经过贴上来了 稀疏矩阵 当一个数组中大部分元素为 或者为同一个值的数组时 可以使用稀疏数组来保存该数组 稀疏数组的处理方法 1 记录数组一共有几行几列 有多少个不同的值 假设有sum
  • linux 切换不了csh,BASH & CSH linux  重定向(ZZ)

    bash 应该允许输入来自以下两种方式 在命令行上指定的文件名 例如 command input file 在这个例子中 command 应该读取文件 input file 标准输入 stdin 缺省情况下为终端 也就是用户的键盘 例如 c
  • TX2支持reboot办法

    手头有台TX2 想要远程控制reboot 在nvidia账号下直接敲命令 nvidia tegra ubuntu sudo reboot h sudo password for nvidia nvidia is not in the sud
  • 驱动开发 作业 day7 9/18

    基于GPIO子系统实现led灯点亮 head h ifndef HEAD H define HEAD H 构建LED开关的功能码 不添加ioctl第三个参数 define LED ON IO l 1 define LED OFF IO l
  • 动态规划之二维费用的背包模型

    前置知识 01背包问题 动态规划之01背包模型 如何何何的博客 CSDN博客 完全背包问题 动态规划之完全背包模型 如何何何的博客 CSDN博客 多重背包问题 动态规划之多重背包模型 如何何何的博客 CSDN博客 二维费用背包问题 二维费用
  • selenium页面切换操作

    selenuim页面切换 webdriver只能在一个页面里对元素进行识别和定位 如果有多个页面操作的时候 要先进行页面切换 切换分两种 1 iframe内嵌页面切换 框架集切换 1 获取iframe标签 iframe driver fin
  • Android12窗口模糊(一)在Activity和Dialog中实现高斯模糊效果

    前言 在 Android 12 中 提供了一些用于实现窗口模糊处理效果 例如背景模糊处理和模糊处理后方屏幕 的公共 API 窗口模糊处理或跨窗口模糊处理用于模糊处理给定窗口后方的屏幕 有两种窗口模糊处理方式 可用于实现不同的视觉效果 背景模
  • 华为OD机试备考攻略 以及题库目录分值说明 考点说明

    华为题库说明 2022与2023题库的区别 华为OD机试的题库是季度更新的 Q1 Q2 Q3 Q4 笔者专栏的题库分为2023和2022 2023的题库是包括2022 11 Q4第四季度 之后以及2023年的题库 2022的题库是包括202
  • 第九届蓝桥杯C/C++ 大学B组省赛编程题题目及答案解析

    目录 试题F 递增三元组 试题G 螺旋折线 试题H 日志统计 试题I 全球变暖 试题J 乘积最大 试题F 递增三元组 问题描述 输入格式 输出格式 样例输入 样例输出 27 代码解析 暴力 三重循环计算所有满足ai lt bj lt ck的
  • R语言之方差分析篇

    当包含的因子是解释变量时 通常会从预测转向 级别差异的分析 即称作方差分析 ANOVA 组间因子 因变量 自变量 均衡设计 balanced design 组内因子 单因素组间方差分析 单因素组内方差分析 重复测量方差分析 主效应 交叉效应
  • JVM Mutex Monitor::lock

    void Monitor lock Thread Self ifdef CHECK UNHANDLED OOPS Clear unhandled oops so we get a crash right away Only clear fo

随机推荐

  • Windows 下PBC库的安装和配置

    背景 PBC库是一个基于双线性对的密码学库 这库在公钥密码学中使用非常广泛 这个库在Linux下的安装非常的简单 有些只会纸上谈兵的人需要在WIN下做 呵呵 但是没办法 需求到了 硬着头皮也要写完 对于一些只会谈兵的人 呵呵 现在主要介绍下
  • jar反编译的.java文件如何可以编辑_修改及反编译可运行Jar包实现过程详解

    将可运行Jar包 反编译成项目 修改代码 再次编译 打包 需要工具 jd gui myeclipse 具体步骤 1 使用jd gui打开原始的Jar包 选择File gt Save All Sources 会生成一个zip压缩包 2 解压这
  • 元素垂直居中的几种方式

    第一种 div div div div boxOne width 200px height 200px background pink display flex justify content center align items cent
  • ps -aux

    查看某个程序的进程号并删除 1 ps aux grep 进程 2 kill 9 进程号 删除该进程
  • visual studio使用教程

    linux疑难问题排查实战 分享了作为公司专家 在项目开发过程中内存优化 堆 栈 代码段 数据段 性能优化 死机 栈越界 堆越界 死锁等疑难问题排查的案例 使用的工具 perf asan strace memleak等 工作经验 大家可以点
  • blender界面基础认识

    blender界面基础认识 自定义功能 Edit gt Preference 界面 主题 视图 灯光 编辑 动画 插件 输入 视图切换 键位映射 系统 保存 加载 文件路径 Blender界面分为以下三个部分 上侧的顶栏 中间的工作区 底部
  • Sklearn专题二 随机森林

    专题二 随机森林 概述 1 集成算法 1 集成算法考虑多个评估器的结果 汇总获取更好的分类 回归表现 2 三种集成算法 装袋法bagging 模型独立 提升法boosting 模型相关 stacking 3 随机森林是一种bagging集成
  • .NET平台常用的开发组件

    工欲善其事 必先利其器 其优雅的编程风格 高效率的开发速度 极度简单的可扩展性 足够强大开发类库 较小的学习曲线 让我对这个平台产生了浓厚的兴趣 在工作和学习中也积累了一些开源的组件 虽然跟Java比Net还是要少 但也足够使用了 其中有一
  • 【C#实现文字转语音功能】

    本文实例为大家分享了C 实现文字转语音的具体代码 供大家参考 具体内容如下 客户提出要求 将文字内容转为语音 因为内网环境 没办法采用联网 在线这种方式 灵机一动 能否写一个简单的例子呢 搜索相关资料还真行 话不多说 有图有真相 关键是 c
  • 网传Spring爆出更大漏洞?别再炒作了…

    之前刚刚过去的log4j2漏洞还历历在目 这次来了个更大的 云舒老大在29日发微博称 出了个超级大漏洞 有吃瓜群众就问 这个瓜有 log4j2 那么好吃吗 云舒大佬的回复是 更大 之后 又有安全大佬sunwear给了一些更细节的信息 所以漏
  • java中类可以包含哪些元素,Java类中包含的元素及作用

    Java类是面试中常考的知识点 是组成Java应用的基本成分 小型和大型的应用都是由类组建而成的 作为合格的Java工程师 一定要清晰了解Java类及其包含的元素及作用 今天学码思Java培训老师就Java类中包含的元素及作用做一个大致讲解
  • springSecurity跨域CORS处理

    续言 之前 知识追寻者写过关于springboot 的跨域处理 并且介绍了跨域相关的概念 具体的可以查看这篇知识追寻者springboot教程系列文章 https zszxz com category springboot article
  • iOS“断点”(Break Point)你不知道多强大

    iOS 断点 Break Point 你不知道多强大 转载自http mp weixin qq com s biz MzA4ODk0NjY4NA mid 230272985 idx 1 sn 045c98bfb2d8dd1ecf7a7321
  • ssh配置config文件,实现vscode免密登陆

    在使用ssh连接服务器时 每一次用vscode连接服务器进行开发 都需要输入密码 相当鸡肋 对config的配置能够实现解决这个问题 step1 生成ssh密钥 如果已经有了就不需要了 使用以下命令 一路回车即可 ssh keygen t
  • 触发connect超时事件

    触发connect超时事件 有关于如何触发connect超时事件 之前相当然的认为在服务器程序accpet函数前阻塞一段事件就好了 这个思路是完全错误的 这是我犯了的一个错误 没有严格的验证自己的程序就将其发布了出来 被小组的小伙伴提问时才
  • shell编程基础: menu drvien script template(菜单脚本模板)

    前言 菜单类脚本 其实就是我们经常使用的交互脚本 在我们安装一个app的时候最常见 我们需要使用交互脚本进行一些配置 在工作中 写一个交互性脚本也同样重要 比如我现在需要写一个数据库授权的脚本 上下文是这样的 我们在开发中都是使用docke
  • LCD和LED屏幕的工作原理总结

    1 点阵取模原理之横向取模与纵向取模 1 1 针式打印机 针式打印机16针是纵向排列 每次打印垂直的16bit 然后右移一bit 继续下列打印 字节的MSB表示最上面的点 字节LSB表示最下面的点 由于汉字字模的点阵是横向排列的 而提供给打
  • 实现单层神经网络

    在前面 我们分别使用逻辑回归和 softmax 回归实现了对鸢尾花数据集的分类 逻辑回归能够实现线性二分类的任务 他其实就是最简单的神经网络 感知机 而softmax回归则实现的是多分类任务 它也可以看做是输出层有多个神经元的单层神经网络
  • Flink之IntervalJoin介绍

    InterValJoin算子 间隔流 一条流去join另一条流去过去一段时间内的数据 该算子将keyedStream与keyedStream转化为DataStream 再给定的时间边界内 默认包含边界 相当于一个窗口 按指定的key对俩个K
  • (ESP32学习13)驱动TFTLCD(SPI接口)

    本篇博文教大家ESP32 驱动TFT SPI驱动 本文给大家的库直接适用于2寸 240 320 的SPI TFT 但实际上这种驱动移植适用于所有的SPI驱动的TFT屏幕 底层代码把LCD初始化里面的寄存器参数改一改就适用了 这些寄存器参数在