使用同一个按键实现三种触发
使用同一个按键实现短按、按下有效,松手失效和连续按触发。下面主要介绍实现思路
标志位变量定义,为了下次还能正常使用,在调用完触发标志位,记得清零
bit bitLock=0; //按键自锁标志位,防止按键按下一直被触发
bit bitShortClick=0; //按键短按标志位
bit bitClickCnt=0; //按键按下次数标志位
bit bitInterCnt=0; //按键点击间隔时间计数器
bit bitcnt=0; //按下计时器
bit Con_Click=0; //连续按触发标志位
bit Long_Click=0; //按下有效,松手失效
按键扫描部分
/***按键没有被按下时,处于高电平的状态,芯片有些引脚内置上拉电阻,所以外接下拉,
如果按键被按下,电位被拉低,就会处于低电平的状态,以此判断按键被按下********/
void key_scan(void)
{
if(KEY)
{
bitLock=0; //按键松开自动清零
bitcnt=0;
Long_Click=0; //松开清零
if(bitClickCnt>0) //之前已经按下一次,再按一次构成连续按
{
bitInterCnt++; //间隔时间计数器开始计数
if(bitInterCnt>29)
{
bitShortClick=1; //连续按超时没再按下,此次连按失效,短按生效
bitInterCnt=0; //按键按下间隔时间计数器清零
bitClickCnt=0; //按键按下次数计数器清零
}
}
}
else if(bitLock==0) //按键按下
{
bitcnt++;
if(bitcnt==5) //按键按下超过50ms才认为是按键按下
{
bitInterCnt=0; //按键按下间隔时间计数器清零
bitClickCnt++;
if(bitClickCnt>4) //连续按5次触发
{
bitClickCnt=0;
bitShortClick=0; //防止最后一次时,短按被触发
Con_Click=1; //按键触发,调用完及时清零
}
if(bitcnt>20) //延时稍微长,防止在连按时不断的触发
{
bitLock=1; //自锁标志位置1,只有按键松开才会清零
Long_Click=1;
}
}
}
主函数TEST
void main(void)
{
t0timer_init(); //T0定时器
while(1)
{
if(bit10ms) //10ms
{
bit10ms=0;
key_scan();
}
}
}