(四)ESP32基于MicroPython平台——驱动TFT-1.44寸屏(SPI)

2023-11-01

一. 所需器件工具

        1.ESP32-CAM开发板。开发板购买链接

        2.TFT-1.44寸屏。TFT-1.44寸屏购买链接

二. 硬件SPI接口简介

        有两个硬件SPI通道允许更快的传输速率(最高80Mhz)。

HSPI (id=1)

VSPI (id=2)

sck

14

18

mosi

13

23

miso

12

19

三. TFT-1.44寸屏简介

        对于1.44寸TFT屏幕,驱动芯片ST7735是常用的选择之一。ST7735是一款低功耗的彩色TFT液晶屏驱动芯片,广泛应用于各种嵌入式系统和电子设备中,具有低功耗和高性能的特点。它支持SPI接口,可以与STM32微控制器等嵌入式系统集成。

四. 分段代码

        首先需要导入需要的模块函数。

from machine import Pin, SPI
import time
import struct

        然后是对IO接口进行定义,以及SPI接口的初始化,TFT-1.44寸屏的初始化等。

# 定义SPI引脚
MISO = Pin(12)			#RST/DO
MOSI = Pin(13)			#DI
SCLK = Pin(14)			#SC
dc = Pin(15,Pin.OUT)	#RS
cs = Pin(2,Pin.OUT)		#CS
blk= Pin(4,Pin.OUT)		#BLK

# 初始化SPI对象
spi = SPI(1)
spi.init(baudrate=40000000, miso=MISO, mosi=MOSI, sck=SCLK, polarity=0, phase=0)



# 初始化显示屏
def init_screen():
    blk.on()
    
    send_command(0x01)
    time.sleep_ms(200)
    
    time.sleep_ms(50)
    send_command(0x11)  # 退出睡眠
    time.sleep_ms(120)
    
    #ST7735R Frame Rate
    send_command(0xB1)
    spi.write(bytes([0x01, 0x2C, 0x2D]))
    send_command(0xB2)
    spi.write(bytes([0x01, 0x2C, 0x2D]))
    send_command(0xB3)
    spi.write(bytes([0x01, 0x2C, 0x2D]))
    
    send_command(0xB4)	#颜色反转
    send_data(0x07)
    
    send_command(0x2A) # 设置列地址
    spi.write(bytes([0x00, 0x00, 0x00, 0x70]))
    send_command(0x2B) # 设置行地址
    spi.write(bytes([0x00, 0x00, 0x00, 0x90]))
    
    send_command(0x36)  # 设置显示方向
    send_data(0x48)
    send_command(0x3A)  # 设置颜色模式
    send_data(0x05)     # 16位色彩模式
    send_command(0x29)  # 打开显示

        显示字符,我们就需要有字模,这里使用的字模为5*8的字体大小。

font = [
 [0x00, 0x00, 0x00, 0x00, 0x00],#空格
 [0x00, 0x00, 0x5F, 0x00, 0x00],#'!'
 [0x00, 0x07, 0x00, 0x07, 0x00],#'"':
 [0x14, 0x7F, 0x14, 0x7F, 0x14],#'#':
 [0x24, 0x2A, 0x7F, 0x2A, 0x12],#'$':
 [0x23, 0x13, 0x08, 0x64, 0x62],#'%':
 [0x36, 0x49, 0x55, 0x22, 0x50],#'&':
 [0x00, 0x05, 0x03, 0x00, 0x00],#"'":
 [0x00, 0x1C, 0x22, 0x41, 0x00],#'(':
 [0x00, 0x41, 0x22, 0x1C, 0x00],#')':
 [0x14, 0x08, 0x3E, 0x08, 0x14],#'*':
 [0x08, 0x08, 0x3E, 0x08, 0x08],#'+':
 [0x00, 0x50, 0x30, 0x00, 0x00],#',':
 [0x08, 0x08, 0x08, 0x08, 0x08],#'-':
 [0x00, 0x60, 0x60, 0x00, 0x00],#'.':
 [0x20, 0x10, 0x08, 0x04, 0x02],#'/':
 [0x3E, 0x51, 0x49, 0x45, 0x3E],#'0':
 [0x00, 0x42, 0x7F, 0x40, 0x00],#'1':
 [0x42, 0x61, 0x51, 0x49, 0x46],#'2':
 [0x21, 0x41, 0x45, 0x4B, 0x31],#'3':
 [0x18, 0x14, 0x12, 0x7F, 0x10],#'4':
 [0x27, 0x45, 0x45, 0x45, 0x39],#'5':
 [0x3C, 0x4A, 0x49, 0x49, 0x30],#'6':
 [0x01, 0x71, 0x09, 0x05, 0x03],#'7':
 [0x36, 0x49, 0x49, 0x49, 0x36],#'8':
 [0x06, 0x49, 0x49, 0x29, 0x1E],#'9':
 [0x00, 0x36, 0x36, 0x00, 0x00],#':':
 [0x00, 0x56, 0x36, 0x00, 0x00],#';':
 [0x08, 0x14, 0x22, 0x41, 0x00],#'<':
 [0x14, 0x14, 0x14, 0x14, 0x14],#'=':
 [0x00, 0x41, 0x22, 0x14, 0x08],#'>':
 [0x02, 0x01, 0x51, 0x09, 0x06],#'?':
 [0x32, 0x49, 0x79, 0x41, 0x3E],#'@':
 [0x7E, 0x11, 0x11, 0x11, 0x7E],#'A':
 [0x7F, 0x49, 0x49, 0x49, 0x36],#'B':
 [0x3E, 0x41, 0x41, 0x41, 0x22],#'C':
 [0x7F, 0x41, 0x41, 0x22, 0x1C],#'D':
 [0x7F, 0x49, 0x49, 0x49, 0x41],#'E':
 [0x7F, 0x09, 0x09, 0x09, 0x01],#'F':
 [0x3E, 0x41, 0x49, 0x49, 0x7A],#'G':
 [0x7F, 0x08, 0x08, 0x08, 0x7F],#'H':
 [0x00, 0x41, 0x7F, 0x41, 0x00],#'I':
 [0x20, 0x40, 0x41, 0x3F, 0x01],#'J':
 [0x7F, 0x08, 0x14, 0x22, 0x41],#'K':
 [0x7F, 0x40, 0x40, 0x40, 0x40],#'L':
 [0x7F, 0x02, 0x04, 0x02, 0x7F],#'M':
 [0x7F, 0x04, 0x08, 0x10, 0x7F],#'N':
 [0x3E, 0x41, 0x41, 0x41, 0x3E],#'O':
 [0x7F, 0x09, 0x09, 0x09, 0x06],#'P':
 [0x3E, 0x41, 0x51, 0x21, 0x5E],#'Q':
 [0x7F, 0x09, 0x19, 0x29, 0x46],#'R':
 [0x46, 0x49, 0x49, 0x49, 0x31],#'S':
 [0x01, 0x01, 0x7F, 0x01, 0x01],#'T':
 [0x3F, 0x40, 0x40, 0x40, 0x3F],#'U':
 [0x1F, 0x20, 0x40, 0x20, 0x1F],#'V':
 [0x7F, 0x20, 0x10, 0x20, 0x7F],#'W':
 [0x63, 0x14, 0x08, 0x14, 0x63],#'X':
 [0x03, 0x04, 0x78, 0x04, 0x03],#'Y':
 [0x61, 0x51, 0x49, 0x45, 0x43],#'Z':
 [0x00, 0x7F, 0x41, 0x41, 0x00],#'[':
 [0x02, 0x04, 0x08, 0x10, 0x20],#'\\':
 [0x00, 0x41, 0x41, 0x7F, 0x00],#']':
 [0x04, 0x02, 0x01, 0x02, 0x04],#'^':
 [0x40, 0x40, 0x40, 0x40, 0x40],#'_':
 [0x00, 0x01, 0x02, 0x04, 0x00],#'`':
 [0x20, 0x54, 0x54, 0x54, 0x78],#'a':
 [0x7F, 0x48, 0x44, 0x44, 0x38],#'b':
 [0x38, 0x44, 0x44, 0x44, 0x20],#'c':
 [0x38, 0x44, 0x44, 0x48, 0x7F],#'d':
 [0x38, 0x54, 0x54, 0x54, 0x18],#'e':
 [0x08, 0x7E, 0x09, 0x01, 0x02],#'f':
 [0x0C, 0x52, 0x52, 0x52, 0x3E],#'g':
 [0x7F, 0x08, 0x04, 0x04, 0x78],#'h':
 [0x00, 0x44, 0x7D, 0x40, 0x00],#'i':
 [0x20, 0x40, 0x44, 0x3D, 0x00],#'j':
 [0x7F, 0x10, 0x28, 0x44, 0x00],#'k':
 [0x00, 0x41, 0x7F, 0x40, 0x00],#'l':
 [0x7C, 0x04, 0x18, 0x04, 0x78],#'m':
 [0x7C, 0x08, 0x04, 0x04, 0x78],#'n':
 [0x38, 0x44, 0x44, 0x44, 0x38],#'o':
 [0x7C, 0x14, 0x14, 0x14, 0x08],#'p':
 [0x08, 0x14, 0x14, 0x18, 0x7C],#'q':
 [0x7C, 0x08, 0x04, 0x04, 0x08],#'r':
 [0x48, 0x54, 0x54, 0x54, 0x20],#'s':
 [0x04, 0x3F, 0x44, 0x40, 0x20],#'t':
 [0x3C, 0x40, 0x40, 0x20, 0x7C],#'u':
 [0x1C, 0x20, 0x40, 0x20, 0x1C],#'v':
 [0x3C, 0x40, 0x30, 0x40, 0x3C],#'w':
 [0x44, 0x28, 0x10, 0x28, 0x44],#'x':
 [0x0C, 0x50, 0x50, 0x50, 0x3C],#'y':
 [0x44, 0x64, 0x54, 0x4C, 0x44],#'z':
 [0x00, 0x08, 0x36, 0x41, 0x00],#'{':
 [0x00, 0x00, 0x7F, 0x00, 0x00],#'|':
 [0x00, 0x41, 0x36, 0x08, 0x00],#'}':
 [0x08, 0x04, 0x08, 0x10, 0x08]#'~':
]

        显示字符与图像数据等代码。

# 字符串显示
def set_pixel(x, y, color):
    send_command(0x2A)  # 设置列地址
    send_data(0x00)
    send_data(x)
    send_data(0x00)
    send_data(x)
    send_command(0x2B)  # 设置行地址
    send_data(0x00)
    send_data(y)
    send_data(0x00)
    send_data(y)
    send_command(0x36)  # 设置显示方向
    send_data(0xC8)
    send_command(0x2C)  # 写入RAM
    send_data(color >> 8)
    send_data(color & 0xFF)
def display_text(text, x, y, color):
    for char in text:
        ascii_code = ord(char)
        if ascii_code < 32 or ascii_code > 126:  # 不支持的字符
            continue
        data = font[ascii_code - 32]
        for i in range(5):
            for j in range(8):
                if (data[i] >> j) & 0x01:
                    set_pixel(x + i, y + j, color)
                else:
                    set_pixel(x + i, y + j, 0x0000)  # 背景色
        x += 6  # 字符间距



# 清屏
def clear_screen():
    send_command(0x2c)  # 内存写入命令
    dc.on()            # 数据模式
    cs.off()           # 选中片选
    buf = [0x00]*398*2
    spi.write(bytes(buf))  # 写入黑色像素数据
    buf = [0x00]*128*2
    for i in range(128):#显示范围x为128,地址有132个,
        spi.write(bytes(buf))  # 写入黑色像素数据
        buf1 = [0x00]*4*2
        spi.write(bytes(buf1))  # 写入黑色像素数据
    cs.on()            # 取消片选



# 显示图片
def draw_image_Vite(image):
    send_command(0x2c)  # 内存写入命令
    dc.on()             # 数据模式
    cs.off()            # 选中片选
    buf = [0x00]*398*2
    spi.write(bytes(buf))  # 写入黑色像素数据
    spi.write(image)
    cs.on()             # 取消片选

五. 完整代码下载链接

        例程下载链接:https://download.csdn.net/download/qq_26043945/88205208

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

(四)ESP32基于MicroPython平台——驱动TFT-1.44寸屏(SPI) 的相关文章

随机推荐

  • iPhone XR 突然黑屏转圈圈的解决方法

    事件描述 今天早上我老婆的iphone xr突然黑屏转圈圈 过了好久也没有恢复正常 就找上我这个程序员了 这种机型的这种情况还不是个例 约几个月前我一个同事刚买到手就出现这个问题 当时困扰了他好久 我老婆买到现在却一直没有出现这种问题 她的
  • USB CDC虚拟串口复合设备

    CDC包含一个控制接口和一个数据接口 1 控制接口 必要的有CM功能描述符和接口绑定描述符 IAD Union 在我电脑上测试控制接口的中断端点也可以不需要 及控制接口端点数量可以为0 1 1 ACM功能描述符 在虚拟串口中 控制接口需要处
  • 类文件结构

    类文件结构 深入理解Java虚拟机 第2版 Java虚拟机不和包括Java在内的任何语言绑定 它只与 Class文件 这种特定的二进制文件格式锁关联 不管是Java代码编译为存储字节码的Class文件 还是使用JRuby等其他语言的编译器将
  • hive中的复杂类型使用

    在Hive 中如何使用符合数据结构 maps array structs 1 Array的使用 创建数据库表 以array作为数据类型 create table person name string work locations array
  • Qt designer 中设置背景图片,以及子窗体不继承父窗体背景的方法

    设置背景图片 子窗体不继承父窗体背景
  • html5扑克牌游戏源码,【web】纯JavaScript实现window经典纸牌游戏

    JavaScript 纯文本查看 复制代码 循环遍历将poker图片添加到数组中 var pokersList var flower 0 for var i 1 i lt 52 i var poker new Image poker src
  • Hexo 美化优化配置(持续更新)

    文章目录 添加网站运行时间 添加文章边框阴影效果 在Hexo博客中插入图片 src 链接 本地绝对路径 本地相对路径 Base64 格式 参考链接和工具 相册 某某地方玩 广告 新建文章时 在相同目录下创建同名文件夹 便于图片管理 评论系统
  • Qt控件增加属性并通过添加的属性设置样式

    Qt控件增加属性并通过添加的属性设置样式 1 应用场景 在Qt应用编程中经常要对应用的界面进行美化 这里要用到样式表qss 下面说的方法适用于对某一种控件在界面上有几种不用的风格样式 例如 界面上有两种风格的button 2 设置方法 给要
  • idea java项目转javaWeb

    Idea的java项目转换为javaWeb项目 file Project structure Modults Web 配置web xml文件位置 和web资源目录 注意 删除目录的时候要apply在添加 然后修改
  • 基于SSM的人才招聘网站

    末尾获取源码 开发语言 Java Java开发工具 JDK1 8 后端框架 SSM 前端 采用JSP技术开发 数据库 MySQL5 7和Navicat管理工具结合 服务器 Tomcat8 5 开发软件 IDEA Eclipse 是否Mave
  • 富文本插件 Tinymce图片上传 img地址变为本地地址

    描述 本人使用Tinymce富文本插件时出现的bug 图片上传 images upload handler blobInfo success gt new Promise resolve reject gt console log blob
  • RDS主/ECS从(只读)建立主从同步

    阿里云RDS 基础版 及阿里云ECS自建Mysql5 7主从 参考文章 新主从数据库搭建 gt gt http blog csdn net abcdocker article details 71249809 RDS高级版主从ECS搭建 g
  • 模拟定位原理

    背景描述 越来越多的用户通过位置模拟的方式 将自己的位置伪造成任意地点 通过发布有暗示性内容的动态进行用户引流或者杀猪盘操作 今天不讨论这些用户 单纯从技术的角度分析一下位置模拟是怎么实现的 目前常见位置信息模拟方式 基于开发者模式的位置修
  • C++的引用详解

    引用 注意事项 1 引用必须初始化 2 初始化后将不能更改 原因是int p a 相当于 int const p a 使用方法 1 给一个变量起一个别名 2 作为函数参数传参 函数中的操作同样对实参有效 3 作为函数返回值 int func
  • 使用element UI el-upload组件实现视频文件上传及上传进度显示方法总结

    使用element UI el upload组件实现视频文件上传及上传进度显示方法总结
  • Mysql学习笔记3: 查询截取分析

    第 3 章 查询截取分析 1 查询优化 1 1 MySQL 优化原则 mysql 的调优大纲 慢查询的开启并捕获 explain 慢SQL分析 show profile查询SQL在Mysql服务器里面的执行细节和生命周期情况 SQL数据库服
  • 第七周PCL学习--点云配准(七)

    目录 引言 一 点云配准 1 1 定义 1 2 含义 1 3 配准过程 1 4 算法原理 1 5 实验 二 总结 三 参考 引言 随着计算机辅助设计技术的发展 通过实物模型产生数字模型的逆向工程技术 由于它的独特魅力获得了越来越广泛的应用
  • CVE-2023-21839:Oracle WebLogic Server RCE

    CVE 2023 21839允许远程用户在未经授权的情况下通过 IIOP T3 进行 JNDI lookup 操作 当 JDK 版本过低或本地存在小工具 javaSerializedData 时 这可能会导致RCE漏洞 影响版本 Weblo
  • datax的使用以及参数解释,快速入门版

    datax的使用以及参数解释 文章目录 datax的使用以及参数解释 前言 一 datax是什么 二 文件配置说明 1 查看配置文件 2 配置参数解释 3 reader参数解释 4 writer参数解释 总结 前言 本文我们介绍一下data
  • (四)ESP32基于MicroPython平台——驱动TFT-1.44寸屏(SPI)

    一 所需器件工具 1 ESP32 CAM开发板 开发板购买链接 2 TFT 1 44寸屏 TFT 1 44寸屏购买链接 二 硬件SPI接口简介 有两个硬件SPI通道允许更快的传输速率 最高80Mhz HSPI id 1 VSPI id 2