LCD显示屏接口非常丰富,有我们上篇谈到MCU8080接口,也有今天谈到的SPI接口。两者的最大不同,我觉得应该是数据信号线的个数不同了。
在小尺寸液晶屏的硬件设计中,比如我们常用的128x64分辨率的0.96英才OLED屏。在为了节省MCU的引脚数量,或者限于MCU引脚数的要求的应用场景下,需要使用更少数据线来驱动LCD屏,那么SPI接口则是你最优的选择了。
SPI(Serial Peripheral Interface)通信协议,SPI是一种同步串行通信协议,它允许主设备(通常是微控制器)与从设备(如SSD1306)之间进行高速数据传输。其使用4根信号线,MOSI,MISO,SCLK,CS信号线。
我们以平时在DIY中最常用的0.96英寸的OLED显示屏为例子,看看硬件电路如何连接:
硬件连接如上图所示,其实也就是SPI外设的发送引脚与时钟引脚的连接,其余信号线为GPIO引脚。连接上即可,走线难度几乎为零。
我们以SSD1306驱动芯片为例,分享一下驱动代码:
#include <stdint.h> #include <stdbool.h> // 假设这些函数是您的 SPI 通信库提供的 extern void SPI_Init(void); extern void SPI_WriteByte(uint8_t data); extern void SPI_Transfer(uint8_t *txBuffer, uint8_t *rxBuffer, uint16_t length); extern void SPI_SelectChip(bool select); // SSD1306 命令和数据模式选择 #define SSD1306_CMD_MODE 0x00 #define SSD1306_DATA_MODE 0x40 // SSD1306 指令集 #define SSD1306_SET_CONTRAST 0x81 #define SSD1306_DISPLAY_ALL_ON_RESUME 0xA4 #define SSD1306_DISPLAY_ALL_ON 0xA5 #define SSD1306_NORMAL_DISPLAY 0xA6 #define SSD1306_INVERT_DISPLAY 0xA7 #define SSD1306_DISPLAY_OFF 0xAE #define SSD1306_DISPLAY_ON 0xAF // SSD1306 初始化函数 void SSD1306_Init(void) { SPI_SelectChip(true); SPI_WriteByte(SSD1306_CMD_MODE); SPI_WriteByte(SSD1306_DISPLAY_OFF); // 关闭显示 SPI_WriteByte(SSD1306_SET_CONTRAST); // 设置对比度 SPI_WriteByte(0x7F); // 对比度值(0x00 - 0x7F) SPI_WriteByte(SSD1306_DISPLAY_ALL_ON_RESUME);// 唤醒显示 SPI_WriteByte(SSD1306_NORMAL_DISPLAY); // 设置正常显示模式 SPI_WriteByte(SSD1306_DISPLAY_ON); // 打开显示 SPI_SelectChip(false); } // 向 SSD1306 发送数据 void SSD1306_WriteData(uint8_t data) { SPI_SelectChip(true); SPI_WriteByte(SSD1306_DATA_MODE); SPI_WriteByte(data); SPI_SelectChip(false); }