单片机检测按键的短按、长按、持续按
前言
在单片机系统里,按键检测是很基础的功能。按键的工作原理是借助机械触点的闭合与断开来实现电路的接通和断开。不过,在实际的电路中,当按键按下或者释放时,机械触点会产生抖动现象,这可能会使单片机检测到多次按键动作。所以,进行按键消抖处理是很有必要的。因为考虑方便移植的问题,对按键数量和io的对应关系做了封装,代码运行还算稳定,仅供参考。
一、硬件连接
按键的一端连接到单片机的 I/O 口,另一端接地。同时,需要给 I/O 口配置上拉电阻,这样在按键没有按下时,I/O 口的电平为高电平;当按键按下后,I/O 口的电平就会变为低电平。
二、软件实现
1.实现步骤
消抖处理:在检测到按键状态发生变化后,程序会等待一段时间(50 毫秒),当这段时间内按键状态保持稳定时,才会确认按键状态的改变。
按下检测:当检测到按键从高电平变为低电平时,会记录按下的开始时间。
释放检测:当检测到按键从低电平变为高电平时,会计算按键按下的持续时间。如果持续时间大于等于长按时间阈值,就判定为长按;否则,判定为短按。
长按检测:在按键持续按下的过程中,程序会不断检查按下时间是否超过长按时间阈值,这样可以实现长按持续响应的功能。
2.按键结构体定义
#ifndef __KEY_H__
#define __KEY_H__
#ifdef __cplusplus
extern "C" {
#endif
#include "main.h"
#define key_num 4 //定义按键数量
#define key_short_press 8
#define key_long_press 9
#define key_persistent_press 10
void key_init(void);
void key_circulate(void);
//定于按键结构体
typedef struct{
uint8_t key_state; //按键高低电平状态
uint8_t key_ide; //按键输出状态
uint32_t time_cum ; //按键持续时间
uint32_t time_start; //按键按下时间