- 打卡等级:以坛为家I
- 打卡总天数:351
- 最近打卡:2025-05-02 00:50:51
已绑定手机
金牌会员
- 积分
- 1859
|
发表于 2024-12-28 23:42:21
|
显示全部楼层
//---按键读取(状态机方式)---
//采用不返回参数方式,将按键值直接赋予全局变量"Key_value"
void Key_Scan(void)
{
static u8 KeyState = 0; //按键状态(必须为静态"static"变量)
static u8 KeyTime = 0; //计时(必须为静态"static"变量)
switch(KeyState) //0=初始状态,1=确认状态,2=短按/长按判断状态,3=单击/双击判断状态,88=释放状态
{
case 0: //进入按键"初始"状态
if (!key) //如有按键按下
{
KeyState = 1; //转到按键"确认"状态
}
break; //按键"初始"状态结束
case 1: //进入按键"确认"状态(消抖)
if (!key) //如按键仍按下
{
KeyTime = 0; //计时清零(准备计时)
KeyState = 2; //转到"短按/长按"判断状态
}
else //否则, (按键已松开)
{
Key_value = 0; //是"无键"
KeyState = 0; //转到按键"初始"状态
}
break; //按键"确认"状态结束
case 2: //进入按键"短按/长按"判断状态
if ( key) //如按键已松开
{
KeyState = 3; //转到按键"单击/双击"判断状态,(即第一次单击不作反应,待后面来判断是否有双击)
}
else //否则, (按键仍按下)
{
if(++KeyTime >= 30) //如"长按"计时到, ("长按"的保持时间,可调整)
{
KeyTime = 0; //计时清零
Key_value = 2; //是"长按"
KeyState = 88; //转到按键"释放"状态
}
}
break; //按键"短按/长按"判断状态结束
case 3: //进入按键"单击/双击"判断状态
if (!key) //如按键又按下, (即第二次按下)
{
Key_value = 3; //是"双击"
KeyState = 88; //转到按键"释放"状态
}
else //否则, (按键未按下)
{
if(++KeyTime >= 30) //如"双击"计时到, ("双击"的间隔时间,可调整)
{
KeyTime = 0; //计时清零
Key_value = 1; //是"短按"(单击)
KeyState = 0; //转到按键"初始"状态
}
}
break; //按键"单击/双击"判断状态结束
case 88: //进入按键"释放"状态
if ( key) //如按键已松开
{
KeyState = 0; //转到按键初始状态
}
break; //按键"释放"状态结束
}
} |
|