资源简介
MultiButton 是一个小巧简单易用的事件驱动型按键驱动模块,可无限量扩展按键,按键事件的回调异步处理方式可以简化你的程序结构,去除冗余的按键处理硬编码,让你的按键业务逻辑更清晰。
【使用方法】
1.先申请一个按键结构
- struct Button button1;
2.初始化按键对象,绑定按键的GPIO电平读取接口read_button_pin() ,后一个参数设置有效触发电平
- button_init(&button1, read_button_pin, 0);
3.注册按键事件
- button_attach(&button1, SINGLE_CLICK, Callback_SINGLE_CLICK_Handler);
- button_attach(&button1, DOUBLE_CLICK, Callback_DOUBLE_Click_Handler);
- ...
4.启动按键
- button_start(&button1);
5.设置一个5ms间隔的定时器循环调用后台处理函数
- while(1) {
- ...
- if(timer_ticks == 5) {
- timer_ticks = 0;
- button_ticks();
- }
- }
特性
MultiButton 使用C语言实现,基于面向对象方式设计思路,每个按键对象单独用一份数据结构管理:
- struct Button {
- uint16_t ticks;
- uint8_t repeat: 4;
- uint8_t event : 4;
- uint8_t state : 3;
- uint8_t debounce_cnt : 3;
- uint8_t active_level : 1;
- uint8_t button_level : 1;
- uint8_t (*hal_button_Level)(void);
- BtnCallback cb[number_of_event];
- struct Button* next;
- };
这样每个按键使用单向链表相连,依次进入 button_handler(struct Button* handle) 状态机处理,所以每个按键的状态彼此独立。
按键事件
事件 | 说明 |
---|---|
PRESS_DOWN | 按键按下,每次按下都触发 |
PRESS_UP | 按键弹起,每次松开都触发 |
PRESS_REPEAT | 重复按下触发,变量repeat计数连击次数 |
SINGLE_CLICK | 单击按键事件 |
DOUBLE_CLICK | 双击按键事件 |
LONG_RRESS_START | 达到长按时间阈值时触发一次 |
LONG_PRESS_HOLD | 长按期间一直触发 |
Examples
- #include "button.h"
- struct Button btn1;
- int read_button1_GPIO()
- {
- return HAL_GPIO_ReadPin(B1_GPIO_Port, B1_Pin);
- }
- int main()
- {
- button_init(&btn1, read_button1_GPIO, 0);
- 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_RRESS_START, BTN1_LONG_RRESS_START_Handler);
- button_attach(&btn2, LONG_PRESS_HOLD, BTN1_LONG_PRESS_HOLD_Handler);
- button_start(&btn1);
- //make the timer invoking the button_ticks() interval 5ms.
- //This function is implemented by yourself.
- __timer_start(button_ticks, 0, 5);
- while(1)
- {}
- }
- void BTN1_PRESS_DOWN_Handler(void* btn)
- {
- //do something...
- }
- void BTN1_PRESS_UP_Handler(void* btn)
- {
- //do something...
- }
- ...
代码片段和文件信息
/*
* Copyright (c) 2016 Zibin Zheng
* All rights reserved
*/
#include “multi_button.h“
#define EVENT_CB(ev) if(handle->cb[ev])handle->cb[ev]((Button*)handle)
//button handle list head.
static struct Button* head_handle = NULL;
/**
* @brief Initializes the button struct handle.
* @param handle: the button handle strcut.
* @param pin_level: read the HAL GPIO of the connet button level.
* @param active_level: pressed GPIO level.
* @retval None
*/
void button_init(struct Button* handle uint8_t(*pin_level)() uint8_t active_level)
{
memset(handle 0 sizeof(struct Button));
handle->event = (uint8_t)NONE_PRESS;
handle->hal_button_Level = pin_level;
handle->button_level = handle->hal_button_Level();
handle->active_level = active_level;
}
/**
* @br
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2019-12-16 01:46 MultiButton-master\
文件 1068 2019-12-16 01:46 MultiButton-master\LICENSE
文件 2904 2019-12-16 01:46 MultiButton-master\README.md
目录 0 2019-12-16 01:46 MultiButton-master\examples\
文件 1628 2019-12-16 01:46 MultiButton-master\examples\example_callback.c
文件 705 2019-12-16 01:46 MultiButton-master\examples\example_poll.c
文件 4892 2019-12-16 01:46 MultiButton-master\multi_button.c
文件 1298 2019-12-16 01:46 MultiButton-master\multi_button.h
- 上一篇:92-1602液晶静态显示.zip
- 下一篇:c++ 推箱子源码
相关资源
- c++ 课程设计 超市管理系统(源代码和
- C++程序设计教程 第二版 习题及解答
- 单片机C语言程序设计实训100例 基于
- QT 无边框程序
- Qt扫雷小程序
- 基于易盛期货接口的自动化交易程序
- Qt chat聊天程序源码(含毕业设计说明
- Linux设备驱动程序(中文版第三版)
- STM32中的CAN模块使用程序
- STM32_MODBUS_RTU 基于STM32的ModbusRtu协议程
- 基於stm32f103實現modbus-rtu主機源程序
- modbus控制30路下位机程序
- 51单片机抢答器程序加仿真图
- modbus主机程序,STM32,内容完整,结构
- Visual C++数据采集与串口通讯测控应用
- 四旋翼飞行器的开源程序,国外开源
- 51单片机竞赛设计程序(44套)
- stm32开机例程即综合测试例程
- c++ 获取另一个程序的RichTextWndClass的内
- c++ 键盘测试程序
- 多线程高速文件搜索程序源码
- c++ 键盘钩子(按键发出相应的字母声
- Delphi远程桌面远程控制程序
- MFC 按键精灵.rar
- 用VC6.0编写的视频捕获程序
- c++ 数字图像处理小程序
- 三维几何零件图形程序-OpenGL-VC++源代
- Qt虚拟键盘程序源码
- c++ 驱动程序加载器源码
- 提取应用程序ICON图标(得到exe图标并
评论
共有 条评论