活动配套的模块中有一个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屏幕上显示信息还是很方便的,可以很快地使用外设,便于在不同平台之间使用。