使用定时器计时,给按键的按下、抬起的计时消抖,在大循环while里不堵塞,可以同时检测到每个按键各自的“按下”“长按”“抬起”的状态。在此基础上,按键的长按一秒、两秒三秒,按键的双击,组合键功能(例如Ctrl+C)等已经很容易实现了。
button.c和button.h直接添加到工程里,编译然后修改到对应的布尔变量。user.c是应用文件。
一、源文件button.c
按键操作。不同的编译器里布尔变量类型的几种写法:bit - bool - _Bool - unsigned char。
函数Btn_InitNull(BtnControl_pst pBtn)对按键参数初始化,设置按键初始状态为“无动作”。
函数Btn_InitPress(BtnControl_pst pBtn)对按键参数初始化,设置按键初始状态为“长按”。
函数Btn_Scan(BtnControl_pst pBtn, _Bool bPin)是在main()的大循环里检测按键状态。
#include "button.h"
static _Bool Btn_Shake(BtnControl_pst pBtn, uint8_t site);
/**************************************************************************
Function: Btn_InitNull
Description: 初始化按键参数,状态设为:S_NULL(无动作)
Input: - pBtn 按键操作结构体
Return: no
**************************************************************************/
void Btn_InitNull(BtnControl_pst pBtn)
{
pBtn->status = S_NULL;
pBtn->bAction = 0;
pBtn->bDelay = 0;
}
/**************************************************************************
Function: Btn_InitPress
Description: 初始化按键参数,状态设为:S_PRESS(长按)
Input: - pBtn 按键操作结构体
Return: no
**************************************************************************/
void Btn_InitPress(BtnControl_pst pBtn)
{
pBtn->status = S_PRESS;
pBtn->bAction = 1;
pBtn->bDelay = 0;
}
/*******************************************************