要想stm應用u8g2繪制界面需要對u8g2原函數(shù)
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)里面后兩個參數(shù)實現(xiàn)函數(shù)。
因為使用的軟件實現(xiàn)i2c,所以u8x8_msg_cb byte_cb這個參數(shù)直接使用自帶的u8x8_byte_sw_i2c即可,我們只要實現(xiàn)u8x8_msg_cb gpio_and_delay_cb這個參數(shù)寫一個函數(shù):
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;
}

劃線的地方是需要根據(jù)我們自己對stm32 io口配置和us、ms延時函數(shù)自己需要修改的。實現(xiàn)后寫入函數(shù)參數(shù):
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函數(shù) u8g2_SetPowerSave(&u8g2, 0); //wake up 屏幕 // 初始化u8x8_byte_hw_i2c函數(shù) u8g2_ClearBuffer(&u8g2); //清除緩存區(qū) 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); }
審核編輯 黃宇
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報投訴
-
STM32
+關注
關注
2312文章
11189瀏覽量
374526 -
u8g2
+關注
關注
0文章
18瀏覽量
2403
發(fā)布評論請先 登錄
相關推薦
熱點推薦
ATmega8U2/16U2/32U2微控制器:高性能與低功耗的完美結合
ATmega8U2/16U2/32U2微控制器:高性能與低功耗的完美結合 在電子設計領域,一款優(yōu)秀的微控制器往往能為項目帶來事半功倍的效果。ATmega
【RA-Eco-RA4M2開發(fā)板評測】+ 開發(fā)環(huán)境搭建及外設初體驗
_t msg, uint8_t arg_int, void *arg_ptr);
void u8g2Init(u8g2_t *u8g2)
{
//初始化
發(fā)表于 03-30 23:15
深入解析BGSX24M2U16:適用于LTE與5G的DP4T天線交叉開關
深入解析BGSX24M2U16:適用于LTE與5G的DP4T天線交叉開關 在當今的通信領域,LTE和5G技術的飛速發(fā)展對射頻前端設備提出了更高的要求。BGSX24M2U16作為
【新品】8盤位PCIe5.0 U.2/U.3 NVMe 轉 雙5.25光驅位硬盤抽取盒
和媒體工作站設計。通過4個MCIO8i(SFF-TA-1016)接口,最多可支持8塊5-15mm厚的U.2/U.3NVMeSSD,每塊SSD均可提供PCIeGen5x
?STM32 Nucleo-U385RG-Q開發(fā)板技術解析與應用指南?
STMicroelectronics NUCLEO-U385RG-Q開發(fā)板(帶STM32U3 MCU)是一款多功能、全面的評估平臺,設計用于讓開發(fā)人員使用STM32U385RGT6Q微
RA-Eco-RA6M4部分功能測評3
C的SCL/SDA切換)和延時功能(滿足通信時序要求);
通信接口回調函數(shù):負責實現(xiàn)I2C/SPI等物理層通信,完成數(shù)據(jù)向OLED控制器的傳輸。
這兩類函數(shù)需遵循
發(fā)表于 09-05 20:47
【RA-Eco-RA6M4開發(fā)板評測】2、I2C外設驅動OLED屏幕和移植u8g2
ssd1306(兼容ssd1315)設備的初始化函數(shù),這里使用該函數(shù)是可以點亮屏幕的,使用其他的則有問題。
OLED的屏幕顯示效果如下。
總結
移植現(xiàn)有的u8g2圖形庫,完成需要的回調函數(shù)
發(fā)表于 07-23 13:51
基于極海APM32F411 MCU移植U8g2驅動OLED指南
基于Arm Cortex-M4F內(nèi)核,工作主頻120MHz,具有高速運算能力、多種工作模式、以及豐富的高精度外設和通訊接口;內(nèi)置CRC32運算單元,可為用戶提供高集成度、高可靠性的SoC方案;作為APM32F4系列MCU的超值型拓展產(chǎn)品,能很好的滿足用戶對功耗、性能、性價比方面的產(chǎn)品均衡需求,可適用于電力,儀器儀表,工控,家電,物聯(lián)網(wǎng),新能源,智慧樓宇等廣泛的應用領域。
零知開源——STM32F4結合BMP581氣壓傳感器實現(xiàn)ST7789中文顯示教程
傳感器數(shù)據(jù)采集。通過U8g2庫實現(xiàn)高質量中文渲染,混合Adafruit_GFX進行高效數(shù)據(jù)顯示,實時展示溫度、壓力和高度數(shù)據(jù)。教程詳細介紹了硬件連接方案(I2C/SPI接口)、軟件架構設計(包含庫依賴關系和數(shù)據(jù)讀取機制)以及中文文本渲染方法。
零知開源——STM32F4結合BMP581氣壓傳感器實現(xiàn)ST7789中文顯示教程
;gt;使用U8g2庫實現(xiàn)高質量中文渲染
>混合使用Adafruit_GFX和U8g2實現(xiàn)高效顯示
>實時顯示溫度、壓力和高度數(shù)據(jù)
>針對STM32F4系列優(yōu)化
發(fā)表于 07-08 18:55
STM32U5+8bit_8080 LCD 怎么配置touchgfx?
我參與的項目使用STM32U575做為主空,使用fmc來驅動8080接口的8bitLCD,配置touchgfx時不能配置為8bit,其他選型例如DMA2D也使用不了,我該怎么做?
發(fā)表于 06-09 06:23
零知開源——STM32F1驅動MAX31865讀取三線PT100溫度傳感器
邏輯
setup()函數(shù),
初始化串口、OLED和MAX31865,設置三線制模式:?void setup() {
Serial.begin(115200);
u8g2.begin(); // 啟動OLED
發(fā)表于 05-23 18:27
求一份CS32G020K8U6的keil的chipsea.CS32G02x_DFP.pack安裝包,謝謝
用CS32G020K8U6開發(fā)充電寶方案,工作交接導致keil相關的pack缺失,麻煩哪位好心人給我發(fā)一份到郵箱694306192@qq.com,謝謝啦
發(fā)表于 05-21 11:30
STM32U5+8bit_8080 LCD怎么配置touchgfx?
我參與的項目使用STM32U575做為主空,使用fmc來驅動8080接口的8bitLCD,配置touchgfx時不能配置為8bit,其他選型例如DMA2D也使用不了,我該怎么做?
發(fā)表于 04-28 08:12
STM32U5+8bit_8080 LCD怎么配置touchgfx?
我參與的項目使用STM32U575做為主空,使用fmc來驅動8080接口的8bitLCD,配置touchgfx時不能配置為8bit,其他選型例如DMA2D也使用不了,我該怎么做?
發(fā)表于 04-27 07:11
關于stm32,u8g2菜單之間切換(三)寫u8g2的一些必要函數(shù)
評論