STM32的HAL第三方库 – SSD1306 OLED屏幕

屏幕简介

市面上采用SSD1306驱动芯片的OLED屏技术成熟,价格低廉,可广泛应用于程序调试输出,信息显示和各种创客项目中。它的产品特性如下:

  • 0.96寸OLED屏,支持黑白、黑蓝或者黄蓝双色显示
  • 128×64分辨率,显示效果清晰,对比度高
  • 超大可视角度:大于160°(显示屏中可视角度最大的一种屏幕)
  • 宽电压供电(3V~5V),兼容3.3V和5V逻辑电平,无需电平转换芯片
  • 默认为4线制SPI总线,可以选择3线制SPI总线或者I2C总线
  • 超低功耗:正常显示仅为0.06W(远低于TFT显示屏)

软件库支持

在Arduino平台上,SSD1306 OLED的库支持非常丰富,比较有名的有

然而在STM32平台上,我没有发现使用比较广泛的第三方库。在玩Arduino开发板的时候,笔者使用Adafruit_SSD1306比较多。因为网上使用Adafruit_SSD1306的代码非常多,如果能移植的话Arduino上的代码也可以拿来复用。

因此笔者计划把Adafruit_SSD1306移植到STM32平台上,于是便产生了如下的开源项目

项目代码结构

  • Adafruit_SSD1306_STM32.h SSD1306 OLED库的头文件
  • Adafruit_SSD1306_STM32.C SSD1306 OLED库的代码文件
  • Fonts.h 支持字库的头文件
  • Fonts.C 支持字库的代码文件

项目开发进展

  • 移植了绝大多数函数
  • 采用I2C协议
  • 128*64 尺寸在STM32G0 中测试

未来开发计划

  • 增加更多控件和独特的功能
  • 增加对SPI协议的支持
  • 在更多芯片中进行测试以及测试不同尺寸的屏幕

未来的开发计划也需要广大读者的支持,测试及反馈

使用说明

添加引用

把Github项目中的代码拉下来储存在项目文件夹中,并在STM32CubeIDE中添加对库文件的引用

添加引用

修改头文件

修改头文件

#include "stm32g0xx_hal.h" 修改成开发者自己芯片类型的头文件

#include "sw_i2c.h" 如果采用软件I2C的话可以引用,代码在如下位置,采用硬件I2C的话请注释此行

软件I2C代码

#define SSD1306_I2C_ADDR 0x78 配置I2C地址,修改成自己屏幕的地址

#define SSD1306_WIDTH 128 配置屏幕的宽度,默认是128

#define SSD1306_HEIGHT 64 配置屏幕的高度,默认是64

实现自定义代码

在"Adafruit_SSD1306_STM32.c"中实现如下四个函数,示例中采用了软件I2C(因为笔者OLED屏幕连线的GPIO口不具备硬件I2C功能),如果采用硬件I2C的话可以使用注释掉的语句

void SSD1306_I2C_WriteMultiConstByte(uint8_t address, uint8_t reg, const uint8_t* data, uint16_t count) {
uint8_t data_send[255];
data_send[0] = reg;
for(uint8_t i = 0; i < count; i++){
data_send[i+1] = data[i];
}
//HAL_I2C_Master_Transmit(&hi2c1, address, dt, count+1, 10);
SW_I2C_Write_8addr(1, address, data_send[0], &data_send[1], count);
}
void SSD1306_I2C_WriteMultiByte(uint8_t address, uint8_t reg, uint8_t* data, uint16_t count) {
SW_I2C_Write_8addr(1, address, reg, data, count);
}

void SSD1306_I2C_WriteByte(uint8_t address, uint8_t reg, uint8_t data) {
uint8_t data_send[2];
data_send[0] = reg;
data_send[1] = data;
SW_I2C_Write_8addr(1, address, data_send[0], &data_send[1], 1);
//HAL_I2C_Master_Transmit(&hi2c1, address, dt, 2, 10);
}
uint8_t SSD1306_checkDevice(uint8_t address){ //判断是否查找到屏幕的地址
return SW_I2C_Check_SlaveAddr(1,SSD1306_I2C_ADDR);
}

<< · Back Index ·>>

发表回复

相关推荐

【零基础语法】九大词性-介词

Weoftendoourhomeworkafterschool. 我们经常在放学后做家庭作业。(表示时间) Iusuallygotoschoolatseveninthemorning. 我通 ...

· 3分钟前

我的胸部,為何一大一小?

專註生殖科學,解析兩性秘密,歡迎關註“春路花語”微信公眾號。女性的兩邊乳房幾乎不是絕對的對稱,一般都會一側稍大,一側稍...

· 4分钟前

哈嘍!樹先生

我想可能大多數人都沒有意識到這是一部電影的名字。《哈嘍!樹先生》應該是王寶強主演過的知名度最低的電影瞭。但是從這部電...

· 5分钟前

英語詞匯:表示“致死的”、“致命的”的形容詞

英語詞匯 表示“致死的”、“致命的”的形容詞嘉中deadly 、fatal、lethal、mortal 這組形容詞都可表示“致死的”、“致命的”意思。d...

· 8分钟前

2021八省联考数学试卷及答案和分析

本次八省联考数学试卷 整体难度值与高考难度值相差不大(距离高考还有134天) 但是本次考试的题目新颖度方面有较大的提升 ...

· 9分钟前