这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 【Let'sdo2025年第1期】功率监测与控制系统DIY活动基础任务——OLE

共1条 1/1 1 跳转至

【Let'sdo2025年第1期】功率监测与控制系统DIY活动基础任务——OLED屏幕显示信息

高工
2025-06-14 08:49:29     打赏

活动配套的模块中有一个SSD1315的OLED屏幕,
https://wiki.seeedstudio.com/Grove-OLED-Display-0.96-SSD1315/

# u8g2移植简述
在SeeedStudio官方的使用手中,在Arduino平台上使用u8g2图形库来驱动OLED屏幕。u8g2代码中有C语言的驱动代码,用户只需要实现u8g2的接口函数,即可使用u8g2的功能来驱动OLED屏幕。

u8g2_port_0.png

u8g2_port_1.png


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

u8g2_GPIO_delay_template.png

u8g2_Communication_template.png


# 移植u8g2

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

F411_I2C1_Settings.png

在工程的Drivers文件夹中,添加u8g2源码中的csrc文件夹中的源码文件
u8g2 C code.png
在工程配置中添加源码的路径信息。
project_file_path.png

在代码中,根据模板代码,实现以下两个接口函数。

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)设备的初始化函数,这里使用该函数是可以点亮屏幕的,使用其他的则有问题。
u8g2_ssd1315_setup_select.pngOLED的屏幕显示效果如下。
3V_Info.png

# 总结

移植现有的u8g2图形库,完成需要的回调函数,在OLED屏幕上显示信息还是很方便的,可以很快地使用外设,便于在不同平台之间使用。




关键词: Let do 2025     OLED     u8g2    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]