由于上次模拟SPI驱动TFT屏幕太慢,所以,本次采用硬件SPI来进行驱动,但是,当我直接把对应SPI接口更换时,发现TFT屏幕驱动并没有因此得到好转,依然是非常的满,然后只能从对应花点铺色,显示字符串这些基础函数进行下手了,这次我把大部分函数都更新了一下,让速度biu的一下就上来了。

ESP8266使用硬件SPI驱动TFT屏幕

  • 效果比较
  • 硬件SPI
  • 代码
  • 工程文件

效果比较

软件模拟实在太慢剪掉了

硬件SPI

关于这个硬件SPI,在Mircopython也是强调,有两个,其中一个用于fllash,用户是不能使用,所以只能使用另外一个。
当然用软件SPI也是可以的,软件SPI在ESP8266中所有的IO口的可以使用


使用的时候一是注意在spi.write这个函数中,要传入bytes类型,然后又连续的可以一起打包。
二是注意SPI初始化的相位和极性,这个根据芯片数据手册的时序图来进行判断。

代码

这里只给出LCD.py这本部分改变过的代码,其他的参考第一篇文章。

from time import sleep_ms,time_ns
from machine import Pin,SPI
from struct import pack
from CODE import StringCode8_16class LCD:def __init__(self,cs=15,res=12,dc=4,bl=5):self.RGB={'white':[31,63,31],'black':[0,0,0],'red':[31,0,0],'green':[0,63,0],'blue':[0,0,31],'yellow':[20,63,0]}self.spi=SPI(1, baudrate=80000000, polarity=0, phase=0)self.CS=Pin(cs,Pin.OUT)self.RES=Pin(res,Pin.OUT)self.DC=Pin(dc,Pin.OUT)          self.BL=Pin(bl,Pin.OUT)self.color=b''self.background=b''def LCD_Send8Data(self,Data=int):self.CS.off()self.spi.write(pack('B',Data))self.CS.on()def LCD_Send16Data(self,Data=int):self.CS.off()self.spi.write(pack('B',Data//255))self.spi.write(pack('B',Data%255))self.CS.on()#作用:命令传输#参数:#Com:传入的命令def LCD_SendComm(self,Com):self.DC.off()self.CS.off()self.spi.write(pack('B',Com))self.CS.on()self.DC.on()#作用:设置XY范围#参数:#xs:x的起始范围#xe:x的终止范围#ys:y的起始范围#ye:y的终止范围def LCD_SetXY(self,xs,xe,ys,ye):self.DC.off()self.CS.off()self.spi.write(b'*')self.CS.on()self.DC.on()self.CS.off()self.spi.write(xs.to_bytes(2,'big'))self.spi.write(xe.to_bytes(2,'big'))self.CS.on()self.DC.off()self.CS.off()self.spi.write(b'+')self.CS.on()self.DC.on()self.CS.off()self.spi.write(ys.to_bytes(2,'big'))self.spi.write(ye.to_bytes(2,'big'))self.CS.on()self.DC.off()self.CS.off()self.spi.write(b',')self.CS.on()self.DC.on()'''0  0  0       黑色31 63 31      白色31 0  0       红色0  63 0       绿色0  0  31      蓝色'''#作用:指定范围颜色填充颜色#参数:#xs:x的起始范围#xe:x的终止范围#ys:y的起始范围#ye:y的终止范围#color: 颜色字符串#RGB:颜色数组def LCD_FullColor(self,xs,xe,ys,ye,color='',RGB=[]):if self.RGB.get(color):RGB=self.RGB.get(color)color=RGB[2]+RGB[1]*32+RGB[0]*2048color=color.to_bytes(2,'big')else:raise ValueError("颜色不在范围内")self.LCD_SetXY(xs,xe,ys,ye)self.CS.off()for i in range(ys,ye+1):for i in range(xs,xe+1):self.spi.write(color)self.CS.on()#作用:画一个颜色点#参数:#x:x的坐标#y:y的坐标#color: 颜色字符串#RGB:颜色数组def LCD_DrawPoint(self,x,y,color):self.LCD_SetXY(x,x+1,y,y+1)self.CS.off()self.spi.write(color)self.CS.on()#作用:指定范围颜色填充颜色#参数:#xs:x的起始坐标#ys:y的起始坐标#strcolor: 字体颜色字符串#RGB:字体颜色数组#background:背景色字符串def LCD_WriteString(self,x,y,string=str,strcolor='',background=''):color=self.LCD_ChangeColor(strcolor)background=self.LCD_ChangeColor(background) for i in range(len(string)):self.LCD_SetXY(x+(8*i),x+(8*(i+1))-1,y,y+16)self.CS.off()line=StringCode8_16.get(string[i])for j in range(16):var=line[j]for k in range(8):if var&0x01==0x01:self.spi.write(color)elif background != b'':self.spi.write(background)var >>=1self.CS.on()    #作用:计算颜色转化为bytes类型#参数:#color:颜色def LCD_ChangeColor(self,color='',background=''):if self.RGB.get(color):RGB=self.RGB.get(color)color=RGB[2]+RGB[1]*32+RGB[0]*2048color=color.to_bytes(2,'big')return color'''(xs,ys)------(xe,ys)|             ||             ||             ||             ||             |(xs,ye)------ (xe,ye)'''#作用:画矩形#参数:#xs:左上点x坐标#ys:左上点y坐标#xe:右上点x坐标#ye:右上点y坐标#size:大小#color: 颜色字符串#RGB:颜色数组def LCD_DrawRect(self,xs,ys,xe,ye,color=''):color=self.LCD_ChangeColor(color)self.LCD_DrawLine(xs,ys,xe,ys,color)self.LCD_DrawLine(xe,ys,xe,ye,color)self.LCD_DrawLine(xe,ye,xs,ye,color)self.LCD_DrawLine(xs,ye,xs,ys,color)#作用:交换x1,x2位置#参数:    #x1:数一#x2:数二def Change_num(self,x1,x2):if x1>x2:return x2,x1else:return x1,x2#作用:画直线#参数:#xs:起始点x坐标#ys:起始点y坐标#xe:结束点x坐标#ye:结束点y坐标#size:大小#color: 颜色字符串#RGB:颜色数组def LCD_DrawLine(self,xs,ys,xe,ye,color=''):xs,xe=self.Change_num(xs,xe)ys,ye=self.Change_num(ys,ye)color=self.LCD_ChangeColor(color)if xs==xe:for j in range(ys,ye):self.LCD_DrawPoint(xs,j,color)elif ys==ye:for i in range(xs,xe):self.LCD_DrawPoint(i,ys,color)else:tan=(ye-ys)/(xe-xs)for i in range(xs,xe):self.LCD_DrawPoint(i,ys+int(i*tan),color)#作用:显示RGB图片#参数:#x:起始点x坐标#y:起始点y坐标#w:图片宽#h:图片高#img: 要显示的图片def LCD_ShowRGBImage(self,x,y,w,h,img):self.LCD_SetXY(x,y,x+w,y+h)k=0self.CS.off()for i in range(h):for j in range(w):k+=1self.spi.write(img[2*k].to_bytes(1,'big'))self.spi.write(img[2*k+1].to_bytes(1,'big'))self.CS.on()#作用:显示点阵图片#参数:#x:起始点x坐标#y:起始点y坐标#w:图片宽#h:图片高#img: 要显示的图片def LCD_ShowPointImage(self,x,y,w,h,img,color='',background=''):color=self.LCD_ChangeColor(color)background=self.LCD_ChangeColor(background) self.LCD_SetXY(x,x+w+3,y,y+h)i=0self.CS.off()lenth=len(img)while i<lenth:var=img[i]for j in range(8):if var&0x80==0x80:self.spi.write(color)elif self.background != b'':self.spi.write(background)var <<=1            i+=1self.CS.on()#作用:初始化#参数:#inversion:颜色反转def LCD_init(self,mode=0,inversion=False):self.CS.off()self.RES.on()sleep_ms(50)self.RES.off()sleep_ms(50)self.RES.on()sleep_ms(150)self.CS.on()self.LCD_SendComm(0X01)sleep_ms(130)self.BL.on()#打开背光self.LCD_SendComm(0X11)##退出睡眠模式self.LCD_SendComm(0x13)#普通模式全屏显示if inversion:self.LCD_SendComm(0x21)#颜色反转else:self.LCD_SendComm(0x20)#颜色不反转self.LCD_SendComm(0x38)#怠速模式关闭self.LCD_SendComm(0x3a)#改变颜色模式self.LCD_Send8Data(5)#16位颜色self.LCD_SendComm(0x34)self.LCD_SendComm(0xb4)self.LCD_Send8Data(0x00)self.LCD_SendComm(0x36)if mode==0 :self.LCD_Send8Data(0x00);elif mode==1:self.LCD_Send8Data(0xC0);elif mode==2:self.LCD_Send8Data(0x70);else :self.LCD_Send8Data(0xA0);         self.LCD_SendComm(0x29)##显示打开

工程文件

工程文件

ESP8266+MicroPython开发:ESP8266使用硬件SPI驱动TFT屏幕(ST7735)相关推荐

  1. 嵌入式开发-STM32硬件SPI驱动TFT屏

    嵌入式开发-STM32硬件SPI驱动TFT屏 这次用到的TFT屏 CubeMX设置 代码编写 增加的内容 需要注意问题 代码下载 这次用到的TFT屏 现在的TFT屏幕已经很便宜了,65536色屏幕,2 ...

  2. STM32单片机基础17——使用硬件SPI驱动TFT-LCD(ST7789)

    本篇详细的记录了如何使用STM32CubeMX配置STM32L431RCT6的硬件SPI外设与ST7789通信,驱动16bit TFT-LCD 屏幕. 0. 前言 学习 SPI 外设驱动LCD屏幕没有 ...

  3. 联盛德 HLK-W806 (十一): 软件SPI和硬件SPI驱动ST7567液晶LCD

    目录 联盛德 HLK-W806 (一): Ubuntu20.04下的开发环境配置, 编译和烧录说明 联盛德 HLK-W806 (二): Win10下的开发环境配置, 编译和烧录说明 联盛德 HLK-W ...

  4. 联盛德 HLK-W806 (九): 软件SPI和硬件SPI驱动ST7789V液晶LCD

    目录 联盛德 HLK-W806 (一): Ubuntu20.04下的开发环境配置, 编译和烧录说明 联盛德 HLK-W806 (二): Win10下的开发环境配置, 编译和烧录说明 联盛德 HLK-W ...

  5. STM32硬件SPI驱动OLED

    文章目录 一.OLED相关 1.OLED简介 2.0.96寸的OLED模块概述 3.模块引脚说明 4.汉字点阵编码原理 二.硬件SPI 1.SPI简介 2.SPI的引脚映射关系 三.SPI驱动的OLE ...

  6. MSP430杂谈--AD7793硬件SPI驱动与模拟SPI驱动

    最近项目中用到了AD7793读取铂电阻值来得到相应的温度,编写了基于MSP430的硬件驱动程序和模拟驱动程序,并且能成功运行,现在记录一下分享给大家. AD7793硬件IIC驱动完整版下载链接:htt ...

  7. 鸿蒙开发板Hi3861模拟SPI驱动JLX12864_LCD(UC1701X)_基于code-2.0

    鸿蒙开发板驱动晶联讯LCDjlx12864_lcd_hi3861源码-C文档类资源-CSDN下载鸿蒙开发板驱动晶联讯LCDjlx12864_lcd_hi3861源码博文介绍https://t更多下载资 ...

  8. STM32CubeMX | 基于STM32使用HAL库硬件SPI驱动WK2124一拖四SPI转四路串口芯片

    STM32CubeMX | 基于STM32使用HAL库硬件SPI驱动WK2124一拖四SPI转四路串口芯片 STM32基础工程生成 首先使用STM32CUBEMX生成STM32的基础工程,配置时钟到7 ...

  9. STM32使用硬件SPI驱动RC522门禁模块

    0.前言 RC522射频门禁识别模块非常常用,某宝卖家提供的程序基本都是使用软件模拟SPI的方式进行驱动的,但是实测使用软件模拟SPI识别速率.准确性没有硬件SPI驱动时高,因此本篇博客用于记录使用S ...

最新文章

  1. (邓爱萍)类对象-this关键字
  2. 题目:三个售票员 卖出 30张票 || 多线程编程的企业级套路+模板||synchronized与Lock的区别
  3. python硬件_「大神器!」硬件的AI性能测试Python库发布
  4. 基于tensorflow实现图像分类——理解神经网络运作过程、tensorflow入门
  5. C++设计模式-Command命令模式
  6. 新买的手机一直没有更新系统,是不是新买的手机原装系统最好用啊?
  7. Docker最全教程之使用Tencent Hub来完成CI(九)
  8. 工作中沟通和执行力的重要性-开发、项目经理、需求之间的矛盾冲突
  9. PAT A1008 Elevator (20 分)
  10. Cisco Packet Tracer Student的路由器接口配置
  11. 【读书笔记】-《工业互联网-技术与实践》
  12. 通俗易懂说:snprintf scnprintf
  13. 【名词解释】LTE终端的五模、七模、十频、十一频
  14. php外边距的代码,外边距简写属性 margin
  15. SiTime 硅晶振与石英晶振的区别
  16. 物理竞赛应该怎么准备?3个步骤教你敲响名牌大学门!
  17. PicGo+Typora图床搭建教程
  18. 读设计模式之禅--策略模式
  19. LeetCode 224. 基本计算器
  20. 【译】 Dart 2.12 发布,稳定空安全声明和FFI版本,Dart 未来的计划

热门文章

  1. JDBC的工作原理和工作步骤
  2. ar路由器的虚拟服务器,ar111s路由器如何设置虚拟服务器
  3. 今天开始写android的照片浏览器(一)至返回所有图片文件
  4. Web2.0时代,RSS你会用了吗?(技术实现总结)
  5. Hikvision IP Camera Android开发
  6. 【服务器】 如何私网转换成人人可以访问的公网?#采用花生壳
  7. 【c++】2.处理数据
  8. 对话王学宗:畅谈区块链如何赋能实体?
  9. 股指期货价格变绿(期货什么颜色是涨)
  10. 用行内标签插入背景图