分享一款嵌入式开源按键框架代码工程MultiButton

目录

1 工程简介

2 工程代码分析

3 工程代码应用

4 思考


1 工程简介

        MultiButton 是一个小巧简单易用的事件驱动型按键驱动模块。

        Github地址:https://github.com/0x1abin/MultiButton

        这个项目非常精简,只有两个文件:

(1)可无限扩展按键;

(2)按键事件的回调异步处理方式可以简化程序结构,去除冗余的按键处理硬编码,让按键业务逻辑更清晰。

        通过此工程可以学习到以下知识点:

(1)按键各种类型事件

(2)状态机的思想

(3)单向链表语法

        MultiButton 支持如下的按键事件:

        MultiButton 的按键状态机软件流程图:


2 工程代码分析

        注:在使用源码工程时稍微修改了两个点,后续贴出完整代码,有需要查看修改的同学可以和将源码工程下载后进行对比,修改的点如下:

(1)将按键时间的相关参数通过接口定义进行初始化

(2)修改长按期间一直触发事件为真正的长按定时触发

        在头文件multi_button.h中:

(1)定义了按键时间相关参数

(2)定义了按键的事件类型

(3)定义按键链表结构体,这里使用了位域操作,解决字节的存储空间问题

#ifndef _MULTI_BUTTON_H_
#define _MULTI_BUTTON_H_

#include <stdint.h>
#include <string.h>


typedef struct ButtonPara {
	uint8_t ticks_interval;
	uint8_t debounce_ticks;
	uint16_t short_ticks;
	uint16_t long_ticks;
}ButtonPara;

typedef void (*BtnCallback)(void*);

typedef enum {
	PRESS_DOWN = 0,
	PRESS_UP,
	PRESS_REPEAT,
	SINGLE_CLICK,
	DOUBLE_CLICK,
	LONG_PRESS_START,
	LONG_PRESS_HOLD,
	number_of_event,
	NONE_PRESS
}PressEvent;

typedef 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  button_id;
	uint8_t  (*hal_button_Level)(uint8_t button_id_);
	BtnCallback  cb[number_of_event];
	struct Button* next;
}Button;

#ifdef __cplusplus
extern "C" {
#endif
void button_para_init(struct ButtonPara para);
void button_init(struct Button* handle, uint8_t(*pin_level)(uint8_t), uint8_t active_level, uint8_t button_id);
void button_attach(struct Button* handle, PressEvent event, BtnCallback cb);
PressEvent get_button_event(struct Button* handle);
int  button_start(struct Button* handle);
void button_stop(struct Button* handle);
void button_ticks(void);

#ifdef __cplusplus
}
#endif

#endif

        在源码文件multi_button.c中:

(1)对按键时间参数进行初始化

(2)对按键对象结构体进

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sharemaker

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值