驱动各种屏幕

注:所有SPI屏幕的CS引脚都可以省略,节省一个引脚。屏幕的CS接地就是启用了。

Arduino驱动屏幕比Linux方便多了,总共就分2大类,黑白点阵屏,灰阶,OLED用u8g2,彩色tft屏用TFT_eSPI,这2个库基本涵盖了绝大部分的屏幕。

ESP8266 硬件SPI引脚:
这里用的是硬件SPI,所以驱动其他屏幕,一般只需要指定CS、DC、RST引脚就行,MOSI、SCLK是固定的,不用指明。除想走软件模拟驱动。

复制代码
#define TFT_MISO D6 //数据IN :Automatically assigned with ESP8266 if not defined
#define TFT_MOSI D7 //或叫SDA,数据OUT: Automatically assigned with ESP8266 if not defined
#define TFT_SCLK D5 //或叫SCK :Automatically assigned with ESP8266 if not defined
#define TFT_CS D8  //Chip select control pin D8
#define TFT_DC D3  //或叫A0或RS: Data Command control pin
#define TFT_RST D4 //Reset pin (could connect to NodeMCU RST, see next line)

//拷贝到Arduino里即可
#define TFT_MISO D6
#define TFT_MOSI D7
#define TFT_SCLK D5
#define TFT_CS D8
#define TFT_DC D3
#define TFT_RST D4
复制代码

ESP32S3的SPI:

官方文档好像说ESP32S3的引脚是可以随便映射的(通过 GPIO 交换矩阵连接),但是性能会有所下降,只能到400MHz,推荐用IO MUX 管脚,也就是默认的SPI3引脚,可以到800MHz(有4个SPI,前两个不能用,用SPI3就行)

参考:ESP32-S3 引脚参考大全 - 小鹏STEM (xpstem.com)

//暂时还没测速过硬件SPI,下面是软件SPI的,如果是软SPI,随便用哪个引脚都行
#define
TFT_MOSI 14 #define TFT_RST 13 #define TFT_DC 12 #define TFT_CLK 11 #define TFT_CS 10 #define TFT_MISO 9

Air001的引脚:

硬件SPI引脚(PA_5,PA_7)
#define TFT_CS PB_0
#define TFT_RST PA_1
#define TFT_DC PA_4
#define TFT_MOSI PA_7
#define TFT_SCLK PA_5

 

注意:驱动的不同版本一般兼容,比如ST7789,ST7789V,ST7789V2,只是不同的屏幕分辨率,不同型号可能有某些参数不同,需要区别设置下

 

LCD1602:

这个比较简单,虽然接口多,单可以利用pcf8574模块通过i2c来简化接口,以树莓派为例子:

sudo apt install python3-smbus python3-dev

pip3 install RPLCD

复制代码
from time import sleep
import smbus
from RPLCD.i2c import CharLCD

# 初始化 LCD
lcd = CharLCD('PCF8574', 0x20)  # 使用合适的 I2C 地址,PCF8574的范围是0x20(3个电阻全焊上)-0x27(3个电阻全空)

# 清除 LCD 上的内容
lcd.clear()

# 在 LCD 上显示内容
lcd.write_string("Hello, World!")

# 等待 2 秒
sleep(2)

# 可以继续更新显示
lcd.clear()
lcd.write_string("Raspberry Pi!")
复制代码

Arduino:

库:Bonezegei_LCD1602_I2C(测试时1.0.4)

实例:随便,使用比较简单,只需要根据实际情况改下I2C的地址即可,例如:Bonezegei_LCD1602_I2C lcd(0x20);

 

SSD1306

屏幕:

库:u8g2(测试时版本2.35.30)(推荐) 或 ESP8266 and ESP32 OLED driver for SSD1306 displays(测试时4.4.1)

实例:随便

设置:

复制代码
U8G2:
硬件I2C:U8X8_SSD1306_128X64_NONAME_HW_I2C u8x8(/* reset=*/ U8X8_PIN_NONE);
软件I2C:U8X8_SSD1306_128X64_NONAME_SW_I2C u8x8(/* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE);

ESP8266 and ESP32 OLED driver for SSD1306 displays:
I2C:
    附带的示例默认都是I2C的,随便打开一个示例,加入引脚设置,就可以直接运行:
    #define SDA 13
    #define SCL 14
SPI:
    先把I2C的注释掉:
    //#include "SSD1306Wire.h"
    //SSD1306Wire display(0x3c, SDA, SCL);
    取消注释SPI的设置:
    #include "SSD1306Spi.h"
    #define CLK 10
    #define RST 11
    #define DC 12
    #define CS 13
    #define MOSI 14
    SSD1306Spi display(RST, DC, CS);
注:SPI的没测过,只是看注释部分应该是这样用
复制代码

 

ssd1327:

屏幕:【淘宝】https://m.tb.cn/h.5zn7evSrVPNgMbz?tk=gKI9WKREaD0 MF6563 「1.5寸日本进口 128128带灰阶oled屏 spi串口 有资料」

注:买来的这块屏的排线内部接触不良,导致连接屏幕后什么都不显示,要把排线往上用力托起来

库:Adafruit SSD1327 或 u8g2

实例:随便

设置:

复制代码
Adafruit_SSD1327:
修改SPI相关引脚,给硬件SPI取消注释,并且注释默认的I2C函数
#define OLED_CS D8
#define OLED_DC D3
#define OLED_RESET D4
// hardware SPI
Adafruit_SSD1327 display(128, 128, &SPI, OLED_DC, OLED_RESET, OLED_CS);

u8g2:
取消注释
U8G2_SSD1327_MIDAS_128X128_F_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ D8, /* dc=*/ D3, /* reset=*/ D4);
复制代码

 

ili9341:

屏幕:【淘宝】https://m.tb.cn/h.5u0mXA8T7ooDhE7?tk=SYlrWP3iyCw HU0025 「全新2.8寸TFT液晶屏 SPI串口屏240*320 4线IO 驱动ILI934118PIN」

库:Adafruit_ILI9341

示例:graphicstest

设置:

复制代码
在代码里添加引脚映射
#define TFT_MOSI 14
#define TFT_RST 13
#define TFT_DC 12
#define TFT_CLK 11
#define TFT_CS 10
#define TFT_MISO 9

根据是软SPI还是硬SPI,选择其中一个
//Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);    //硬件SPI
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST, TFT_MISO);
复制代码

 

st7565 / st7567 / uc1701

屏幕:

st7565:老王3.6寸12864 SPI屏幕(已下架)

st7567:思迈微1.3寸12864lcd液晶SPI显示屏3.3VCOG模组12pin焊接LCM驱动ST7567黑白屏

库:u8g2(测试时版本2.35.30)
示例:GraphicsTest 
设置:

注:看自带的例子发现,u8g2的api分2种,一种是u8g2,一种是u8x8。其中u8g2比较全面,图形能力强,资源占用多,接口比较复杂。而u8x8使用简单,功能少,资源占用少,一般用于文本显示。
如果屏幕全白,或者全黑,看不清,可能是驱动不完美兼容,默认对比度问题,要在setup里的u8g2.begin();后面加一行u8x8.setContrast(对比度);设置一个合适的对比度(0-255) st7565:引脚 1.CS 2.RST 3.A0(DC) 4.SCK 5.SDA 6.VCC(3V) 7.GND 8.LED- 9.LED+(3V) st7567:引脚 1.CS 2.RST 3.A0(DC) 4.SCK 5.SDA 6.VCC(3V) 7.GND 8.NC 9.NC 10.NC 11.LED+ 12.LED- 搜索屏幕对应的行,取消注释,或直接复制粘贴下面的(其实st75xx系列的驱动很多可以共用,就是可能位置有偏移什么的,比如7567就能用7565的驱动,只是显示y轴偏移了) st7565,对比度200:U8X8_ST7565_LX12864_4W_HW_SPI u8x8(/* cs=*/ D8, /* dc=*/ D3, /* reset=*/ D4); st7567,对比度160:U8X8_ST7567_ENH_DG128064I_4W_HW_SPI u8x8(/* cs=*/ D8, /* dc=*/ D3, /* reset=*/ D4);

 

st7789:

屏幕:【淘宝】https://m.tb.cn/h.5Ga4BuEXHLopuQv?tk=4gPtWPWtEv1 CZ3460 「高清ips  0.96寸 1.3寸 TFT显示屏 OLED 液晶屏 ST7735驱动」(1.3寸st7789)

 (屏幕已坏,排线有问题,显示很多竖线)

库:TFT_eSPI(测试时版本2.5.34)
链接:GitHub - Bodmer/TFT_eSPI: Arduino and PlatformIO IDE compatible TFT library optimised for the Raspberry Pi Pico (RP2040), STM32, ESP8266 and ESP32 that supports different driver chips
示例:随便
设置:

复制代码
这个库的例子不需要改引脚,改为在库源码目录里修改。
C:\Users\jeaso\Documents\Arduino\libraries\TFT_eSPI\User_Setup.h
把45行注释,并且55行左右的注释去掉,声明要用7789的驱动,#define ST7789_DRIVER
切记,因为默认选择的是ili9341驱动,所以要把ili9341的那一行注释掉,否则同时选中两个驱动,虽然编译不会报错,但是默认用ili9341,神奇的是也能驱动屏幕,但是屏幕显示方向错误,并且颜色不正常。 把88行的屏幕分辨率设置一下 #define TFT_WIDTH 240 // ST7789 240 x 240 and 240 x 320 #define TFT_HEIGHT 240 // ST7789 240 x 240 170行左右声明了引脚 #define TFT_MISO PIN_D6 // Automatically assigned with ESP8266 if not defined #define TFT_MOSI PIN_D7 // Automatically assigned with ESP8266 if not defined #define TFT_SCLK PIN_D5 // Automatically assigned with ESP8266 if not defined #define TFT_CS PIN_D8 // Chip select control pin D8 #define TFT_DC PIN_D3 // Data Command control pin #define TFT_RST PIN_D4 // Reset pin (could connect to NodeMCU RST, see next line) 至于PIN_DXX对应的是哪个物理引脚,可以在User_Setup_Select.h里末尾的地方看到,搜下关键字就找到了

默认SPI帧率是27MHz,可以改成40MHz,提高速度。如果是ESP32S3这种,还可以在硬件SPI的条件下改成80MHz
//#define SPI_FREQUENCY  27000000
#define SPI_FREQUENCY  40000000
但是不是越高越高,不少屏幕都有限制,像ili9341就推荐40,80会出现一些渲染错误
// With an ILI9341 display 40MHz works OK, 80MHz sometimes fails
// With a ST7735 display more than 27MHz may not work (spurious pixels and lines)
复制代码

 

st7789v(这个库有BUG不支持8266?显示一点内容后就不断重启,以前记得不会)

屏幕:【淘宝】https://m.tb.cn/h.5Gmg01fUQypAIZp?tk=ybgWWPWSmDK CZ3452 「1.14寸TFT显示屏LCD彩色液晶屏 ST7789驱动135x240分辨率 高清IPS」
库:st7789v-arduino(测试时版本0.1,该库没上arduino官方仓库)
链接:GitHub - deirvlon/ST7789v-Arduino: ST7789v Arduino Library - Tested on Arduino UNO and STM32 (Blue Pill) 
例子:graphicsTEST.ino
设置:
复制代码
先从github上下载仓库的zip文件,然后打开arduino -> 项目 -> 导入库 -> 添加.zip库,然后选择该库的示例文件即可
引脚跟上面一样配置
#define TFT_DC D3 #define TFT_RST D4 #define TFT_CS D8 // only for displays with CS pin #define TFT_MOSI D7 // for hardware SPI data pin (all of available pins) #define TFT_SCLK D5 // for hardware SPI sclk pin (all of available pins) 取消注释这一行,取代默认打开的那一行,ST7789v_arduino tft = ST7789v_arduino(TFT_DC, TFT_RST, TFT_CS); //for display 用硬件SPI的方式模拟 然后在setup里修改屏幕分辨率:tft.init(135, 240);
复制代码

 

st7789v2(存疑,不知道测试屏幕是否真的为st7789v2)

屏幕:【淘宝】7天无理由退货 https://e.tb.cn/h.TI20V98RYMawHvv?tk=TLhgeio7UcW CA381 「2.8寸TFT液晶显示屏彩屏LCD屏5点电容触摸ILI9341串口并口ST7789」

库:Adafruit ST7735 and ST7789 Library(测试时版本1.10.3) 或者参考上面st7789的TFT_eSPI库(这个库最完美)也可以运行上面st7789v的st7789v-arduino也能点亮,输出文字,但是设置有问题,不停重启屏幕
链接:GitHub - adafruit/Adafruit-ST7735-Library: This is a library for the Adafruit 1.8" SPI display http://www.adafruit.com/products/358 and http://www.adafruit.com/products/618
示例:graphicstest_st7789
设置:

复制代码
 // 驱动选7789
 Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST);

//
修改8266的引脚 #elif defined(ESP8266) #define TFT_CS D8 #define TFT_RST D4 #define TFT_DC D3 // 设置屏幕分辨率 // Use this initializer (uncomment) if using a 1.3" or 1.54" 240x240 TFT:
tft.init(240, 320); // Init ST7789 240x240

// 如果屏幕颠倒了旋转下
tft.setRotation(rotation)

// 如果屏幕刷新太快,可以手动设置下SPI的速度
 // SPI speed defaults to SPI_DEFAULT_FREQ defined in the library, you can override it here
  // Note that speed allowable depends on chip and quality of wiring, if you go too fast, you
  // may end up with a black screen some times, or all the time.
  tft.setSPISpeed(1000000);  //默认40MHz
复制代码

 

st7735s

屏幕:

【淘宝】https://m.tb.cn/h.5wT3LddBbmR0aDy?tk=YXBwWn5xKm3 CZ0000 「0.96寸高清ips tft显示屏液晶屏st7735 0.96寸TFT全彩屏 液晶屏」

【淘宝】7天无理由退货 https://e.tb.cn/h.TI21KaEfYrWjLHK?tk=jAAzeioR8rN HU108 「1.77寸1.8寸TFT液晶显示屏4线SPI串口ST7735S电阻触摸IPS全视角」

  

(左:0.96寸 中:1.77寸 右:0.96的排针 中间这个说是ips,可能是触摸屏的关系,显示效果很差)

库:TFT_eSPI(测试时版本2.5.34)或 Adafruit ST7735 and ST7789 Library 或 Ucglib (1.5.2)
示例:随便
设置:

复制代码
TFT_eSPI:
跟上面st7789的一样,不同的是:
1.驱动选 #define ST7735_DRIVER
2.#define TFT_WIDTH  80
3.#define TFT_HEIGHT 160
4.注意,160x80这个分辨率的要开启颜色反转,不然显示不正常:#define ST7735_GREENTAB160x80 // For 160 x 80 display (BGR, inverted, 26 offset)

Adafruit ST7735 and ST7789 Library:
跟上面一样,不同的是:
1.驱动选7735:
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
2.如果是160x80则选:tft.initR(INITR_MINI160x80_PLUGIN);  // Init ST7735S mini display
复制代码

 

posted @   JeasonBoy  阅读(1340)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示