新的一年,祝大家新年快乐,祝Ai更加强大,登顶世界第一,也祝自己学到更多东西
新的一年,祝大家新年快乐,祝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;//按键"释放"状态结束
}
}
谢谢分享!祝新年快乐! {:4_250:} {:shengli:} {:qiang:} 感谢分享! 加油吧 DIY365 发表于 2025-1-3 14:04
加油吧
一起加油!{:4_196:} 我也贴一个按键单击、双击、三击及长按的程序。
void KeyScan(void) //按键扫描函数,放在1ms定时中断函数里
{
//采用不返回参数方式,将按键值直接赋予全局变量"Gu8KeyValue"
//0无按键,如11为按键1单击,12为按键1双击,13为按键1三击,15为按键1长按
//0无按键,如21为按键2单击,22为按键2双击,23为按键2三击,25为按键2长按
static unsigned int Su16Key1_PressCnt; //按键1按下计时变量
static unsigned int Su16Key1_ReleaseCnt; //按键1松开计时变量
static unsigned char Su8Key1_ClickNum; //按键1单击次数变量
static unsigned char Su8Key1_SingleLock; //按键1单次锁变量
static unsigned int Su16Key2_PressCnt; //按键2按下计时变量
static unsigned int Su16Key2_ReleaseCnt; //按键2松开计时变量
static unsigned char Su8Key2_ClickNum; //按键2单击次数变量
static unsigned char Su8Key2_SingleLock; //按键2单次锁变量
//KEY1(P32)按键检测
if(KEY1 == 1) //按键松开时
{
Su16Key1_PressCnt = 0; //清除变量
Su8Key1_SingleLock = 0; //清除变量
Su16Key1_ReleaseCnt ++; //按键松开计时变量累加
if(Su8Key1_ClickNum == 1 && Su16Key1_ReleaseCnt >= 300) //单击一次后松开时间超过300ms识别为单击
{
Gu8KeyValue = 11; //按键值为单击
Su8Key1_ClickNum = 0; //清除变量
Su16Key1_ReleaseCnt = 0; //清除变量
}
if(Su8Key1_ClickNum == 2 && Su16Key1_ReleaseCnt >= 200) //单击两次后松开时间超过200ms识别为双击
{
Gu8KeyValue = 12; //按键值为双击
Su8Key1_ClickNum = 0; //清除变量
Su16Key1_ReleaseCnt = 0; //清除变量
}
if(Su8Key1_ClickNum == 3) //在300ms时间内单击三次识别为三击
{
Gu8KeyValue = 13; //按键值为三击
Su8Key1_ClickNum = 0; //清除变量
Su16Key1_ReleaseCnt = 0; //清除变量
}
}
else if(Su8Key1_SingleLock == 0) //按键按下且是第一次按下
{
Su16Key1_PressCnt ++; //按键按下计时变量累加
if(Su16Key1_PressCnt == 20) //按下后20ms消抖时间到了识别为一次单击
{
Su8Key1_ClickNum ++; //单击次数累加
Su16Key1_ReleaseCnt = 0; //按键松开计时变量清0
}
if(Su16Key1_PressCnt >= 500) //按下后超过500ms识别为长按
{
Su8Key1_SingleLock = 1; //单次按键上锁,避免按久了多次触发
Su8Key1_ClickNum = 0; //单击次数清0
Gu8KeyValue = 15; //按键值为长按
}
}
//KEY2(P33)按键检测
if(KEY2 == 1) //按键松开时
{
Su16Key2_PressCnt = 0; //清除变量
Su8Key2_SingleLock = 0; //清除变量
Su16Key2_ReleaseCnt ++; //按键松开计时变量累加
if(Su8Key2_ClickNum == 1 && Su16Key2_ReleaseCnt >= 300) //单击一次后松开时间超过300ms识别为单击
{
Gu8KeyValue = 21; //按键值为单击
Su8Key2_ClickNum = 0; //清除变量
Su16Key2_ReleaseCnt = 0; //清除变量
}
if(Su8Key2_ClickNum == 2 && Su16Key2_ReleaseCnt >= 200) //单击两次后松开时间超过200ms识别为双击
{
Gu8KeyValue = 22; //按键值为双击
Su8Key2_ClickNum = 0; //清除变量
Su16Key2_ReleaseCnt = 0; //清除变量
}
if(Su8Key2_ClickNum == 3) //在300ms时间内单击三次识别为三击
{
Gu8KeyValue = 23; //按键值为三击
Su8Key2_ClickNum = 0; //清除变量
Su16Key2_ReleaseCnt = 0; //清除变量
}
}
else if(Su8Key2_SingleLock == 0) //按键按下且是第一次按下
{
Su16Key2_PressCnt ++; //按键按下计时变量累加
if(Su16Key2_PressCnt == 20) //按下后20ms消抖时间到了识别为一次单击
{
Su8Key2_ClickNum ++; //单击次数累加
Su16Key2_ReleaseCnt = 0; //按键松开计时变量清0
}
if(Su16Key2_PressCnt >= 500) //按下后超过500ms识别为长按
{
Su8Key2_SingleLock = 1; //单次按键上锁,避免按久了多次触发
Su8Key2_ClickNum = 0; //单击次数清0
Gu8KeyValue = 25; //按键值为长按
}
}
}
页:
[1]