在编码器中,有一个按键,为了方便的驱动这个按键,我找到了一个开源的按键驱动https://github.com/jiejieTop/ButtonDrive。
Button_drive是一个小巧的按键驱动,支持单击、双击、长按、连续触发等(后续可以在按键控制块中添加触发事件),理论上可无限量扩展Button,Button_drive采用按键触发事件回调方式处理业务逻辑,支持在RTOS中使用,作者仅在RT-Thread上测试过。 写按键驱动的目的是想要将用户按键逻辑与按键处理事件分离,用户无需处理复杂麻烦的逻辑事件。这次我在FreeRTOS上驱证,是可以正常驱动的。
【移植方法】
1、下载源码到本地。
2、在https://forum.eepw.com.cn/thread/389953/1 这篇工程的基础上,添加一个button的工程目录,将下载的源码,除去main.c外,添加进工程中,如下图所示:

2、添加key.c/h
首先加入头文件的引用:
#include "key.h" #include "button.h" #include "platform.h" #include "FreeRTOS.h" #include "task.h"
接着实例化按键
Button_t Button1;
按键GPIO的Init,把PB0初始化为上拉输入模式:
void GPIO_Configure(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
/* K1->PB0 K2->PB1 */
GPIO_StructInit(&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPD;
GPIO_Init(GPIOB, &GPIO_InitStruct);
}编写按键状态的获取函数:
uint8_t Read_Button1_Level(void)
{
return GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0);
}注册一个单击的回调按函数,这里打印出单击:
void Btn1_Dowm_CallBack(void *btn)
{
PRINT_INFO("Button1 单击!");
}编写一个任务函数,用于FreeRTOS创建任务:
void key_task(void *pvParameters)
{
static uint8_t KeyState[4] =
{
0, 0, 0, 0
};
static uint8_t KeyCount[4] =
{
0, 0, 0, 0
};
void GPIO_Configure();
Button_Create("Button1",
&Button1,
Read_Button1_Level,
0);
Button_Attach(&Button1,BUTTON_DOWM,Btn1_Dowm_CallBack); //单击
Get_Button_Event(&Button1);
while(1)
{
Button_Process();
vTaskDelay(20);
}
}在任务创建函数中,添加任务的创建 :
xTaskCreate((TaskFunction_t )key_task, (const char* )"key_task", (uint16_t )LED2_STK_SIZE, (void* )NULL, (UBaseType_t )LED2_TASK_PRIO, (TaskHandle_t* )&keyTask_Handler);
下载后,实现效果:

按下编码器的按键后就可以成功的在串口中输出了单击的铵键效果。
当然我们也可以通过添加双击,长按等来定义更多的按键效果,这里我只需要单击的效果。
我要赚赏金
