要想stm应用u8g2绘制界面需要对u8g2原函数
u8g2_Setup_ssd1306_i2c_128x128_f(u8g2_t *u8g2, const u8g2_cb_t *rotation, u8x8_msg_cb byte_cb, u8x8_msg_cb gpio_and_delay_cb)里面后两个参数实现函数。
因为使用的软件实现i2c,所以u8x8_msg_cb byte_cb这个参数直接使用自带的u8x8_byte_sw_i2c即可,我们只要实现u8x8_msg_cb gpio_and_delay_cb这个参数写一个函数:
uint8_t u8x8_gpio_and_delay(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
{
switch (msg)
{
case U8X8_MSG_DELAY_100NANO: // delay arg_int * 100 nano seconds
__NOP();
break;
case U8X8_MSG_DELAY_10MICRO: // delay arg_int * 10 micro seconds
for (uint16_t n = 0; n < 320; n++)
{
__NOP();
}
break;
case U8X8_MSG_DELAY_MILLI: // delay arg_int * 1 milli second
HAL_Delay(1);
break;
case U8X8_MSG_DELAY_I2C: // arg_int is the I2C speed in 100KHz, e.g. 4 = 400 KHz
Tims_delay_us(5);
break; // arg_int=1: delay by 5us, arg_int = 4: delay by 1.25us
case U8X8_MSG_GPIO_I2C_CLOCK: // arg_int=0: Output low at I2C clock pin
if(arg_int==1)
{
HAL_GPIO_WritePin(OLEDSCK_GPIO_Port,OLEDSCK_Pin,GPIO_PIN_SET);
}
else
if(arg_int==0)
{HAL_GPIO_WritePin(OLEDSCK_GPIO_Port,OLEDSCK_Pin,GPIO_PIN_RESET);}
break; // arg_int=1: Input dir with pullup high for I2C clock pin
case U8X8_MSG_GPIO_I2C_DATA: // arg_int=0: Output low at I2C data pin
if(arg_int==1)
{
HAL_GPIO_WritePin(OLEDSDA_GPIO_Port,OLEDSDA_Pin,GPIO_PIN_SET);
}
else
if(arg_int==0)
{HAL_GPIO_WritePin(OLEDSDA_GPIO_Port,OLEDSDA_Pin,GPIO_PIN_RESET);}
break; // arg_int=1: Input dir with pullup high for I2C data pin
case U8X8_MSG_GPIO_MENU_SELECT:
u8x8_SetGPIOResult(u8x8, /* get menu select pin state */ 0);
break;
case U8X8_MSG_GPIO_MENU_NEXT:
u8x8_SetGPIOResult(u8x8, /* get menu next pin state */ 0);
break;
case U8X8_MSG_GPIO_MENU_PREV:
u8x8_SetGPIOResult(u8x8, /* get menu prev pin state */ 0);
break;
case U8X8_MSG_GPIO_MENU_HOME:
u8x8_SetGPIOResult(u8x8, /* get menu home pin state */ 0);
break;
default:
u8x8_SetGPIOResult(u8x8, 1); // default return value
break;
}
return 1;
}

划线的地方是需要根据我们自己对stm32 io口配置和us、ms延时函数自己需要修改的。实现后写入函数参数:
u8g2_Setup_ssd1306_i2c_128x128_f(&u8g2, U8G2_R0, u8x8_byte_sw_i2c, u8x8_gpio_and_delay);
接下来就可以测试下:
#include"u8g2.h" #include"u8x8.h" #include"TimeDelay.h" #include"icon.h" #include "ui.h" {……..} u8g2_Setup_ssd1306_i2c_128x128_f(&u8g2, U8G2_R0, u8x8_byte_sw_i2c, u8x8_gpio_and_delay); // 初始化u8g2 结构体 u8g2_InitDisplay(&u8g2); //对缓存进行初始化 // 初始化u8x8_gpio_and_delay函数 u8g2_SetPowerSave(&u8g2, 0); //wake up 屏幕 // 初始化u8x8_byte_hw_i2c函数 u8g2_ClearBuffer(&u8g2); //清除缓存区 HAL_Delay(1); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { u8g2_DrawLine(&u8g2, -16,-16, 127, 127); u8g2_DrawLine(&u8g2, 0,50, 100, 50); u8g2_DrawLine(&u8g2, 0,0, 0,100); u8g2_SetFont(&u8g2,u8g2_font_helvR08_tr); u8g2_DrawButtonUTF8(&u8g2,4, 20, U8G2_BTN_BW2, 0, 2, 2, "Btn" ); u8g2_SetFont(&u8g2,u8g2_font_ncenB14_tr); u8g2_DrawStr(&u8g2,0,45,"Hello World!"); u8g2_SendBuffer(&u8g2); u8g2_ClearBuffer(&u8g2); }
审核编辑 黄宇
-
STM32
+关注
关注
2305文章
11122浏览量
371200 -
u8g2
+关注
关注
0文章
18浏览量
2275
发布评论请先 登录
RA-Eco-RA6M4部分功能测评3
【RA-Eco-RA6M4开发板评测】2、I2C外设驱动OLED屏幕和移植u8g2
基于极海APM32F411 MCU移植U8g2驱动OLED指南
零知开源——STM32F4结合BMP581气压传感器实现ST7789中文显示教程
零知开源——STM32F4结合BMP581气压传感器实现ST7789中文显示教程
STM32U5+8bit_8080 LCD 怎么配置touchgfx?
零知开源——STM32F1驱动MAX31865读取三线PT100温度传感器
求一份CS32G020K8U6的keil的chipsea.CS32G02x_DFP.pack安装包,谢谢
STM32U5+8bit_8080 LCD怎么配置touchgfx?
使用STM32G031G6U6控制继电器,PA8无法输出高低电平的原因?
关于stm32,u8g2菜单之间切换(三)用u8g2写一个菜单无限左右循环
关于stm32,u8g2菜单之间切换(二)u8g2的移植

关于stm32,u8g2菜单之间切换(三)写u8g2的一些必要函数
评论