联盛德|联盛德 HLK-W806 (六): I2C驱动SSD1306 128x64 OLED液晶屏

目录

  • 联盛德 HLK-W806 (一): Ubuntu20.04下的开发环境配置, 编译和烧录说明
  • 联盛德 HLK-W806 (二): Win10下的开发环境配置, 编译和烧录说明
  • 联盛德 HLK-W806 (三): 免按键自动下载和复位
  • 联盛德 HLK-W806 (四): 软件SPI和硬件SPI驱动ST7735液晶LCD
  • 联盛德 HLK-W806 (五): W801开发板上手报告
  • 联盛德 HLK-W806 (六): I2C驱动SSD1306 128x64 OLED液晶屏
SSD1306 OLED 联盛德|联盛德 HLK-W806 (六): I2C驱动SSD1306 128x64 OLED液晶屏
文章图片

SSD1306驱动的128x64 OLED液晶屏是嵌入式应用中最常见的一种屏幕, 特点是亮度高耗电小可视角度大.
这种屏幕常见的pin脚类型有两种: 4线的I2C和6/7/8线的SPI. 这里介绍的是I2C类型的连接和驱动.
连接 对应本演示的连接方式为
  • SCL -> PA1
  • SDA -> PA4
  • GND -> GND
  • VCC -> 3.3V
W806的I2C只有两种选择: PA1+PA4 和 PB20+PB19
库文件 本示例移植自Github上Lutsai Alexander的 stm32libs项目, 根据W806的I2C HAL接口修改了传输部分, 去除了DMA方法, 并修改了字体展示部分以适应当前SDK的字体格式. 这个库文件支持
  • 画点
  • 画线
  • 画圆
  • 输出文字(需要软字库)
  • 画图
使用 驱动SSD1306时, 需要引入的文件为
  • ssd1306.c
  • ssd1306.h
  • ssd1306_fonts.c
  • ssd1306_fonts.h
在main.c中加入头文件并初始化 I2C_HandleTypeDef, 如果不使用PA1+PA4, 需要修改下面的I2C_Init()代码.
#include "ssd1306.h"I2C_HandleTypeDef hi2c; void I2C_Init(void) { hi2c.SCL_Port = GPIOA; hi2c.SCL_Pin = GPIO_PIN_1; hi2c.SDA_Port = GPIOA; hi2c.SDA_Pin = GPIO_PIN_4; HAL_I2C_Init(&hi2c); }

在ssd1306.h中修改当前屏幕对应的参数: 地址, 宽度, 高度
/* I2C address */ #ifndef SSD1306_I2C_ADDR #define SSD1306_I2C_ADDR0x78 #endif/* SSD1306 settings */ /* SSD1306 width in pixels */ #ifndef SSD1306_WIDTH #define SSD1306_WIDTH128 #endif /* SSD1306 LCD height in pixels */ #ifndef SSD1306_HEIGHT #define SSD1306_HEIGHT64 #endif

【联盛德|联盛德 HLK-W806 (六): I2C驱动SSD1306 128x64 OLED液晶屏】然后就可以在代码中使用了
# 初始化 uint8_t res = SSD1306_Init(); printf("OLED init: %d\n", 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示例
  • Github: wm-sdk-w806/tree/main/demo/i2c/ssd1306_oled
  • Gitee: wm-sdk-w806/tree/main/demo/i2c/ssd1306_oled
参考
  • https://github.com/SL-RU/stm32libs

    推荐阅读