当前位置: 首页 > news >正文

【Mini-F5265-OB开发板试用测评】2、移植MultiButton测试按键

移植开源MultiButton来测试按键的几种操作状态。

一、硬件部分

开发板上的按键部分电路图
在这里插入图片描述

KEY1和KEY2按键使用了PB0和PB1端口。

二、MultiButton
MultiButton 是一个小巧简单易用的事件驱动型按键驱动模块,可无限量扩展按键,按键事件的回调异步处理方式可以简化你的程序结构,去除冗余的按键处理硬编码,让你的按键业务逻辑更清晰。

下载地址:
https://github.com/0x1abin/MultiButton

按照例程移植程序,即可实现按键的操作。

三、程序部分

3.1、key.c

#include "main.h"uint8_t button_tick_cnt=0;enum Button_IDs 
{btn1_id,btn2_id,
};struct Button btn1;
struct Button btn2;uint8_t read_button_gpio(uint8_t button_id)
{switch(button_id){case btn1_id:return GPIO_ReadInputDataBit(KEY1_GPIO_PORT, KEY1_PIN);case btn2_id:return GPIO_ReadInputDataBit(KEY2_GPIO_PORT, KEY2_PIN);default:return 0;}
}//BTN1
void BTN1_PRESS_DOWN_Handler(void* btn)
{printf("KEY1 DOWN! \r\n");
}void BTN1_PRESS_UP_Handler(void* btn)
{printf("KEY1 UP! \r\n");
}void BTN1_PRESS_REPEAT_Handler(void* btn)
{printf("KEY1 PRESS_REPEAT! \r\n");
}void BTN1_SINGLE_Click_Handler(void* btn)
{printf("KEY1 SINGLE_ClICK! \r\n");
}//void BTN2_DOUBLE_Click_Handler(void* btn)
//{
//	printf("KEY2 DOUBLE_ClICK! \r\n");
//}void BTN1_LONG_PRESS_START_Handler(void* btn)
{printf("KEY1 LONG_PRESS_START! \r\n");
}void BTN1_LONG_PRESS_HOLD_Handler(void* btn)
{printf("KEY1 LONG_PRESS_HOLD! \r\n");
}//BTN2
void BTN2_PRESS_DOWN_Handler(void* btn)
{printf("KEY2 DOWN! \r\n");
}void BTN2_PRESS_UP_Handler(void* btn)
{printf("KEY2 UP! \r\n");
}void BTN2_PRESS_REPEAT_Handler(void* btn)
{printf("KEY2 PRESS_REPEAT! \r\n");
}void BTN2_SINGLE_Click_Handler(void* btn)
{printf("KEY2 SINGLE_ClICK! \r\n");
}//void BTN2_DOUBLE_Click_Handler(void* btn)
//{
//	printf("KEY2 DOUBLE_ClICK! \r\n");
//}void BTN2_LONG_PRESS_START_Handler(void* btn)
{printf("KEY2 LONG_PRESS_START! \r\n");
}void BTN2_LONG_PRESS_HOLD_Handler(void* btn)
{printf("KEY2 LONG_PRESS_HOLD! \r\n");
}void button_tick_hdl(void)
{button_tick_cnt++;if(button_tick_cnt>=5){button_tick_cnt=0;button_ticks();}
}void init_key(void)
{GPIO_InitTypeDef GPIO_InitStruct;KEY1_GPIO_CLK_ENABLE();KEY2_GPIO_CLK_ENABLE();GPIO_StructInit(&GPIO_InitStruct);GPIO_InitStruct.GPIO_Pin   = KEY1_PIN;GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_IPU;GPIO_Init(KEY1_GPIO_PORT, &GPIO_InitStruct);GPIO_StructInit(&GPIO_InitStruct);GPIO_InitStruct.GPIO_Pin   = KEY2_PIN;GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_IPU;GPIO_Init(KEY2_GPIO_PORT, &GPIO_InitStruct);	//BTN1button_init(&btn1, read_button_gpio, 0, btn1_id);button_attach(&btn1, PRESS_DOWN,       BTN1_PRESS_DOWN_Handler);button_attach(&btn1, PRESS_UP,         BTN1_PRESS_UP_Handler);button_attach(&btn1, PRESS_REPEAT,     BTN1_PRESS_REPEAT_Handler);
//	button_attach(&btn1, SINGLE_CLICK,     BTN1_SINGLE_Click_Handler);
//	button_attach(&btn1, DOUBLE_CLICK,     BTN1_DOUBLE_Click_Handler);button_attach(&btn1, LONG_PRESS_START, BTN1_LONG_PRESS_START_Handler);button_attach(&btn1, LONG_PRESS_HOLD,  BTN1_LONG_PRESS_HOLD_Handler);button_start(&btn1);//BTN2button_init(&btn2, read_button_gpio, 0, btn2_id);button_attach(&btn2, PRESS_DOWN,       BTN2_PRESS_DOWN_Handler);button_attach(&btn2, PRESS_UP,         BTN2_PRESS_UP_Handler);button_attach(&btn2, PRESS_REPEAT,     BTN2_PRESS_REPEAT_Handler);
//	button_attach(&btn2, SINGLE_CLICK,     BTN2_SINGLE_Click_Handler);
//	button_attach(&btn2, DOUBLE_CLICK,     BTN2_DOUBLE_Click_Handler);button_attach(&btn2, LONG_PRESS_START, BTN2_LONG_PRESS_START_Handler);button_attach(&btn2, LONG_PRESS_HOLD,  BTN2_LONG_PRESS_HOLD_Handler);button_start(&btn2);
}

3.2、key.h

#ifndef __KEY_H
#define __KEY_H#define KEY1_GPIO_CLK                    RCC_AHBPeriph_GPIOB
#define KEY1_GPIO_PORT                   GPIOB
#define KEY1_PIN                         GPIO_Pin_0#define KEY2_GPIO_CLK  								   RCC_AHBPeriph_GPIOB
#define KEY2_GPIO_PORT                   GPIOB
#define KEY2_PIN                         GPIO_Pin_1#define KEY1_GPIO_CLK_ENABLE()          do{ RCC_AHBPeriphClockCmd(KEY1_GPIO_CLK, ENABLE); }while(0)
#define KEY1_GPIO_CLK_DISABLE()         do{ RCC_AHBPeriphClockCmd(KEY1_GPIO_CLK, DISABLE); }while(0)#define KEY2_GPIO_CLK_ENABLE()          do{ RCC_AHBPeriphClockCmd(KEY2_GPIO_CLK, ENABLE); }while(0)
#define KEY2_GPIO_CLK_DISABLE()         do{ RCC_AHBPeriphClockCmd(KEY2_GPIO_CLK, DISABLE); }while(0)#define KEY_UP_PRES    		1                   
#define KEY_DOWN_PRES    	2                 	 
#define KEY_LEFT_PRES    	3                
#define KEY_RIGHT_PRES    4  
#define KEY_SEL_PRES			5
#define KEY_B2_PRES				6void init_key(void);  
void button_tick_hdl(void);#endif

3.3、main.c

#include "main.h"int main(void)
{SysTick_Init();init_usart(115200);init_led();init_key();printf("mm32F5265_ob_printf_test!\r\n");while (1){}
}

3.4、调用计时函数

在systick中断函数中调用计时函数

void SysTick_Handler(void)
{TimingDelay_Decrement();button_tick_hdl();
}

四、程序运行

下载程序后,操作按键,串口输出内容
4.1、操作KEY1按键,串口输出
在这里插入图片描述

4.2、操作KEY2按键,串口输出
在这里插入图片描述

相关文章:

  • linux arm系统烧录
  • Nuxt + Pinia + Element Plus 后台管理系统搭建教程(含源码)
  • idea64.exe.vmoptions配置
  • SecureCRT 中使用 `crt.Session.Config.SetOption` 方法
  • 自己学习原理
  • 第八章 独立看门狗(IWDG)
  • 状态管理详解:Context API、Redux、Recoil 和 Zustand 在 React Native 中的应用
  • Kotlin基础语法一
  • Visual Studio2022配置OpenCV环境
  • 【解决办法】git clone报错unable to access ‘xxx‘: SSL certificate problem
  • 网络编程(Modbus进阶)
  • spring中的ImportSelector接口详解
  • 云原生核心技术 (2/12): Docker 入门指南——什么是容器?为什么它比虚拟机更香?
  • Docker监控服务部署
  • 【LeetCode】二叉树相关算法题
  • LeetCode--27.移除元素
  • 睡岗检测算法AI智能分析网关V4全场景智能守护,筑牢安全效率防线
  • UE5 学习系列(三)创建和移动物体
  • 【QT】自动更新库QSimpleUpdater使用实例封装
  • 在微服务架构中,怎么搭建Maven私服
  • 昆明网站建设首选/站长工具介绍
  • 网络运营师/seo推广怎么收费
  • 南坪做网站/淘宝指数在线查询
  • 做一个舌尖上的中国网站怎么做/百度信息流是什么
  • wordpress复制按钮插件/seo效果分析
  • 营销团队网站建设/seo优化培训公司