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

news/2024/2/20 14:29:33

一. 所需器件工具

        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 Ratesend_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)  # 写入RAMsend_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:  # 不支持的字符continuedata = 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*2spi.write(bytes(buf))  # 写入黑色像素数据buf = [0x00]*128*2for i in range(128):#显示范围x为128,地址有132个,spi.write(bytes(buf))  # 写入黑色像素数据buf1 = [0x00]*4*2spi.write(bytes(buf1))  # 写入黑色像素数据cs.on()            # 取消片选# 显示图片
def draw_image_Vite(image):send_command(0x2c)  # 内存写入命令dc.on()             # 数据模式cs.off()            # 选中片选buf = [0x00]*398*2spi.write(bytes(buf))  # 写入黑色像素数据spi.write(image)cs.on()             # 取消片选

五. 完整代码下载链接

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


http://www.ppmy.cn/news/1022595.html

相关文章

【torch.nn : Pooling Layers】

文章目录 MaxPool2dAvgPool2dAdaptiveAvgPool2dMaxUnpool2d MaxPool2d CLASS torch.nn.MaxPool2d(kernel_size, strideNone, padding0, dilation1, return_indicesFalse, ceil_modeFalse)功能&#xff1a; 在由几个输入平面组成的输入信号上应用2D最大池化。 举个简单的例子&a…

YOLOv5、YOLOv8改进:添加ShuffleAttention注意力机制

广泛应用的注意力机制主要有空间注意力机制和通道注意力机制&#xff0c;其目的分别是捕捉像素级的成对关系和通道依赖关系。虽然将两种机制融合在一起可以获得比单独更好的性能&#xff0c;但计算开销不可避免。因而&#xff0c;本文提出Shuffle Attetion&#xff0c;即SA&…

[保研/考研机试] KY87 鸡兔同笼 北京大学复试上机题 C++实现

描述 一个笼子里面关了鸡和兔子&#xff08;鸡有2只脚&#xff0c;兔子有4只脚&#xff0c;没有例外&#xff09;。已经知道了笼子里面脚的总数a&#xff0c;问笼子里面至少有多少只动物&#xff0c;至多有多少只动物。 输入描述&#xff1a; 每组测试数据占1行&#xff0c;…

2023年的深度学习入门指南(25) - 通义千问7b

2023年的深度学习入门指南(25) - 通义千问7b 最近发生的两件事情都比较有意思&#xff0c;一个是连续开源了7b和13b模型的百川&#xff0c;对其53b闭源了&#xff1b;另一个是闭源项目通义千问开源了自己的7b模型。 下面我们就来研究下通义千问7b. 使用通义千问7b 首先安装…

[C++ 网络协议] 套接字和地址族、数据序列

目录 1. 套接字 1.1 在Linux平台下构建套接字 1.1.1 用于接听的套接字(服务器端套接字) 1.1.2 用于发送请求的套接字(客户端套接字) 1.2 在Windows平台下构建套接字 1.2.1 Winsock的初始化 1.2.2 用于接听的套接字(服务器端套接字) 1.2.3 用于发送请求的套接字(客户端套…

golang协程池库tunny实践

前言 线程池大家都听过&#xff0c;其主要解决的是线程频繁创建销毁带来的性能影响&#xff0c;控制线程数量。 go协程理论上支持百万协程并发&#xff0c;协程创建调度的消耗极低&#xff0c;但毕竟也是消耗对吧。 而且协程池可以做一些额外的功能&#xff0c;比如限制并发&…

MongoDB 备份与恢复

1.1 MongoDB的常用命令 mongoexport / mongoimport mongodump / mongorestore 有以上两组命令在备份与恢复中进行使用。 1.1.1 导出工具mongoexport Mongodb中的mongoexport工具可以把一个collection导出成JSON格式或CSV格式的文件。可以通过参数指定导出的数据项&#xff0c…

【踩坑系列记录 】Anaconda环境将torch由cpu换成gpu

概要 很早前做过深度学习&#xff0c;配环境之类的坑由于没记录都记不清了。这段时间开始做深度学习的项目&#xff0c;于是用Anaconda给项目创建了一个环境&#xff0c;其他的环境配置很顺利&#xff0c;就是到了安装pytorch时&#xff0c;我用pytorch官网的代码一直下载的是…

大数据——协同过滤推荐算法:线性回归算法

推荐系统中的协同过滤算法一般分为两大类&#xff1a; 基于行为的协同过滤算法(Memory-Based CF)&#xff0c;利用用户行为数据计算相似度&#xff0c;包括用户之间的相似度和物品之间的相似度。基于模型的协同过滤算法(Model-Based CF)&#xff0c;利用机器学习算法预测用户的…

Jpa与Druid线程池及Spring Boot整合(二): spring-boot-starter-data-jpa 踏坑异常处理方案

Jpa与Druid线程池及Spring Boot整合(一) Jpa与Druid线程池及Spring Boot整合(二)&#xff1a;几个坑 附录官网文档&#xff1a;core.domain-events域事件 从聚合根发布事件 存储库管理的实体是聚合根。在领域驱动设计应用程序中&#xff0c;这些聚合根通常会发布领域事件。Sp…

可以重复烧写的语音ic有哪些特征和优势

目录 一、简介可擦写的语音芯片&#xff0c;其实就是MCUflash的架构&#xff0c;无其他说法&#xff0c;就这一种说法。这个就是它最大的特征尤其是SOP8的封装类型的芯片&#xff0c;是区别于OTP类型的另一个品类&#xff0c;基本上OTP的语音芯片适用的场景。他都可以满足和替代…

UDP 的报文结构和注意事项

目录 一. UDP的特点 二. UDP协议 1. UDP协议端格式 2.UDP的报文结构 3. 基于UDP的应用层协议 三. (高频面试题) 一. UDP的特点 无连接&#xff1a;知道对端的IP和端口号就直接进行传输&#xff0c;不需要建立连接。不可靠&#xff1a;即使因为网络故障等原因无法将数据报发送…

深入理解MySQL表的操作和管理

MySQL是一种广泛使用的关系型数据库管理系统&#xff0c;用于存储和管理大量结构化数据。在MySQL中&#xff0c;表是数据的基本组织单位&#xff0c;对表的操作和管理能力对于数据库的性能和数据完整性至关重要。本文将深入讨论MySQL表的操作和管理&#xff0c;包括创建表、修改…

代码随想录 - 链表

总结概述 链表理论基础 链表是一种通过指针串联的线性结构&#xff0c;每一个节点由两部分组成&#xff0c;一个是数据域一个是指针域&#xff08;存放指向下一个节点的指针&#xff09;&#xff0c;最后一个节点的指针域指向null&#xff08;空指针的意思&#xff09;。 链表的…

分布式事务的原理

问题描述 分布式事务是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于分布式系统的不同节点之上。 比如大型的电商系统中的下单场景&#xff0c;会涉及到扣库存、优惠促销计算、订单 ID 生成。 通常情况下&#xff0c;库存、促销、主键生成策略都位于不同…

vue实现5*5宫格当鼠标滑过选中的正方形背景颜色统一变色

vue实现5*5宫格当鼠标滑过选中的正方形背景颜色统一变色 1、实现的效果 2、完整代码展示 <template><div id"app" mouseleave"handleMouseLeave({row: 0, col: 0 })"><div v-for"rowItem in squareNumber" :key"rowItem…

什么是Node js?什么是React?有什么区别

JavaScript是当今最流行的编程语言之一&#xff0c;它用于开发多种技术&#xff0c;两种这样的技术是Node.js和React。许多学生很难理解Nodejs和React之间的区别。 React和Nodejs之间的主要区别在于它们的使用位置。Nodejs 用于开发应用程序的服务器端&#xff0c;而Reactjs用于…

【计算机网络】应用层协议Https

文章目录 前言Http加密方法对称加密非对称加密数据摘要&#xff08;数据指纹&#xff09;数字签名 加密方案只使用对称加密只使用非对称加密双方都使用非对称加密对称非对称 证书 前言 上一篇文章中&#xff0c;我们提到http是不安全的&#xff0c;尽管采用了cookie和session的…

MySQL8的特性-MySQL8知识详解

MySQL是一个多用户、多线程的SQL数据库服务器。SQL&#xff08;结构化查询语言&#xff09;是世界上最流行和标准化的数据库语言。下面是MySQL的特性。 1、开源性&#xff1a;MySQL是一个开源的关系型数据库管理系统&#xff0c;可以免费使用和修改。 2、可靠性&#xff1a;M…

SQL注入之Oracle注入

SQL注入之Oracle注入 7.1 SQL注入之Oracle环境搭建 前言 Oracle Database&#xff0c;又名Oracle RDBMS&#xff0c;或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是世界上流行的关系数据库管理系统…
最新文章