【NUCLEO-C562RE】OLED 显示
本文介绍了 NUCLEO-C562RE 开发板驱动 OLED 显示的项目设计,包括硬件连接、环境搭建、工程测试等流程。
项目介绍
NUCLEO-C562RE 开发板驱动 OLED 显示。
- 准备工作:硬件连接、环境搭建;
- 工程测试:工程创建、工程配置、工程代码、编译上传、效果演示。
硬件连接
根据原理图,选择 PA11 和 PA12 作为 I2C2 的通信引脚。

接线方式如下
| STM32C562RET6 |
OLED |
| PA11 (SCL) |
SCL |
| PA12 (SDA) |
SDA |
| GND |
GND |
| 3V3 |
VCC |
实物图

工程配置
-
打开 STM32CubeMX2 软件,从开发板新建工程;

-
点击左侧工具栏 Open Peripherals 按钮,展开 Connectivity ,使能 I2C2,标准速率 100kHz,7 位地址 0x3c ;

-
SCL 和 SDA 引脚分别配置为 PA11、PA12 均设置为上拉输出模式;

-
保存配置,生成 CMake工程;
驱动代码
包括 OLED 驱动的头文件和源文件,字库和图片文件等。
ssd1306.h
新建 OLED 驱动头文件,添加如下代码
#ifndef __SSD1306_H
#define __SSD1306_H
#ifdef __cplusplus
extern "C" {
#endif
#include <stdint.h>
void WriteCmd(void);
void SSD1306_WR_CMD(uint8_t cmd);
void SSD1306_WR_DATA(uint8_t data);
void SSD1306_Init(void);
void SSD1306_Clear(void);
void SSD1306_Display_On(void);
void SSD1306_Display_Off(void);
void SSD1306_Set_Pos(uint8_t x, uint8_t y);
void SSD1306_On(void);
void SSD1306_ShowNum(uint8_t x,uint8_t y,unsigned int num,uint8_t len,uint8_t size2, uint8_t Color_Turn);
void SSD1306_ShowDecimal(uint8_t x,uint8_t y,float num,uint8_t z_len,uint8_t f_len,uint8_t size2, uint8_t Color_Turn);
void SSD1306_ShowChar(uint8_t x,uint8_t y,uint8_t chr,uint8_t Char_Size, uint8_t Color_Turn);
void SSD1306_ShowString(uint8_t x,uint8_t y,const char *chr,uint8_t Char_Size, uint8_t Color_Turn);
void SSD1306_ShowCHinese(uint8_t x,uint8_t y,uint8_t no, uint8_t Color_Turn);
void SSD1306_DrawBMP(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint8_t * BMP,uint8_t Color_Turn);
void SSD1306_DrawGIF(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint8_t k, int m, unsigned char GIF[][m]);
void SSD1306_HorizontalShift(uint8_t direction);
void SSD1306_Some_HorizontalShift(uint8_t direction,uint8_t start,uint8_t end);
void SSD1306_VerticalAndHorizontalShift(uint8_t direction);
void SSD1306_DisplayMode(uint8_t mode);
void SSD1306_IntensityControl(uint8_t intensity);
void SSD1306_ClearLinePart(uint8_t line, uint8_t start, uint8_t end);
#ifdef __cplusplus
}
#endif
#endif /* __SSD1306_H */
保存代码。
ssd1306.c
新建 OLED 驱动源文件,添加如下代码
#include "ssd1306.h"
#include "main.h"
#include "mx_i2c2.h"
#include "oledfont.h"
void WriteCmd(void)
{
uint8_t i = 0;
for(i=0; i<27; i++)
{
HAL_I2C_MASTER_MemWrite(mx_i2c2_i2c_gethandle(), 0x78, 0x00,
HAL_I2C_MEM_ADDR_8BIT, CMD_Data + i, 1, 100);
}
}
/**
* @function: void SSD1306_WR_CMD(uint8_t cmd)
* @description: 向设备写控制命令
* @param {uint8_t} cmd 芯片手册规定的命令
* @return {*}
*/
void SSD1306_WR_CMD(uint8_t cmd)
{
HAL_I2C_MASTER_MemWrite(mx_i2c2_i2c_gethandle(), 0x78, 0x00,
HAL_I2C_MEM_ADDR_8BIT, &cmd, 1, 100);
}
/**
* @function: void SSD1306_WR_DATA(uint8_t data)
* @description: 向设备写控制数据
* @param {uint8_t} data 数据
* @return {*}
*/
void SSD1306_WR_DATA(uint8_t data)
{
HAL_I2C_MASTER_MemWrite(mx_i2c2_i2c_gethandle(), 0x78, 0x40,
HAL_I2C_MEM_ADDR_8BIT, &data, 1, 100);
}
oledfont.h
新建 OLED 驱动的字体头文件,添加如下代码
#ifndef __OLEDFONT_H
#define __OLEDFONT_H
#include <stdint.h>
//8*6 ASCII字符集点阵 static const uint8_t Font6x8[][6] = {};
const unsigned char F6x8[][6] =
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,// sp
0x00, 0x00, 0x00, 0x2f, 0x00, 0x00,// !
0x00, 0x00, 0x07, 0x00, 0x07, 0x00,// "
// …… ……
0x00, 0x44, 0x64, 0x54, 0x4C, 0x44,// z
0x14, 0x14, 0x14, 0x14, 0x14, 0x14,// horiz lines
};
//16*8 ASCII字符集点阵 static const uint8_t Font8x16[][16]={};
const unsigned char Font8x16[]=
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//sp /0
0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00,//! /1
// …… ……
0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x1F,0x01,0x01,0x01,0x00,//+
0x00,0x00,0x80,0x80,0x00,0x00,0x80,0x00,0x00,0x01,0x00,0x00,0x01,0x01,0x00,0x00 // ~ /94
};
const unsigned char Hzk[][32]=
{
// 加(0) 速(1) 度(2) 计(3) 俯(4) 仰(5) 翻(6) 横(7) 滚(8) 偏(9) 航(10) 向(11) 角(12)
{0x10,0x10,0x10,0xFF,0x10,0x10,0xF0,0x00,0x00,0xF8,0x08,0x08,0x08,0xF8,0x00,0x00},
{0x80,0x40,0x30,0x0F,0x40,0x80,0x7F,0x00,0x00,0x7F,0x20,0x20,0x20,0x7F,0x00,0x00},/*"加",0*/
{0x40,0x40,0x42,0xCC,0x00,0x04,0xF4,0x94,0x94,0xFF,0x94,0x94,0xF4,0x04,0x00,0x00},
{0x00,0x40,0x20,0x1F,0x20,0x48,0x44,0x42,0x41,0x5F,0x41,0x42,0x44,0x48,0x40,0x00},/*"速",1*/
/* (16 X 16 , 宋体 )*/
};
#endif
字符在线取模:在线文字取模工具 .
bmp.h
新建 OLED 驱动的图片头文件,添加如下代码
#ifndef BMP_H_
#define BMP_H_
const unsigned char BMP1[] =
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
// …… ……
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
#endif /* BMP_H_ */
保存代码。
主函数
修改主函数 main.c 文件,关键代码如下
#include "main.h"
#include "ssd1306.h"
#include "bmp.h"
int main(void)
{
if (mx_system_init() != SYSTEM_OK){
return (-1);
}
else{
/* 初始化 OLED */
SSD1306_Init();
/* 清屏并显示 */
SSD1306_Clear();
SSD1306_ShowString(25, 0, "OLED TEST", 16, 1);
SSD1306_ShowString(0, 2, "6x8 Font~", 12, 0);
SSD1306_ShowString(0, 3, "8x16 Font~", 16, 0);
SSD1306_ShowNum(0, 5, 1234567890, 10, 16, 0);
HAL_Delay(1000);
/* 图片显示 */
SSD1306_DrawBMP(0, 0, 128, 8, BMP1, 0);
HAL_Delay(1000);
/* 显示汉字 */
SSD1306_Clear();
SSD1306_ShowString(0,0,"DIY",16,1);
SSD1306_ShowCHinese(24,0,0,1); //
SSD1306_ShowCHinese(39,0,1,1); //
while (1) {}
}
} /* end main */
保存代码。
效果演示
编译固件,运行工程;
OLED 显示文字、数字、图片等;

总结
本文介绍了 NUCLEO-C562RE 开发板驱动 OLED 显示的项目设计,包括硬件连接、环境搭建、工程测试等流程,为相关产品的快速开发和应用设计提供了参考。