当前位置: 代码迷 >> 综合 >> 【Luat-esp32】2.点屏-st7735
  详细解决方案

【Luat-esp32】2.点屏-st7735

热度:92   发布时间:2023-12-05 20:31:33.0

文章目录

  • 前言
  • 显示屏信息
  • 代码
    • spi配置
    • lcd配置
  • 电路连接
  • 测试代码1
  • 现象1
  • 代码2
  • 现象2
  • 注意点

前言

已经简单熟悉了下载流程以及点灯,尝试显示屏。

显示屏信息

购买来源:1.8寸 TFT LCD 分辨率128X160 SPI串口屏 合宙LuatOS全系模块支持

引脚信息如下(图片来源于该链接):
在这里插入图片描述
需要注意的是供电是3.3v,也就是esp32的引脚7/15/20可以提供。
在这里插入图片描述

代码

luat 5.3 参考手册:
https://wiki.luatos.com/_static/lua53doc/contents.html

接口文档:
https://wiki.luatos.com/api/index.html

-- esp32 demo
--- 模块功能:lcddemo
-- @module lcd
-- @author Dozingfiretruck
-- @release 2021.01.25-- LuaTools需要PROJECT和VERSION这两个信息
PROJECT = "lcddemo"
VERSION = "1.0.0"log.info("main", PROJECT, VERSION)-- sys库是标配
_G.sys = require("sys")--添加硬狗防止程序卡死
-- wdt.init(15000)--初始化watchdog设置为15s
-- sys.timerLoopStart(wdt.feed, 10000)--10s喂一次狗spi_lcd = spi.deviceSetup(2,5,0,0,8,40000000,spi.MSB,1,1)
log.info("lcd.init",
lcd.init("st7789",{
    port = "device",pin_dc = 3, pin_rst = 4,direction = 0,w = 240,h = 320,xoffset = 0,yoffset = 0},spi_lcd))log.info("lcd.drawLine", lcd.drawLine(20,20,150,20,0x001F))
log.info("lcd.drawRectangle", lcd.drawRectangle(20,40,120,70,0xF800))
log.info("lcd.drawCircle", lcd.drawCircle(50,50,20,0x0CE0))sys.taskInit(function()while 1 dosys.wait(500)end
end)-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!

spi配置

spi操作库:https://wiki.luatos.com/api/spi.html

setup接口
在这里插入图片描述
deviceSetup接口
在这里插入图片描述

-- 官方示例
spi_device = spi.deviceSetup(0,17,0,0,8,2000000,spi.MSB,1,1)-- esp32 + st7789
spi_lcd = spi.deviceSetup(2,5,0,0,8,40000000,spi.MSB,1,1)

对比deviceSetup
id:spi号,存疑,esp32示例是否使用的是IO2(引脚14),推测spi号因该是时钟信号的io口
cs:spi片选信号,存疑,esp32示例是否使用的是IO5(引脚6),我使用IO7
CPHA:CPHA
CPOL:CPOL,这两个用于配置上升沿下降沿触发。
dataw:数据位宽,默认8
bandrate:波特率,母鸡,仿照写40000000吧,后续再看有没有异常,难道是频率?
bitdict:大小端,默认spi.MSB, 可选spi.LSB,此处仿照选spi.MSB
ms:默认主1, 可选从机0. 通常只支持主机模式,仿照选1
mode:工作模式, 全双工1, 半双工0, 默认全双工,仿照选1

spi_lcd = spi.deviceSetup(2,7,0,0,8,40000000,spi.MSB,1,1)

目前先仿照esp32的demo,需要注意的是连线
不清楚spi为什么必须选择2,我试过其他的就失败了。

lcd配置

lcd - lcd驱动模块:https://wiki.luatos.com/api/lcd.html
1.8寸TFT LCD 128X160 (st7735S): https://doc.openluat.com/wiki/21?wiki_page_id=2650
在这里插入图片描述

pin_pwr为可选项,可不设置port:spi端口,例如0,1,2…如果为device方式则为”device”;
pin_dc:lcd数据/命令选择引脚;
pin_rst:lcd复位引脚;
pin_pwr:lcd背光引脚 可选项,可不设置;
direction:lcd屏幕方向 0:0° 1:180° 2:270° 3:90°;
w:lcd 水平分辨率;
h:lcd 竖直分辨率;
xoffset:x偏移(不同屏幕ic 不同屏幕方向会有差异);
yoffset:y偏移(不同屏幕ic 不同屏幕方向会有差异)

-- 官网示例
lcd.init("st7735s",{
    port = "device",pin_dc = 17, pin_pwr = 7,pin_rst = 19,direction = 2,w = 160,h = 80,xoffset = 1,yoffset = 26},spi_lcd))-- esp32 lcddemo
lcd.init("st7789",{
    port = "device",pin_dc = 3, pin_rst = 4,direction = 0,w = 240,h = 320,xoffset = 0,yoffset = 0},spi_lcd))

我的屏幕ic是st7735,所以string应该设为"st7735".
port:当使用的是spi设备时,应该设为"device",一致。
pin_dc:数据/命令口
pin_pwr:esp示例中没有配置,这个是lcd的背光引脚,可以不配置。
pin_rst:复位引脚,可自选,我仿照esp32设为IO4(引脚5)
direction:屏幕方向,仿照esp32为0,不旋转
w:屏幕的水平分辨率,这个自己写了,因为官方示例是翻转了的,我选择设为128(分辨率为128*160)
h:屏幕的竖直分辨率,设为160
xoffset:水平偏移,可能由于图片显示问题需要设置,目前先设为0
yoffset:竖直偏移,可能由于图片显示问题需要设置,目前先设为0

-- st7735 + esp32
lcd.init("st7735",{
    port = "device",pin_dc = 6, pin_pwr = 11,pin_rst = 10,direction = 0,w = 128,h = 160,xoffset = 0,yoffset = 0},spi_lcd))

这就是我的配置了。

电路连接

根据上述代码

-- 
spi_lcd = spi.deviceSetup(2,7,0,0,8,20000000,spi.MSB,1,1)-- st7735 + esp32
lcd.init("st7735",{
    port = "device",pin_dc = 6, pin_pwr = 11,pin_rst = 10,direction = 0,w = 128,h = 160,xoffset = 0,yoffset = 0},spi_lcd))

在这里插入图片描述

在这里插入图片描述

参照air101:https://wiki.luatos.com/boardGuide/common/lcd.html
连接方式参照101,注意配置io口

测试代码1

--- 模块功能:lcddemo
-- @module lcd
-- @author Dozingfiretruck
-- @release 2021.01.25-- LuaTools需要PROJECT和VERSION这两个信息
PROJECT = "esp32_lcdst7735"
VERSION = "1.0.0"log.info("main", PROJECT, VERSION)-- sys库是标配
_G.sys = require("sys")--添加硬狗防止程序卡死
-- wdt.init(15000)--初始化watchdog设置为15s
-- sys.timerLoopStart(wdt.feed, 10000)--10s喂一次狗spi_lcd = spi.deviceSetup(2,7,0,0,8,20000000,spi.MSB,1,1)log.info("SPI OK")log.info("lcd.init",
-- st7735 + esp32
lcd.init("st7735",{
    port = "device",pin_dc = 6, pin_pwr = 11,pin_rst = 10,direction = 0,w = 128,h = 160,xoffset = 0,yoffset = 0},spi_lcd))log.info("LCD OK")log.info("lcd.drawLine", lcd.drawLine(20,20,150,20,0x001F))
log.info("lcd.drawRectangle", lcd.drawRectangle(20,40,120,70,0xF800))
log.info("lcd.drawCircle", lcd.drawCircle(50,50,20,0x0CE0))sys.taskInit(function()while 1 dosys.wait(500)end
end)-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!

现象1

在这里插入图片描述
在这里插入图片描述

不清楚为什么会屏幕一半为花屏,但是后续没有遇到过。

代码2

--- 模块功能:lcddemo
-- @module lcd
-- @author Dozingfiretruck
-- @release 2021.01.25-- LuaTools需要PROJECT和VERSION这两个信息
PROJECT = "esp32_lcdst7735"
VERSION = "1.0.0"log.info("main", PROJECT, VERSION)-- sys库是标配
_G.sys = require("sys")--添加硬狗防止程序卡死
-- wdt.init(15000)--初始化watchdog设置为15s
-- sys.timerLoopStart(wdt.feed, 10000)--10s喂一次狗-- spi test ok
-- spi clk is io2, cs is IO7
spi_lcd = spi.deviceSetup(2,7,0,0,8,20000000,spi.MSB,1,1)log.info("SPI OK")log.info("lcd.init",
-- st7735 + esp32
lcd.init("st7735",{
    port = "device",pin_dc = 6, pin_pwr = 11,pin_rst = 10,direction = 0,w = 128,h = 160,xoffset = 0,yoffset = 0},spi_lcd))log.info("LCD OK")local function display_line ()log.info("lcd.drawLine", lcd.drawLine(20,20,150,20,0x001F))log.info("lcd.drawRectangle", lcd.drawRectangle(20,40,120,70,0xF800))log.info("lcd.drawCircle", lcd.drawCircle(50,50,20,0x0CE0))-- sys.wait(1500)log.info("display demo")
endlocal function display_str ()lcd.setFont(lcd.font_opposansm12)lcd.drawStr(40,10,"drawStr")lcd.setFont(lcd.font_opposansm16_chinese)lcd.drawStr(40,40,"drawStr测试")
end-- lcd.clear(0x0CE0)
-- log.info("clear")sys.taskInit(function()while 1 dolcd.clear()display_str ()sys.wait(1500)lcd.clear()display_line ()sys.wait(1500)end
end)-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!

现象2

[luat]esp32+st7735

注意点

sys.wait貌似不能放在sys.taskInit外面。

不清楚为什么,前几次运行程序,跑一段时间后就不会显示了,屏幕全部空白,但是log有打印出来显示log。
不过后续就没遇到了。