要想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
+關注
關注
2287文章
10988瀏覽量
361588 -
u8g2
+關注
關注
0文章
18瀏覽量
2062
發布評論請先 登錄
STM32U5+8bit_8080 LCD怎么配置touchgfx?
STM32U5+8bit_8080 LCD怎么配置touchgfx?
使用STM32G031G6U6控制繼電器,PA8無法輸出高低電平的原因?
關于stm32,u8g2菜單之間切換(三)用u8g2寫一個菜單無限左右循環
關于stm32,u8g2菜單之間切換(二)u8g2的移植

深入了解U8g2與LVGL圖形庫
比亞迪仰望U8迎來重磅OTA升級
51單片機STC8H8K64U通過RA8889/RA8876如何控制彩屏 I2C源碼下載

課程上線 | STM32單片機入門教程(1)基于HAL庫的多核心開發(F1/F4/G0/U5)

評論