SSD1306/SSD1315 OLED
0.96的128x64 OLED液晶屏是嵌入式应用中最常见的一种屏幕, 这种屏幕常见的pin脚类型有两种: I2C和SPI, 驱动通常是SSD1306, 最近会有一些是SSD1315
I2C类型的OLED只有4个pin脚, 不可修改连接模式, 比较好辨认
SPI类型的OLED有6/7/8pin几种类型, 最常见的是7pin, 带协议选项的模块, 这种模块的背面PCB会有三种模式的选择说明, 后面列出的Rx代表那些位置需要焊接电阻, 通常这些电阻阻值都是5KR, 默认出厂都是4线SPI的模式
在SPI模式下, SSD1306和SSD1315的驱动方式是一样的. 因为W806可以使用硬件SPI, 刷新速度比I2C方式要快将近10倍, 下面介绍的是4线SPI模式的驱动
连接
虽然是4线SPI, 也需要连全部7根线, 4线没算上VCC, GND和Reset, 对应本演示的连接方式为
PB14 -> CS
PB15 -> SCK/CLK/D0
PB17 -> MOSI/SDA/D1
PB10 -> RES(Reset)
PB11 -> DC
GND -> GND
3.3V -> VCC
库文件
本示例由I2C的示例改进得到, 增加了SPI传输方法, 顺带更新了一下演示功能, 这个库文件支持
画点
画线
画圆
输出文字(需要软字库)
画图
使用
驱动SSD1306/SSD1315时, 需要引入的文件为
ssd1306.c
ssd1306.h
ssd1306_fonts.c
ssd1306_fonts.h
在main.c中加入头文件并初始化 SPI_HandleTypeDef
#include "ssd1306.h"
SPI_HandleTypeDef hspi;
static void SPI_Init(void)
{
hspi.Instance = SPI;
hspi.Init.Mode = SPI_MODE_MASTER;
hspi.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi.Init.NSS = SPI_NSS_SOFT;
hspi.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_40;
hspi.Init.FirstByte = SPI_LITTLEENDIAN;
if (HAL_SPI_Init(&hspi) != HAL_OK)
{
Error_Handler();
}
}
static void GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIO_CLK_ENABLE();
GPIO_InitStruct.Pin = SSD1306_RES_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(SSD1306_RES_PORT, &GPIO_InitStruct);
GPIO_InitStruct.Pin = SSD1306_DC_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(SSD1306_DC_PORT, &GPIO_InitStruct);
}
在ssd1306.h中, 确认设置的模式为SPI
/**
* Mode switch: 0 - SPI, 1 - I2C
*/
#define SSD1306_MODE_I2C 0
修改当前屏幕对应的参数: 宽度, 高度
/* SSD1306 settings */
/* SSD1306 width in pixels */
#ifndef SSD1306_WIDTH
#define SSD1306_WIDTH 128
#endif
/* SSD1306 LCD height in pixels */
#ifndef SSD1306_HEIGHT
#define SSD1306_HEIGHT 64
#endif
然后就可以在代码中使用了
# 初始化
GPIO_Init();
SPI_Init();
uint8_t res = SSD1306_Init();
printf("OLED init: %dn", res);
# 定位绘画起点
SSD1306_GotoXY(5, 5);
# 输出字符
SSD1306_Puts("OLED:11x18", &Font_11x18, 1);
# 更新显示
SSD1306_UpdateScreen(); // display
清屏
SSD1306_Fill(0); // clear oled
画线
int y1 = 64, y2 = 0;
while (y1 > 0)
{
SSD1306_DrawLine(0, y1, 128, y2, 1);
SSD1306_UpdateScreen();
y1 -= 2;
y2 += 2;
}
填充反色, 画圆
SSD1306_Fill(1); // clear oled
SSD1306_UpdateScreen();
SSD1306_DrawCircle(64, 32, 25, 0);
SSD1306_UpdateScreen();
SSD1306_DrawCircle(128, 32, 25, 0);
SSD1306_UpdateScreen();
SSD1306_DrawCircle(0, 32, 25, 0);
SSD1306_UpdateScreen();
SSD1306_DrawCircle(32, 32, 25, 0);
SSD1306_UpdateScreen();
SSD1306_DrawCircle(96, 32, 25, 0);
SSD1306_UpdateScreen();
相关代码
代码已经更新到SDK的I2C示例(同时支持I2C和SPI)
Github: wm-sdk-w806/tree/main/demo/i2c/ssd1306_oled
Gitee: wm-sdk-w806/tree/main/demo/i2c/ssd1306_oled
参考
OLED displays (SSD1306 and SSD1315) http://cholla.mmto.org/electronics/displays/oled/
上一篇:联盛德 HLK-W806 (九): 软件SPI和硬件SPI驱动ST7789V液晶LCD
下一篇:联盛德 HLK-W806 (七): 兼容开发板 LuatOS Air103
推荐阅读最新更新时间:2024-11-12 12:06
设计资源 培训 开发板 精华推荐
- AM2G-1218DH30Z ±18V 2 瓦 DC-DC 转换器的典型应用,适用于开/关控制应用
- 使用 NXP Semiconductors 的 TDA8580J 的参考设计
- DS51623A、PIC18 工业以太网 MCU 开发系统
- 测量仪器调制解调器
- 具有短路保护功能的 MC78M15CTG 15V 电流提升的典型应用
- TWN4-MULTITECH-NANO:Elatec TWN4 MultiTech Nano
- LTC3526BEDC 1 节电池至 3.3V 升压转换器的典型应用电路
- NCP1117 1.0 A低压降有源SCSI总线终端典型应用
- 使用 Richtek Technology Corporation 的 RT9594B 的参考设计
- LT8609IMSE 1.8V、2MHz 降压转换器的典型应用电路
- 有奖问答 | Azure Sphere物联网解决方案 问答排位赛,你能霸屏多久?
- Digi-Key KOL视频来袭~欢迎进入MicroPython的奇妙世界
- 答题赢京东卡|《安森美和安富利物联网创新设计大赛作品集》
- 《带您了解ADI数字健康生物传感器系列》有奖直播
- 有奖下载 |《设计无线通信系统时需考虑的天线因素》
- 有奖直播:现代电动工具的设计挑战与英飞凌解决之道
- TI模拟博文深度阅读季,赢小米盒子!
- ADI基于ADPD188BI的烟雾探测器集成解决方案 有奖直播 5月13日上午10:00-11:30 为您揭晓!
- 详述项目申请,可获 TI Stellaris开发板!
- 了解 TE Connectivity 无创想,不奇迹 精彩专题,答题送好礼!