ArduinoTFTLCD应用

news2024/11/18 0:00:42

ArduinoTFTLCD应用

  • ArduinoTFTLCD应用
    • 硬件连接
    • 软件
      • 导入库
      • 显示数字、字符
      • 显示汉字
        • 方案1
        • 方案2
      • 显示图片
    • 总结

ArduinoTFTLCD应用

对于手工喜欢DIY的人来说,Arduino驱动的TFTLCD被很多人使用,此处就总结一下,使用的是VScodePlatformIO插件驱动的Arduino,芯片使用的是ESP32

硬件连接

这里采用的是10PIN的ST7789驱动的TFTLCD屏幕,是硬件SPI驱动的。

        TFTLCD硬件管脚
在这里插入图片描述
        ESP32硬件管脚
在这里插入图片描述
我们连接的是ESP32的HSPI引脚。

功能TFTLCD引脚ESP32引脚
数据输出MOSI13
时钟SCLK14
片选CS15
选择端口DC2
复位引脚RST4
背光正BL12
电源地GNDGND
背光负GNDGND
电压正VCCVCC

有些SPI是这样标注的,引脚都是一样的。

字符1字符2功能
CSCS片选,低电平使能
DCRS数据/命令选择端口,DC端口为低时,写入的是命令;为高时,写入的是数据
RSTRESET复位信号,低电平复位
MISOSDA从设备数据输出
MOSISDI主设备数据输出
SCLKSCL时钟,由主设备发出

按照如图所示进行硬件连接。

软件

        使用的是VScodePlatformIO插件驱动的Arduino,芯片使用的是ESP32

导入库

        安装TFT_eSPI:TFT_eSPI 是一个用于 ESP32 和 ESP8266 上的基于图形显示控制器的开源软件库。它提供了一种简单且高效的方式来与 TFT LCD 显示器进行交互并创建令人惊叹的图形界面。

在左侧文件目录中\.pio\libdeps\esp32dev\TFT_eSPI\User_Setup.h文件中。

驱动要选择

// Only define one driver, the other ones must be commented out
//#define ILI9341_DRIVER       // Generic driver for common displays
//#define ILI9341_2_DRIVER     // Alternative ILI9341 driver, see https://github.com/Bodmer/TFT_eSPI/issues/1172
//#define ST7735_DRIVER      // Define additional parameters below for this display
//#define ILI9163_DRIVER     // Define additional parameters below for this display
//#define S6D02A1_DRIVER
//#define RPI_ILI9486_DRIVER // 20MHz maximum SPI
//#define HX8357D_DRIVER
//#define ILI9481_DRIVER
//#define ILI9486_DRIVER
//#define ILI9488_DRIVER     // WARNING: Do not connect ILI9488 display SDO to MISO if other devices share the SPI bus (TFT SDO does NOT tristate when CS is high)
#define ST7789_DRIVER      // Full configuration option, define additional parameters below for this display
//#define ST7789_2_DRIVER    // Minimal configuration option, define additional parameters below for this display
//#define R61581_DRIVER
//#define RM68140_DRIVER
//#define ST7796_DRIVER
//#define SSD1351_DRIVER
//#define SSD1963_480_DRIVER
//#define SSD1963_800_DRIVER
//#define SSD1963_800ALT_DRIVER
//#define ILI9225_DRIVER
//#define GC9A01_DRIVER

屏幕尺寸

// For ST7789, ST7735, ILI9163 and GC9A01 ONLY, define the pixel width and height in portrait orientation
// #define TFT_WIDTH  80
// #define TFT_WIDTH  128
// #define TFT_WIDTH  172 // ST7789 172 x 320
// #define TFT_WIDTH  170 // ST7789 170 x 320
#define TFT_WIDTH  240 // ST7789 240 x 240 and 240 x 320
// #define TFT_HEIGHT 160
// #define TFT_HEIGHT 128
// #define TFT_HEIGHT 240 // ST7789 240 x 240
#define TFT_HEIGHT 320 // ST7789 240 x 320
// #define TFT_HEIGHT 240 // GC9A01 240 x 240

IO口

// For ESP32 Dev board (only tested with GC9A01 display)
// The hardware SPI can be mapped to any pins
#define TFT_MOSI 13 // In some display driver board, it might be written as "SDA" and so on.
#define TFT_SCLK 14
#define TFT_CS   15  // Chip select control pin
#define TFT_DC   2  // Data Command control pin
#define TFT_RST  4  // Reset pin (could connect to Arduino RESET pin)
#define TFT_BL   12  // LED back-light

其他不做修改。

main.app文件中。导入头文件在这里插入代码片#include <TFT_eSPI.h>

#include <TFT_eSPI.h>
TFT_eSPI tft = TFT_eSPI(); // 创建TFT对象
void setup()
{
  Serial.begin(115200);
  tft.init();                // 初始化
  // tft.fillScreen(TFT_BLACK); // 设置屏幕背景颜色
  // analogWrite(BLK, 150);     // 调节屏幕亮度,0最亮,255最暗
}
void loop() {}

显示数字、字符

tft.setTextColor(TFT_WHITE, TFT_BLACK); // 参数1:字体颜色,参数2:背景色

tft.setTextFont(2); // 字体大小16*16
tft.println("Hello,world");
tft.drawString("I want to eat something", 0, 50, 2);

tft.setTextFont(4); // 字体大小26*26
tft.drawNumber(1234, 0, 70);
tft.drawFloat(3.14159, 5, 0, 90);

显示汉字

方案1

利用OLED显示汉字方法,去驱动TFTLCD显示汉字。利用PCtoLCD2002.exe进行取模,然后导入文件中,利用点阵进行显示。如图所示取模方式。
在这里插入图片描述

新建文件Chinese_32.h并导入数组。

/***************************16*16的点阵字体取模方式:共阴——列行式——逆向输出*********/
unsigned char character[] = "第二一三四五";
uint8_t F16x16[] =
    {
        0x08, 0x04, 0x93, 0x92, 0x96, 0x9A, 0x92, 0xFA, 0x94, 0x93, 0x92, 0x96, 0xFA, 0x02, 0x02, 0x00,
        0x40, 0x40, 0x47, 0x24, 0x24, 0x14, 0x0C, 0xFF, 0x04, 0x04, 0x24, 0x44, 0x24, 0x1C, 0x00, 0x00, // 第",0
        /* (16 X 16 , 宋体 )*/

        0x00, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00,
        0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, // 二",2
        /* (16 X 16 , 宋体 )*/

        0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 一",1
        /* (16 X 16 , 宋体 )*/

        0x00, 0x04, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x04, 0x00, 0x00,
        0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, // 三",3
        /* (16 X 16 , 宋体 )*/

        0x00, 0xFC, 0x04, 0x04, 0x04, 0xFC, 0x04, 0x04, 0x04, 0xFC, 0x04, 0x04, 0x04, 0xFC, 0x00, 0x00,
        0x00, 0x7F, 0x28, 0x24, 0x23, 0x20, 0x20, 0x20, 0x20, 0x21, 0x22, 0x22, 0x22, 0x7F, 0x00, 0x00, // 四",4
        /* (16 X 16 , 宋体 )*/

        0x00, 0x02, 0x42, 0x42, 0x42, 0xC2, 0x7E, 0x42, 0x42, 0x42, 0x42, 0xC2, 0x02, 0x02, 0x00, 0x00,
        0x40, 0x40, 0x40, 0x40, 0x78, 0x47, 0x40, 0x40, 0x40, 0x40, 0x40, 0x7F, 0x40, 0x40, 0x40, 0x00, // 五",5
        /* (16 X 16 , 宋体 )*/
};

在main.app函数

#include <TFT_eSPI.h>
#include "Chinese_32.h"

TFT_eSPI tft = TFT_eSPI(); // 创建TFT对象
#include <TJpg_Decoder.h>

#define BLK 5 // 亮度控制引脚

//--------------------------------------------------------------
// Prototype      : void OLED_ShowCN(unsigned char x, unsigned char y, unsigned char N)
// Calls          :
// Parameters     : x,y -- 起始点坐标(x:0~127, y:0~7); N:汉字在codetab.h中的索引
// Description    : 显示codetab.h中的汉字,16*16点阵
//--------------------------------------------------------------

// 显示汉字
void OLED_ShowCN(uint8_t x, uint8_t y, uint8_t no)
{
  uint8_t t, j;
  uint16_t k;
  for (t = 0; t < 16; t++)
  {
    k = F16x16[no * 32 + t];
    for (j = 0; j < 8; j++)
    {
      if ((k >> j) & 0x01)
        tft.drawPixel(x + t, y + j, TFT_WHITE);
    }
  }
  for (t = 0; t < 16; t++)
  {
    k = F16x16[no * 32 + 16 + t];
    for (j = 0; j < 8; j++)
    {
      if ((k >> j) & 0x01)
        tft.drawPixel(x + t, y + j + 8, TFT_WHITE);
    }
  }
}

uint8_t OLED_findoneCN(uint8_t ch1, uint8_t ch2, uint8_t ch3)
{
  uint8_t j = 0;
  while (character[j] != '\0')
  {
    if (ch1 == character[j] && ch2 == character[j + 1] && ch3 == character[j + 2])
      return j / 3 + 1;
    j += 3;
  }
  return 0;
}

void OLED_Show(unsigned char x, unsigned char y, char ch[])
{
  int j = 0, k;
  while (ch[j] != '\0')
  {
    Serial.println(ch[j]);
    if (ch[j] > 0x80) // 汉字
    {
      k = OLED_findoneCN(ch[j], ch[j + 1], ch[j + 2]);
      if (k != 0)
        OLED_ShowCN((j / 3 * 2) * 8 + x, y, k - 1);
      j += 3;
    }
    else // ASCLL
    {
      tft.drawString((String)ch[j], (j / 3 * 2) * 8 + x, y, 2);
      j++;
    }
  }
}

void TFT_Init()
{
  tft.init();                // 初始化
  // tft.fillScreen(TFT_BLACK); // 设置屏幕背景颜色
  // analogWrite(BLK, 150);     // 调节屏幕亮度,0最亮,255最暗
}

void TFT_Display()
{
  tft.setTextColor(TFT_WHITE, TFT_BLACK); // 参数1:字体颜色,参数2:背景色

  tft.setTextFont(2); // 字体大小16*16
  tft.println("Hello,world");
  tft.drawString("I want to eat something", 0, 50, 2);

  tft.setTextFont(4); // 字体大小26*26
  tft.drawNumber(1234, 0, 70);
  tft.drawFloat(3.14159, 5, 0, 90);
  tft.setTextColor(TFT_WHITE, TFT_BLACK); // 参数1:字体颜色,参数2:背景色

  OLED_Show(0, 120, (char*)"第二一三四五");
}

void setup()
{
  Serial.begin(115200);
  TFT_Init();
  TFT_Display();
}

void loop() {}

如图所示结果。
在这里插入图片描述

方案2

        导入字库。

  1. 目录\.pio\libdeps\esp32dev\TFT_eSPI\Tools\Create_Smooth_Font文件下有三个文件。
    其中Create_font.pde:代码,通过该代码来制作字库文件。
    FontFiles : 存放我们制作出来的字库文件,制作出来后是vlw结尾的。
    data : 存放我们的字体文件,用ttf结尾的。
  2. 去https://processing.org/ 下载processing软件(资料中都放有)。
  3. 去自己的电脑中C:\Windows\Font文件中找到你想要的字体,放到data文件夹下。
  4. 在https://www.osgeo.cn/app/sa906网站中,将需要转化的汉字转成unicode编码,然后将\u转化成0x
  5. 使用processing打开Create_font.pde文件。
  6. 修改以下内容:将需要转化的的汉字的unicode编码放到specificUnicodes 数组中。
    String fontName = "simkai";  // 你的字库的文件名字。 在130行
    String fontType = ".ttf";
    //String fontType = ".otf";
    
    // Define the font size in points for the TFT_eSPI font file
    int  fontSize = 20;
    // Font size to use in the Processing sketch display window that pops up (can be different to above)
    int displayFontSize = 20;
    static final int[] unicodeBlocks = {
      //0x0030, 0x0039, //Example custom range (numbers 0-9)
      //0x0041, 0x005A, //Example custom range (Upper case A-Z)
      //0x0061, 0x007A, //Example custom range (Lower case a-z)
    };
    static final int[] specificUnicodes = {
    0x56e0,0x6709,0x7740,0x4f60,0x8ddf,0x5728,0x4e00,0x8d77,0x6211,0x7231,0x683e,0x8c46,0x5f20,0x5b66,0x806a
    };
    
  7. 点击运行,正确的话会弹出一个对话框,然后会在FontFiles 文件夹中生成一个.h的字库。
  8. 将生成的字库文件放入src文件夹中。
  9. 然后在主函数中:
    #include "KT_20_A.h"		//导入字库。
    tft.loadFont(KT_20_A); 		//指定tft屏幕对象载入font_12字库,KT_20_A为生成字库的数组名字。
    tft.drawString("武汉",0,0) 	//在坐标0,0位置处写武汉2个字,就可以在tft显示出来了。
    tft.unloadFont(); 			//释放字库文件,节省资源。
    

显示图片

  1. Image2Lcd打开一张BMP或者JPG格式的图片。
  2. 设置成如图所示,点击保存,注意输出图像位置的数字(238,320)
    在这里插入图片描述
  3. 程序中加入:
    #include <TFT_eSPI.h>
    #include "Chinese_32.h"
    #include "BMP1.h"
    
    TFT_eSPI tft = TFT_eSPI(); // 创建TFT对象
    #include <TJpg_Decoder.h>
    
    void TFT_Display()
    {
      tft.pushImage(0, 0, 238, 320, (uint16_t*)gImage_demo_image1);
    }
    
    void setup()
    {
      tft.init();                // 初始化
      // tft.fillScreen(TFT_BLACK); // 设置屏幕背景颜色
      // analogWrite(BLK, 150);     // 调节屏幕亮度,0最亮,255最暗
      tft.fillScreen(TFT_BLACK);
      TFT_Display();
    }
    void loop() {}
    
  4. 如图所示的效果。
    在这里插入图片描述

总结

        以上所有资料和应用我都放在文件中了。


资料地址:https://download.csdn.net/download/weixin_42320020/88901719

禁止转载!

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

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

相关文章

Docusaurus框架——react+antd+echarts自定义mdx生成图表代码解释文档

文章目录 ⭐前言⭐Docusaurus框架渲染mdx内容&#x1f496; 创建一个mdx文件&#x1f496; 创建一个react jsx文件&#x1f496; mdx引入react的组件并渲染&#x1f496; mdx引入react的组件源代码内容 ⭐渲染一个echarts地图的代码解释文档&#x1f496; echarts 渲染地图&…

USLE模型-P因子的计算

首先需要下载土地利用类型数据集&#xff0c;查看我的相关文章 对于已有的10种土地类型代码&#xff0c;需要按水土保持措施P值表进行重分类。 10是耕地&#xff0c;且庆阳市坡度10-15度左右&#xff0c;所以赋给了3&#xff08;最好再下个DEM计算一下&#xff0c;这里就统一用…

WebServer -- 注册登录

目录 &#x1f349;整体内容 &#x1f33c;流程图 &#x1f382;载入数据库表 提取用户名和密码 &#x1f6a9;同步线程登录注册 补充解释 代码 &#x1f618;页面跳转 补充解释 代码 &#x1f349;整体内容 概述 TinyWebServer 中&#xff0c;使用数据库连接池实现…

C++指针(三)

个人主页:PingdiGuo_guo 收录专栏&#xff1a;C干货专栏 文章目录 前言 1.字符指针 1.1字符指针的概念 1.2字符指针的用处 1.3字符指针的操作 1.3.1定义 1.3.2初始化 1.4字符指针使用注意事项 2.数组参数&#xff0c;指针参数 2.1数组参数 2.1.1数组参数的概念 2.1…

NCT 全国青少年编程图形化编程(Scratch)等级考试(一级)模拟测试H

202312 青少年软件编程等级考试Scratch一级真题 第 1 题 【 单选题 】 以下说法合理的是( ) A :随意点开不明来源的邮件 B :把密码设置成 abc123 C :在虚拟社区上可以辱骂他人 D :在改编他人的作品前&#xff0c; 先征得他人同意 正确答案&#xff1a; D 试题解析&…

python模块和包概念与使用

python模块和包概念与使用 Python模块与包的关键概念 在Python编程中&#xff0c;模块和包是代码组织和管理的基石。以下是关于Python模块与包的核心要点&#xff1a; 模块&#xff1a; 模块是一个包含Python代码的.py文件&#xff0c;它可以定义函数、类、变量等。通过导入模…

水经微图Web版1.6.0发布

让每一个人都有自己的地图&#xff01; 水经微图&#xff08;简称“微图”&#xff09;新版已上线&#xff0c;在该版本中主要新增了点线面图层分组样式设置、图层排序并按序绘制、KML支持矢量符号的存储、KML支持态势标绘要素存储和新增历史地图文本样式等。 现在&#xff0…

Leetcoder Day27| 贪心算法part01

语言&#xff1a;Java/Go 理论 贪心的本质是选择每一阶段的局部最优&#xff0c;从而达到全局最优。 什么时候用贪心&#xff1f;可以用局部最优退出全局最优&#xff0c;并且想不到反例到情况 贪心的一般解题步骤 将问题分解为若干个子问题找出适合的贪心策略求解每一个子…

使用plasmo框架开发浏览器插件,注入contents脚本和给页面添加UI组件

plasmo&#xff1a;GitHub - PlasmoHQ/plasmo: &#x1f9e9; The Browser Extension Framework plasmo是一个开发浏览器插件的框架&#xff0c;支持使用react和vue等技术&#xff0c;而且不用手动管理manifest.json文件&#xff0c;框架会根据你在框架中的使用&#xff0c;自…

美团分布式 ID 框架 Leaf 介绍和使用

一、Leaf 在当今日益数字化的世界里&#xff0c;软件系统的开发已经成为了几乎所有行业的核心。然而&#xff0c;随着应用程序的规模不断扩大&#xff0c;以及对性能和可扩展性的需求不断增加&#xff0c;传统的软件架构和设计模式也在不断地面临挑战。其中一个主要挑战就是如…

SAP EC-CS如何实现自动抵消

SAP EC-CS 是SAP 比较早的合并方案&#xff0c;尽管后面有很多其他的方案作为替代&#xff0c;但 EC-CS 因为其成熟性&#xff0c;在集团合并单元不多的情况下&#xff0c;也可以作为一个不错的合并解决方案。可以说&#xff0c;会计报表合并一个核心就是实现抵消的处理&#x…

nginx------------缓存功能 ip透传 负载均衡 (六)

一、http 协议反向代理 &#xff08;一&#xff09;反向代理示例:缓存功能 缓存功能可以加速访问&#xff0c;如果没有缓存关闭后端服务器后&#xff0c;图片将无法访问&#xff0c;缓存功能默认关闭&#xff0c;需要开启。 ​ proxy_cache zone_name | off; 默认off #指明调…

2024全新手机软件下载应用排行、平台和最新发布网站,采用响应式织梦模板

这是一款简洁蓝色的手机软件下载应用排行、平台和最新发布网站&#xff0c;采用响应式织梦模板。 主要包括主页、APP列表页、APP详情介绍页、新闻资讯列表、新闻详情页、关于我们等模块页面。 地 址 &#xff1a; runruncode.com/php/19703.html 软件程序演示图&#xff1a;…

C语言中的字符魔法:大小写转换的艺术

引言 在C语言的世界里&#xff0c;字符处理是一项基础且重要的任务。字符作为编程中最基本的元素之一&#xff0c;承担着信息展示、数据交互等多重角色。特别是在处理文本信息时&#xff0c;字符的转换和识别显得尤为重要。大小写字母的转换就是其中一个常见的需求&#xff0c…

串及BF朴素查找算法(学习整理):

关于串的相关定义&#xff1a; 串&#xff1a;用‘ ’表示的字符序列空串&#xff1a;包含零个字符的串子串&#xff1a;包含传本身和空串的子串 eg: abc(,a,b,c,ab,bc,ac,abc)共7个&#xff1a;串的长度的阶乘1&#xff08;空串&#xff09;真子串&#xff1a;不包含自身的所…

linux安装matlab获取许可证

1.点击许可证 2. 3. 4. 4.主机ID 打开linux输入 /sbin/ifconfigether后边的就是 6.计算机登录名 打开linux输入 whoami7. 8. 9.

【已亲测有效】如何彻底删除nodejs,避免影响安装新版本

第一步开始菜单搜索uninstall node.js&#xff0c;点击之后等待删除&#xff08;删除node_modules文件夹以及以下这些文件&#xff09; 第二步手动删除nodejs下载位置的其他文件夹。&#xff08;就是另外自己新建的两个文件夹node_cache和node_global&#xff09; 到这里其实应…

LDR6328芯片:智能家居时代的小家电充电革新者

在当今的智能家居时代&#xff0c;小家电的供电方式正变得越来越智能化和高效化。 利用PD&#xff08;Power Delivery&#xff09;芯片进行诱骗取电&#xff0c;为后端小家电提供稳定电压的技术&#xff0c;正逐渐成为行业的新宠。在这一领域&#xff0c;LDR6328芯片以其出色的…

什么是VR数字文化遗产保护|元宇宙文旅

VR数字文化遗产保护是指利用虚拟现实&#xff08;VR&#xff09;技术来保护和传承文化遗产。在数字化时代&#xff0c;许多珍贵的文化遗产面临着自然衰退、人为破坏或其他因素造成的威胁。通过应用VR技术&#xff0c;可以以全新的方式记录、保存和展示文化遗产&#xff0c;从而…

C语言指针(4):函数在指针中的进阶应用

1、回调函数 回调函数就是⼀个通过函数指针调⽤的函数。函数参数的形式为函数指针类型。 当你把函数/函数的地址作为参数传递给相应函数是&#xff0c;如果这个指针被用来调用其所指向的函数时&#xff0c;被调用的函数就是回调函数。回调函数不是由该函数的实现方直接调用的&…