按键的双击触发
bit bitLock=0; //按键自锁标志位,防止按键按下一直被触发
bit bitShortClick=0; //按键短按标志位
bit bitClickCnt=0; //按键按下次数标志位
uint8_t u8InterCnt=0; //按键点击间隔时间计数器
uint8_t u8cnt=0; //作为按键按下延时计数
/***按键没有被按下时,处于高电平的状态,芯片有些引脚内置上拉电阻,
如果按键被按下,电位被拉低,就会处于低电平的状态,以此判断按键被按下********/
void key_scan(void)
{
if(KEY)
{
bitLock=0; //按键松开自动清零
u8cnt=0;
if(bitClickCnt>0) //之前已经按下一次,再按一次构成双击
{
u8InterCnt++; //间隔时间计数器开始计数
if(u8InterCnt>29)
{
u8InterCnt=0; //按键按下间隔时间计数器清零
bitClickCnt=0; //按键按下次数计数器清零
}
}
}
else if(bitLock==0) //按键按下
{
u8cnt++;
if(u8cnt>4) //按键按下超过50ms才认为是按键按下
{
bitLock=1; //自锁标志位置1,只有按键松开才会清零
u8InterCnt=0; //按键按下间隔时间计数器清零
bitClickCnt++;
if(bitClickCnt>1)
{
bitClickCnt=0;
bitShortClick=1; //按键触发,调用完及时清零
}
}
}
}
void main(void)
{
t0timer_init();
while(1)
{
if(bit10ms)
{
bit10ms=0;
key_scan();
}
}
}
标志位调用完要及时的清零,防止一直被触发。