ESP32-IDF 的ST7735/ST7735S 驱动程序

引言

  • 最近用ESP32S3 的 IDF写 ST7735S的小项目,但用组件管理器有点问题,干脆手动移植一下

代码内容

头文件:

#ifndef _LCD_ST7735S_H_
#define _LCD_ST7735S_H_

///设备选择
#define ESP32_SPI   1
#define STM32       0               ///需要自己添加GPIO SPI 代码

///屏幕参数
#define     LCD_DIR_VAERTICAL1      0           ///<竖屏1
#define     LCD_DIR_VAERTICAL2      1           ///<竖屏2
#define     LCD_DIR_TRANSVERSET1    2           ///<横屏1
#define     LCD_DIR_TRANSVERSET2    3           ///<横屏2

#define     LCD_DIR  LCD_DIR_VAERTICAL2         ///<显示方向

#if (LCD_DIR==LCD_DIR_VAERTICAL1||LCD_DIR==LCD_DIR_VAERTICAL2)
#define LCD_ROW_SIZE        128                 ///<屏幕行像素
#define LCD_COLUMN_SIZE     160                 ///<屏幕列像素
#else
#define LCD_ROW_SIZE        160                 ///<屏幕行像素
#define LCD_COLUMN_SIZE     128                 ///<屏幕列像素
#endif

#define LCD_DELAY(t)    vTaskDelay(t)       ///<延时函数

///spi
#define LCD_HARDWARE_CS 1                   ///< 1选择 硬件CS 0选择 软件gpio CS
#if ESP32_SPI
#define LCD_SPI_HOST    SPI2_HOST           ///< 哪个 spi
#define LCD_SPI_MODE    1                   ///<spi模式 4种 0~3
#define LCD_PIN_CS      GPIO_NUM_15         ///< 片选
#define LCD_PIN_RES     GPIO_NUM_2          ///< 复位
#define LCD_PIN_A0      GPIO_NUM_3          ///< 命令/数据
#define LCD_PIN_SDA     GPIO_NUM_13         ///< MOSI
#define LCD_PIN_SCL     GPIO_NUM_14         ///< spi CLK


/*io操作*/
#define SET_LCD_CS 	    gpio_set_level(LCD_PIN_CS, 1)
#define SET_LCD_RES     gpio_set_level(LCD_PIN_RES, 1)
#define SET_LCD_A0 	    gpio_set_level(LCD_PIN_A0, 1)
#define SET_LCD_SDA     gpio_set_level(LCD_PIN_SDA, 1)
#define SET_LCD_SCL     gpio_set_level(LCD_PIN_SCL, 1)

#define	CLR_LCD_CS      gpio_set_level(LCD_PIN_CS, 0)
#define	CLR_LCD_RES     gpio_set_level(LCD_PIN_RES, 0)
#define	CLR_LCD_A0      gpio_set_level(LCD_PIN_A0, 0)
#define	CLR_LCD_SDA     gpio_set_level(LCD_PIN_SDA, 0)
#define	CLR_LCD_SCL     gpio_set_level(LCD_PIN_SCL, 0)
#endif

#if STM32
#define LCD_PORT GPIOE
#define LCD_PIN_CS GPIO_Pin_11
#define LCD_PIN_RES GPIO_Pin_8
#define LCD_PIN_A0 GPIO_Pin_10
#define LCD_PIN_SDA GPIO_Pin_12
#define LCD_PIN_SCL GPIO_Pin_9

#define SET_LCD_CS 	GPIO_SetBits(LCD_PORT, LCD_PIN_CS)
#define SET_LCD_RES GPIO_SetBits(LCD_PORT, LCD_PIN_RES)
#define SET_LCD_A0 	GPIO_SetBits(LCD_PORT, LCD_PIN_A0)
#define SET_LCD_SDA GPIO_SetBits(LCD_PORT, LCD_PIN_SDA)
#define SET_LCD_SCL GPIO_SetBits(LCD_PORT, LCD_PIN_SCL)

#define	CLR_LCD_CS  GPIO_ResetBits(LCD_PORT, LCD_PIN_CS)
#define	CLR_LCD_RES  GPIO_ResetBits(LCD_PORT, LCD_PIN_RES)
#define	CLR_LCD_A0  GPIO_ResetBits(LCD_PORT, LCD_PIN_A0)
#define	CLR_LCD_SDA  GPIO_ResetBits(LCD_PORT, LCD_PIN_SDA)
#define	CLR_LCD_SCL  GPIO_ResetBits(LCD_PORT, LCD_PIN_SCL)
#endif

/*--颜色--*/
#define WHITE	    0xFFFF
#define BLACK	    0x0000	  
#define BLUE	    0x001F  
#define BRED	    0XF81F
#define GRED	    0XFFE0
#define GBLUE	    0X07FF
#define RED		    0xF800
#define MAGENTA	    0xF81F
#define GREEN	    0x07E0
#define CYAN	    0x7FFF
#define YELLOW	    0xFFE0
#define BROWN	    0XBC40 //棕色
#define BRRED	    0XFC07 //棕红色
#define GRAY	    0X8430 //灰色
#define DARKBLUE	0X01CF	//深蓝色
#define LIGHTBLUE	0X7D7C	//浅蓝色  
#define GRAYBLUE	0X5458 //灰蓝色


void LcdGpioSpiInit(void);
/// @brief 屏幕初始化
/// @param  None
void lcdInit(void);
void lcdSetAddress(unsigned short x1, unsigned short y1, unsigned short x2, unsigned short y2);
/// @brief 清屏
/// @param color 填充颜色
void lcdClear(unsigned short color);

/// @brief 画点
/// @param x 位置
/// @param y 位置
/// @param color 颜色
void LCD_DrawPoint(unsigned short x, unsigned short y, unsigned short color);


void LCD_DisplayOn(void); //开显示
void LCD_DisplayOff(void); //关显示
void LCD_Draw_Circle(unsigned short x0, unsigned short y0, unsigned char r, unsigned short color); //画圆
void LCD_DrawFullCircle(unsigned short Xpos, unsigned short Ypos, unsigned short Radius, unsigned short Color);
void LCD_Fill(unsigned short sx, unsigned short sy, unsigned short ex, unsigned short ey, unsigned short color); //填充区域
void LCD_DrawLine(unsigned short x1, unsigned short y1, unsigned short x2, unsigned short y2, unsigned short color); //画线
void LCD_DrawRectangle(unsigned short x1, unsigned short y1, unsigned short x2, unsigned short y2, unsigned short color); //画矩形
// void LCD_ShowChar(unsigned short x, unsigned short y, unsigned char num, unsigned char size, unsigned char mode, unsigned short pen_color, unsigned short back_color); //写ASCII字符
// void LCD_ShowString(unsigned short x, unsigned short y, unsigned short width, unsigned short height, unsigned char size, unsigned char *p, unsigned short pen_color, unsigned short back_color); //写ASCII字符串
### 关于ESP32ST7735S显示屏的相关资料 #### 接线图说明 对于ESP32开发板连接到ST7735S 1.8英寸显示屏,通常会使用几根杜邦线来完成硬件连接。具体的接线方式如下表所示: | ESP32 Pin | ST7735S Pin | |-----------|-------------| | GND | GND | | VCC (3V3) | VCC | | GPIO 14 | SCLK | | GPIO 13 | MOSI | | GPIO 27 | CS | | GPIO 26 | DC | | GPIO 25 | RST | 此配置适用于大多数情况下的基本设置[^1]。 #### 驱动代码示例 为了使ESP32能够控制ST7735S屏幕并显示内容,在MicroPython环境中可以采用`tft`库来进行操作。下面给出一段简单的初始化程序以及如何加载字体文件用于中文字符的展示: ```python from machine import Pin, SPI import st7735 # 设置SPI接口参数 spi = SPI(1, baudrate=20000000, polarity=0, phase=0, sck=Pin(14), mosi=Pin(13)) rst_pin = Pin(25, Pin.OUT) cs_pin = Pin(27, Pin.OUT) dc_pin = Pin(26, Pin.OUT) # 初始化LCD对象 lcd = st7735.ST7735(spi, rst=rst_pin, cs=cs_pin, dc=dc_pin) # 清屏命令 lcd.init() lcd.fill(st7735.BLACK) # 加载中文字体并打印测试字符串 font_file = "unifont-12x12.ttf" with open(font_file, 'rb') as f: font_data = f.read() def draw_text(text, x, y, color): lcd.text(font_data, text, x, y, color=color) draw_text('你好', 10, 10, st7735.WHITE) ``` 上述代码片段展示了如何通过SPI协议建立通信链路,并利用预编译好的`.ttf`格式字体文件实现汉字渲染功能。 另外,如果希望进一步探索图形化界面的应用,则可参考其他更复杂的案例,比如三维立方体动画演示等[^2]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值