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

描述

要想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

 

划线的地方是需要根据我们自己对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);
}

 

审核编辑 黄宇

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分