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

本篇博文教大家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的使用,道阻且长,同时也相当于我用这个东西这么长时间以来的一种总结,笔记

  • 15
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
TOF200C是一种飞行时间(ToF)激光测距模块,它采用了VL53L0X芯片,可以提供精确的距离测量。下面是使用TOF200C的教程: 1. 硬件准备: - Arduino开发板:可以使用Windows 7/10/11操作系统的电脑。 - USB线:使用USB-B接头连接线,一般UNO板带有这种接头。 - 杜邦线:准备一些一头公一头母的杜邦线。 - TOF200C尾线:购买时会自带一根尾线。 2. 软件准备: - Arduino IDE:参考Arduino官网下载安装教程,安装好Arduino IDE。 3. 硬件接线: 根据硬件接线图将TOF200C模块连接到Arduino开发板上。 4. 使用方法: - 准备:确保已经烧录了最新的固件到开发板上,并连接好TOF200C模块。 - 运行:修改示例代码中的配置部分,将激光瞄头对准测量点后,运行代码,终端将打印出距离信息。 示例代码如下: ``` #include <Wire.h> #include <VL53L0X.h> VL53L0X tof; void setup() { Wire.begin(); tof.init(); tof.setTimeout(500); Serial.begin(9600); Serial.println("TOF200C Distance Measurement"); } void loop() { if (tof.timeoutOccurred()) { Serial.print("Timeout!"); } uint16_t distance = tof.readRangeSingleMillimeters(); if (distance > 2000) { Serial.print("Out of range"); } else { Serial.print(distance); } delay(100); } ``` 这段代码的主要步骤是: - 创建TOF对象并初始化。 - 读取距离,如果读取到的距离大于2000mm,则显示"Out of range",否则显示实际距离。 希望这个教程对您有帮助!\[1\]\[2\] #### 引用[.reference_title] - *1* [【Arduino】TOF250(IIC)基于UNO板的运用](https://blog.csdn.net/HCJ_Application/article/details/124058324)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [【新手基础教程】SP-MOD之 TOF测距的使用](https://blog.csdn.net/xuguoliang757/article/details/119419008)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值