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

news/2025/2/12 23:09:52/

目录

  • 联盛德 HLK-W806 (一): Ubuntu20.04下的开发环境配置, 编译和烧录说明
  • 联盛德 HLK-W806 (二): Win10下的开发环境配置, 编译和烧录说明
  • 联盛德 HLK-W806 (三): 免按键自动下载和复位
  • 联盛德 HLK-W806 (四): 软件SPI和硬件SPI驱动ST7735液晶LCD
  • 联盛德 HLK-W806 (五): W801开发板上手报告
  • 联盛德 HLK-W806 (六): I2C驱动SSD1306 128x64 OLED液晶屏
  • 联盛德 HLK-W806 (七): 兼容开发板 LuatOS Air103
  • 联盛德 HLK-W806 (八): 4线SPI驱动SSD1306/SSD1315 128x64 OLED液晶屏
  • 联盛德 HLK-W806 (九): 软件SPI和硬件SPI驱动ST7789V液晶LCD
  • 联盛德 HLK-W806 (十): 在 CDK IDE开发环境中使用WM-SDK-W806
  • 联盛德 HLK-W806 (十一): 软件SPI和硬件SPI驱动ST7567液晶LCD
  • 联盛德 HLK-W806 (十二): Makefile组织结构和编译流程说明
  • 联盛德 HLK-W806 (十三): 运行FatFs读写FAT和exFat格式的SD卡/TF卡

SSD1306 OLED

SSD1306驱动的128x64 OLED液晶屏是嵌入式应用中最常见的一种屏幕, 特点是亮度高耗电小可视角度大.
这种屏幕常见的pin脚类型有两种: 4线的I2C和6/7/8线的SPI. 这里介绍的是I2C类型的连接和驱动. 如果需要查看SPI方式的驱动, 请点击 4线SPI驱动SSD1306/SSD1315 128x64 OLED液晶屏

连接

对应本演示的连接方式为

  • 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模式

/*** Mode switch: 0 - SPI, 1 - I2C*/
#define SSD1306_MODE_I2C          1

修改当前屏幕对应的参数: 地址, 宽度, 高度

/* I2C address */
#ifndef SSD1306_I2C_ADDR
#define SSD1306_I2C_ADDR         0x78
#endif/* 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

然后就可以在代码中使用了

# 初始化
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

Update 2023-02-23: 已经修复SSD1306在较低I2C外设频率下无法正常显示的问题. 调整了预分频寄存器值计算公式, 减小时钟误差.

参考

  • https://github.com/SL-RU/stm32libs
  • 中文字库 https://github.com/zfj-hash/BitmapFont
  • 中文字库UTF-8 https://github.com/simple51/S51_UTF_8_FontLibrary

http://www.ppmy.cn/news/191626.html

相关文章

20230424

Theres a big difference between knowing the path and walking the path. 知其路与行其路有天壤之别。 If we just open the door a crack, the light comes pouring in. 只要把门打开一丝缝隙,光就会倾泻而入。 The greatest thing Ive ever known is to lov…

LCD1602_3.3V

模块:LCD1602_3.3V 主控: STM32F4xxxx 目录 一、LCD1602 使用的模块供电电压是3.3V的!! 接口说明:​ 二、时序说明 一、LCD1602 使用的是某宝LCD1602A模块 简述: 1602A QAPASS字符型液晶显示模块是专门用于显示字母、数字…

解决R6034错误

本人的项目使用ATL开发一个具有3D功能的COM组件,组件中使用了OGRE开源库,对OGRE库的Include和Link都配置好以后,编译自己的库,在生成DLL的最后一步register output时,弹出错误 “Microsoft Visual C Debug Library”&a…

高清录播服务器(什么是服务器)

服务器英文名称为“Server”,指的是网络环境下为客户机(Client)提供某种服务的专用计算机,服务器安装有网络操作系统和各种服务器应用系统软件(如Web服务、电子邮件服务),通常分为文件服务器(能使用户在其它计算机访问文件),数据库服务器和应用程序服务器。运行以上软件的…

1计算机系统概述_1.2计算机系统层次结构

1.2 计算机系统层次结构 计算机系统(CO 自命名) 1、CO的组成 硬件系统和软件系统共同构成了一个完整的计算机系统 ——硬件:有形的物理设备,是CO中实际物理装置的总称 ——软件:在硬件上运行的程序和相关的数据及文…

Java简单实现短信验证登录(Session、Redis)

前端设计 <div class"login-form"><div style"display: flex; justify-content: space-between"><el-input style"width: 60%" placeholder"请输入手机号" v-model"form.phone" ></el-input><e…

自组网对讲机怎么轻松组网

BF-TD930自组网数字对讲机是基于TDMA、DMR/PDT技术研发&#xff0c;人性化的全键盘外观设计&#xff0c;ABSPC材料机身耐磨抗摔&#xff0c;适应各种恶劣工作环境、高强度通信需求。具备直通全双工通话、IP68防护等级、多重安全示警保障、卫星定位、AES256/ARC4语音加密。并支持…

对讲机中继台安装

对讲机中继台安装 对讲机理论距离可以达到近10公里&#xff0c;但由于环境和地形的影响&#xff0c;实际通话距离大打折扣&#xff0c;特别是在室内环境下&#xff0c;通话距离更近。在复杂的地下室&#xff0c;两者之间的通话有可能不足100米&#xff0c;那么遇到这种情况怎么…