标题:
好用实在的MCU按键扫描处理短按长按方法,程序拿走不谢
[打印本页]
作者:
whwteng
时间:
2021-1-8 18:16
标题:
好用实在的MCU按键扫描处理短按长按方法,程序拿走不谢
自己做项目总结出来觉得比较好用,拿出来分享一下
单片机源程序如下:
//------------------------自己的按键扫描-短按-长按处理--------------------------------
u8 uiKeyTimeCnt1; //按键1计数
u8 uiKeyTimeCnt2; //按键2计数
u8 uiKeyTimeCnt3; //按键3计数
u8 uiKeyTimeCnt4; //按键4计数
u8 uiKeyTimeCnt5; //按键5计数
u8 uiKeyTimeCnt6; //按键6计数
u8 ucShortTouchFlag1; //短按按键有效标志
u8 ucLongTouchFlag1; //长按按键有效标志
void Key_control(void)
{
//每10ms论巡一次
//KEY_DATA:按键数据--并先清一次零
//按键数据的获取---这里是通过触摸IC的IIC通信
KEY_DATA=0X0000;
I2C_ReadDeviceDataTo(0x80,&KEY_DATA,1);
KEY_DATA=KEY_DATA^0xffff;
switch(KEY_DATA)
{
case(0x1000):
uiKeyTimeCnt1++; //累加计时
if(uiKeyTimeCnt1>2) //这里是消抖,20ms足矣
ucShortTouchFlag1|=0x01; //激活按键1短按的有效标志
if(uiKeyTimeCnt1>999)
{
ucShortTouchFlag1&=~0x01; //清除按键1短按有效标志
ucLongTouchFlag1=1; //按键1长按10s有效标志
}
break;
case(0x0800):
uiKeyTimeCnt2++; //累加计时
if(uiKeyTimeCnt2>2)
ucShortTouchFlag1|=0x02; //激活按键2短按的有效标志
if(uiKeyTimeCnt2>999)
{
ucShortTouchFlag1&=~0x02; //清除按键2短按有效标志
ucLongTouchFlag1=2; //按键2长按10s有效标志
}
break;
case(0x0400):
uiKeyTimeCnt3++; //累加计时
if(uiKeyTimeCnt3>2)
ucShortTouchFlag1|=0x03; //激活按键3短按的有效标志
if(uiKeyTimeCnt3>999)
{
ucShortTouchFlag1&=~0x03; //清除按键3短按有效标志
ucLongTouchFlag1=3; //按键3长按10s有效标志
}
break;
case(0x0200):
uiKeyTimeCnt4++; //累加计时
if(uiKeyTimeCnt4>2)
ucShortTouchFlag1|=0x04; //激活按键4短按的有效标志
if(uiKeyTimeCnt4>999)
{
ucShortTouchFlag1&=~0x04; //清除按键4短按有效标志
ucLongTouchFlag1=4; //按键4长按10s有效标志
}
break;
case(0x0100):
uiKeyTimeCnt5++; //累加计时
if(uiKeyTimeCnt5>2)
ucShortTouchFlag1|=0x05; //激活按键5短按的有效标志
if(uiKeyTimeCnt5>999)
{
ucShortTouchFlag1&=~0x05; //清除按键5短按有效标志
ucLongTouchFlag1=5; //按键5长按10s有效标志
}
break;
case(0x0080):
uiKeyTimeCnt6++; //累加计时
if(uiKeyTimeCnt6>2)
ucShortTouchFlag1|=0x06; //激活按键6短按的有效标志
if(uiKeyTimeCnt6>999)
{
ucShortTouchFlag1&=~0x06; //清除按键6短按有效标志
ucLongTouchFlag1=6; //按键6长按10s有效标志
}
break;
default:
uiKeyTimeCnt1=uiKeyTimeCnt2=uiKeyTimeCnt3=uiKeyTimeCnt4=uiKeyTimeCnt5=uiKeyTimeCnt6=0;
//短按处理
switch(ucShortTouchFlag1)
{
case(0x01):
ucShortTouchFlag1=0x00; //这里处理完短按之后清零按键标志
break;
case(0x02):
ucShortTouchFlag1=0x00;
break;
case(0x03):
ucShortTouchFlag1=0x00;
break;
case(0x04):
ucShortTouchFlag1=0x00;
break;
case(0x05):
ucShortTouchFlag1=0x00;
break;
case(0x06):
ucShortTouchFlag1=0x00;
break;
}
//处理长按
switch(ucLongTouchFlag1)
{
case 1:
ucLongTouchFlag1=0; //这里处理完长按之后清零按键标志
break;
case 2:
ucLongTouchFlag1=0;
break;
case 3:
ucLongTouchFlag1=0;
break;
case 4:
ucLongTouchFlag1=0;
break;
case 5:
ucLongTouchFlag1=0;
break;
case 6:
ucLongTouchFlag1=0;
break;
}break;
}
}
复制代码
作者:
ii11nnocent
时间:
2021-1-11 10:24
慢慢学习了,状态机方法确实值得使用,可以解放CPU。
作者:
xyllovezuu
时间:
2021-1-14 12:48
很好,简洁明了!
作者:
sdarling
时间:
2021-3-1 23:58
将长按处理的函数放在外边,应该就可以处理到长按时间直接处理的功能,不需要等按键松开再执行了吧,就是还要多一个标志位,防止一直长按一直多次执行
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1