- 打卡等级:以坛为家I
- 打卡总天数:398
- 最近打卡:2025-06-19 00:05:30
已绑定手机
金牌会员
- 积分
- 2578
|
新的一年,祝大家新年快乐,
祝Ai更加强大,登顶世界第一,
也祝自己学到更多知识
同时附上自己新年第一天刚整出来的按键多复用代码
单击,双击,三击,长按,单击加长按,双击加长按(晚点实现)
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)
{
KeyTime = 0; //重置计时器
KeyState = 4; //进入case4
}
else
{
if(++KeyTime >= 27)
{
KeyTime = 0;
Key_value = 1;
KeyState = 0;
}
}
break;
case 4:
if (key)
{
KeyTime = 0; //计时清零
KeyState = 5; //转到按键"初始"状态
}
else //否则, (按键按下)
{
if (++KeyTime >= 27)
{
Key_value = 5;
KeyState = 88;
}
}
break;
case 5: //进入按键"三击/双击"判断状态
if (!key) //如果第三次没有按下,等带判定双击
{
KeyTime = 0; //计时清零
Key_value = 4; //如果有按键三击
KeyState = 88; //转到按键"初始"状态
}
else
{
if (++KeyTime >= 27)
{
Key_value = 3;
KeyState = 88;
}
}
break; //
case 88: //进入按键"释放"状态
if ( key) //如按键已松开
{
KeyState = 0; //转到按键初始状态
}
break; //按键"释放"状态结束
}
}
|
|