0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

stm32嵌入式应用学习 来源:stm32嵌入式应用学习 作者:stm32嵌入式应用学 2025-03-07 12:53 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

要想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;
}
wKgZPGfKekaALLi7AABuU-SQPTs776.png

划线的地方是需要根据我们自己对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
    +关注

    关注

    2313

    文章

    11189

    浏览量

    374571
  • u8g2
    +关注

    关注

    0

    文章

    18

    浏览量

    2405
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    ATmega8U2/16U2/32U2微控制器:高性能与低功耗的完美结合

    ATmega8U2/16U2/32U2微控制器:高性能与低功耗的完美结合 在电子设计领域,款优秀的微控制器往往能为项目带来事半功倍的效果。ATmega
    的头像 发表于 04-06 13:50 625次阅读

    【RA-Eco-RA4M2开发板评测】+ 开发环境搭建及外设初体验

    _t msg, uint8_t arg_int, void *arg_ptr); void u8g2Init(u8g2_t *u8g2) { //初始化
    发表于 03-30 23:15

    深入解析BGSX24M2U16:适用于LTE与5G的DP4T天线交叉开关

    深入解析BGSX24M2U16:适用于LTE与5G的DP4T天线交叉开关 在当今的通信领域,LTE和5G技术的飞速发展对射频前端设备提出了更高的要求。BGSX24M2U16作为
    的头像 发表于 12-19 16:40 1024次阅读

    【新品】8盘位PCIe5.0 U.2/U.3 NVMe 转 双5.25光驱位硬盘抽取盒

    和媒体工作站设计。通过4个MCIO8i(SFF-TA-1016)接口,最多可支持8块5-15mm厚的U.2/U.3NVMeSSD,每块SSD均可提供PCIeGen5x
    的头像 发表于 12-19 15:19 729次阅读
    【新品】<b class='flag-5'>8</b>盘位PCIe5.0 <b class='flag-5'>U.2</b>/<b class='flag-5'>U</b>.3 NVMe 转 双5.25光驱位硬盘抽取盒

    STM32 Nucleo-U385RG-Q开发板技术解析与应用指南‌

    STMicroelectronics NUCLEO-U385RG-Q开发板(带STM32U3 MCU)是款多功能、全面的评估平台,设计用于让开发人员使用STM32U385RGT6Q微
    的头像 发表于 10-16 14:46 1033次阅读
    ‌<b class='flag-5'>STM32</b> Nucleo-<b class='flag-5'>U</b>385RG-Q开发板技术解析与应用指南‌

    RA-Eco-RA6M4部分功能测评3

    C的SCL/SDA切换)和延时功能(满足通信时序要求); 通信接口回调函数:负责实现I2C/SPI等物理层通信,完成数据向OLED控制器的传输。 这两类函数需遵循
    发表于 09-05 20:47

    【RA-Eco-RA6M4开发板评测】2、I2C外设驱动OLED屏幕和移植u8g2

    ssd1306(兼容ssd1315)设备的初始化函数,这里使用该函数是可以点亮屏幕的,使用其他的则有问题。 OLED的屏幕显示效果如下。 总结 移植现有的u8g2图形库,完成需要的回调函数
    发表于 07-23 13:51

    基于极海APM32F411 MCU移植U8g2驱动OLED指南

    基于Arm Cortex-M4F内核,工作主频120MHz,具有高速运算能力、多种工作模式、以及丰富的高精度外设和通讯接口;内置CRC32运算单元,可为用户提供高集成度、高可靠性的SoC方案;作为APM32F4系列MCU的超值型拓展产品,能很好的满足用户对功耗、性能、性价比方面的产品均衡需求,可适用于电力,仪器仪表,工控,家电,物联网,新能源,智慧楼宇等广泛的应用领域。
    的头像 发表于 07-17 14:45 3412次阅读
    基于极海APM32F411 MCU移植<b class='flag-5'>U8g2</b>驱动OLED指南

    零知开源——STM32F4结合BMP581气压传感器实现ST7789中文显示教程

    传感器数据采集。通过U8g2库实现高质量中文渲染,混合Adafruit_GFX进行高效数据显示,实时展示温度、压力和高度数据。教程详细介绍了硬件连接方案(I2C/SPI接口)、软件架构设计(包含库依赖关系和数据读取机制)以及中文文本渲染方法。
    的头像 发表于 07-09 09:21 2209次阅读
    零知开源——<b class='flag-5'>STM32</b>F4结合BMP581气压传感器实现ST7789中文显示教程

    零知开源——STM32F4结合BMP581气压传感器实现ST7789中文显示教程

    ;gt;使用U8g2库实现高质量中文渲染 >混合使用Adafruit_GFX和U8g2实现高效显示 >实时显示温度、压力和高度数据 >针对STM32F4系列优化
    发表于 07-08 18:55

    STM32U5+8bit_8080 LCD 怎么配置touchgfx?

    我参与的项目使用STM32U575做为主空,使用fmc来驱动8080接口的8bitLCD,配置touchgfx时不能配置为8bit,其他选型例如DMA2D也使用不了,我该怎么做?
    发表于 06-09 06:23

    零知开源——STM32F1驱动MAX31865读取线PT100温度传感器

    逻辑 setup()函数, 初始化串口、OLED和MAX31865,设置线制模式:​void setup() { Serial.begin(115200); u8g2.begin(); // 启动OLED
    发表于 05-23 18:27

    份CS32G020K8U6的keil的chipsea.CS32G02x_DFP.pack安装包,谢谢

    用CS32G020K8U6开发充电宝方案,工作交接导致keil相关的pack缺失,麻烦哪位好心人给我发份到邮箱694306192@qq.com,谢谢啦
    发表于 05-21 11:30

    STM32U5+8bit_8080 LCD怎么配置touchgfx?

    我参与的项目使用STM32U575做为主空,使用fmc来驱动8080接口的8bitLCD,配置touchgfx时不能配置为8bit,其他选型例如DMA2D也使用不了,我该怎么做?
    发表于 04-28 08:12

    STM32U5+8bit_8080 LCD怎么配置touchgfx?

    我参与的项目使用STM32U575做为主空,使用fmc来驱动8080接口的8bitLCD,配置touchgfx时不能配置为8bit,其他选型例如DMA2D也使用不了,我该怎么做?
    发表于 04-27 07:11