按键消抖思想---通过标志位
uint8_t u8cnt=0; //按键按下延时计数
bit bitLock=0; //按键自锁标志位
bit bitShortClick=0; //按键短按标志位
/*按键没有被按下时,是高电平,当按键被按下,电位被拉低成低电平。芯片有些引脚内置了上拉电阻,对应引脚开内部上拉*/
void key_scan(void)
{
if(KEY)
{
u8cnt=0; //按键没有被按下时,将u8cnt、bitLock置0
bitLock=0;
}
else if(bitLock==0)
{
u8cnt++; //当检测到按键按下时,u8cnt开始自增
if(u8cnt>30) //按键按下超过30次时,才确定按键被按下
{
bitLock=1; //将自锁标志位置1,当松开按键时会被自动清零
bitShortClick=1; //按键短按标志位置1,表示按键被按下,调用结束后,
需要及时清零,防止一直被触发
}
}
}
也可以在定时器中设计一个标志位,10ms产生一次中断,这个标志位比如叫bit10ms。
然后在主函数中进行调用。
void main(void)
{
while(1)
{
if(bit10ms)
{
bit10ms=0;
key_scan();
}
}
}
如果这样的话,就需要将上面的u8cnt>30,改成u8cnt>4,就是当按键按下50ms的时候才说明按键被按下,这样的效果会更好。