活动配套的模块中有一个SSD1315的OLED屏幕,
https://wiki.seeedstudio.com/Grove-OLED-Display-0.96-SSD1315/
# u8g2移植简述
在SeeedStudio官方的使用手中,在Arduino平台上使用u8g2图形库来驱动OLED屏幕。u8g2代码中有C语言的驱动代码,用户只需要实现u8g2的接口函数,即可使用u8g2的功能来驱动OLED屏幕。


如手册中描述的,移植需要完成两个具体的回调函数,功能为:
- 与控制器相关的GPIO控制以及Delay的回调函数实现;- 与通讯接口(比如I2C、SPI)相关的数据传输回调函数。
这两个函数的实现在u8g2 Wiki手册中可以找到相关的代码实现模板。


# 移植u8g2
在CubeMX中设置开发板的I2C1接口做用驱动OLED屏幕的接口。

在工程的Drivers文件夹中,添加u8g2源码中的csrc文件夹中的源码文件
在工程配置中添加源码的路径信息。
在代码中,根据模板代码,实现以下两个接口函数。
uint8_t u8x8_gpio_and_delay(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
{
switch(msg)
{
case U8X8_MSG_GPIO_AND_DELAY_INIT:
HAL_Delay(1);
break;
case U8X8_MSG_DELAY_MILLI:
HAL_Delay(arg_int);
break;
}
return 1;
}
uint8_t u8x8_i2c(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
{
static uint8_t buffer[32]; /* u8g2/u8x8 will never send more than 32 bytes between START_TRANSFER and END_TRANSFER */
static uint8_t buf_idx;
uint8_t *data;
switch(msg)
{
case U8X8_MSG_BYTE_SEND:
data = (uint8_t *)arg_ptr;
while( arg_int > 0 )
{
buffer[buf_idx++] = *data;
data++;
arg_int--;
}
break;
case U8X8_MSG_BYTE_INIT:
/* add your custom code to init i2c subsystem */
break;
case U8X8_MSG_BYTE_SET_DC:
/* ignored for i2c */
break;
case U8X8_MSG_BYTE_START_TRANSFER:
buf_idx = 0;
break;
case U8X8_MSG_BYTE_END_TRANSFER:
HAL_I2C_Master_Transmit(&hi2c1,0x78,buffer,buf_idx,1000);
break;
default:
return 0;
}
return 1;
}
在代码中添加以下代码来调用u8g2的函数来驱动OLED屏幕
#include "u8g2.h"
u8g2_t myDisplay;
int main(void)
{
u8g2_Setup_ssd1306_i2c_128x64_vcomh0_f(&myDisplay,U8G2_R0,u8x8_i2c,u8x8_gpio_and_delay);
u8g2_InitDisplay(&myDisplay);
u8g2_SetPowerSave(&myDisplay,0);
u8g2_ClearDisplay(&myDisplay);
u8g2_SetFont(&myDisplay,u8g2_font_wqy16_t_gb2312);
u8g2_DrawUTF8(&myDisplay,0,16,"EEPW DIY活动");
u8g2_DrawUTF8(&myDisplay,0,32,"2025第一季");
u8g2_DrawUTF8(&myDisplay,0,48,"任务二:");
u8g2_DrawUTF8(&myDisplay,0,64,"功率监测和显示");
u8g2_SendBuffer(&myDisplay);
}完成上述代码的添加后,就可以在OLED屏幕上看到显示的文字信息。值得一提的是,在u8g2_d_setup.c中由很多针对ssd1306(兼容ssd1315)设备的初始化函数,这里使用该函数是可以点亮屏幕的,使用其他的则有问题。
OLED的屏幕显示效果如下。
# 总结
移植现有的u8g2图形库,完成需要的回调函数,在OLED屏幕上显示信息还是很方便的,可以很快地使用外设,便于在不同平台之间使用。
我要赚赏金
