multi_button前提知识:回调函数

前提知识

  • 函数
  • 指针
  • typedef

基本概念

一个函数作为另外一个函数的一个参数;

是一种异步机制。

例如,一个按键初始化函数

1
void button_init(struct Button* handle, uint8_t(*pin_level)(void), uint8_t active_level);
1
2
3
4
5
6
7
8
9
void button_init(struct Button* handle, uint8_t(*pin_level)(void), uint8_t active_level)
{
memset(handle, 0, sizeof(struct Button));//清空按键结构体全部内容
handle->event = (uint8_t)NONE_PRESS;//按键中事件状态位设为:无按下
handle->hal_button_Level = pin_level;//按键中获取按键电平的函数,调用参数2:uint8_t(*pin_level)(void)
handle->button_level = handle->hal_button_Level();//执行回调函数得到返回值,赋值给按键中的按键检测电平值
handle->active_level = active_level;//获取设定的激活状态,0表示低电平时,按键按下;1表示高电平时,按键按下
//此时初始化完成。
}
参数 作用 说明
struct Button* handle 按键句柄 表示每个具体的按键
uint8_t (*pin_level)(void) 读取引脚电平值 回调函数/函数指针,uint8_t为返回值,pin_level为函数名,void为参数
uint8_t active_level 按键按下是高or低电平 0表示低电平时,按键按下;1表示高电平时,按键按下

使用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct Button btn1;

//回调函数,用户定义
uint8_t read_button1_GPIO()
{
//用户实现,完成相应操作
//此处为读取引脚电平,高电平1与低电平0(uint8_t)
return HAL_GPIO_ReadPin(B1_GPIO_Port, B1_Pin);
}

//对按键初始化函数进行使用,传入三个参数:按键1的,读取电平函数,按键按下时为低电平。
button_init(&btn1, read_button1_GPIO, 0);

//综上所述,即可完成对按键的初始化

简化声明

typedef:给数据类型起别名

简化

1
2
3
4
5
6
7
8
9
10
11
typedef uint8_t (*pin_level)(void);

void button_init(struct Button* handle,pin_level my_cb, uint8_t active_level)
{
memset(handle, 0, sizeof(struct Button));//清空按键结构体全部内容
handle->event = (uint8_t)NONE_PRESS;//按键中事件状态位设为:无按下
handle->hal_button_Level = my_cb;//按键中获取按键电平的函数,调用参数2:my_cb
handle->button_level = handle->hal_button_Level();//执行回调函数得到返回值,赋值给按键中的按键检测电平值
handle->active_level = active_level;//获取设定的激活状态,0表示低电平时,按键按下;1表示高电平时,按键按下
//此时初始化完成。
}

使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct Button btn1;

//回调函数,用户定义
uint8_t read_button1_GPIO()
{
//用户实现,完成相应操作
//此处为读取引脚电平,高电平1与低电平0(uint8_t)
return HAL_GPIO_ReadPin(B1_GPIO_Port, B1_Pin);
}

//对按键初始化函数进行使用,传入三个参数:按键1的,读取电平函数,按键按下时为低电平。
button_init(&btn1, read_button1_GPIO, 0);

//综上所述,即可完成对按键的初始化

数组形式

数组

数组:数据结构,存储相同数据类型的元素,

数据类型 数组名称[数组大小]

其中数组名称为首元素的地址,即 &数组名称[0],&为取该地址的值

回调函数的数组

按键触发事件有:单击、双击、长按、短按、按下、弹起等,每个事件触发以后,要做什么事情,由用户决定

能否同时建立多个回调函数,分别执行对应的触发事件,

使用数组:参数

1
2
3
4
5
6
7
//简化回调函数
typedef void (*BtnCallback)(void*);

//number_of_event是一个int值,表示数组大小
//声明一个有number_of_event个的回调函数数组:cb[0]、……、cb[number_of_event-1]
BtnCallback cb[number_of_event];