平时的按键检测大多数是检测按键的短按或长按;最近的项目中用到了另外一种按键处理,项目要求里面有 4个键,每个按键需要检测按下和抬起时的状态,并且只在状态改变时触发一次按键操作;
现做一下记录:
引脚定义:
sbit KEY1_key=P1^1;
sbit KEY2_key=P1^4;
sbit KEY3_key=P1^5;
sbit KEY4_key=P1^6;
宏定义一下:
#define DEBOUNCE_TIME 20 // 消抖时间20ms
//0是按下; 1是抬起
#define KEY_PRESS 0
#define KEY_RELEASE 1
// 状态定义
typedef enum {
KEY_STATE_RELEASED=0, // 稳定释放状态
KEY_DEBOUNCE_PRESSING, // 按下消抖中
KEY_STATE_PRESSED, // 稳定按下状态
KEY_DEBOUNCE_RELEASING // 释放消抖中
} KeyState;
// 按键配置结构体
typedef struct {
uchar pin_state; // 当前物理引脚状态 实际就是读取IO引脚的状态,高=1,低=0;
KeyState stable_state; // 稳定状态 上面的4中状态来回切换
uchar debounce_cnt; // 消抖计数器 和定时的消抖时间对比ÿ