我这里用状态机写大概写了一下检测的伪代码,你可以根据这样的思路写一下:
按键检测:
//假设 按键是上拉输入
#define 按下 0
#define 抬起 1
#define 消抖时间 10毫秒
typedef enum_按键状态{
抬起状态,
消抖状态,
按下状态,
};
int 按键检测(void)
{
static int 按键状态=抬起;
int 按键值;
static int 消抖计时=0;
if( 按键值 == 按下) //说明按键按下了
if ((按键状态 == 抬起装态)&& (消抖计时<消抖时间))
按键状态 = 消抖状态
计时开始
else if ((按键状态 == 消抖状态)&& (消抖计时>=消抖时间))
按键状态 = 按下状态
else if (( 按键值 == 抬起) && (按键状态 == 消抖状态)&&(消抖计时<消抖时间))
按键状态 = 消抖状态
else
按键装态 = 抬起状态;
消抖计时 停止;
消抖计时=0
}
main
{
while(1)
{
if 开始计时
消抖计时++
else
消抖计时 = 0;
if 按键状态 == 按下状态
做什么
else if 按键状态 == 抬起状态
按什么
//while里面最好不要加过多的延时
}
}
|