我在进行单片机的学习过程中,经常需要对按键进行消抖,因为按键在闭合及断开的瞬间均伴随有抖动。我之前一直用的都是延时消抖,当按键状态变化后,等待一个 10ms 左右的延时时间,让抖动消失后再进行一次按键状态检测。最近接触了定时器消抖,发现比延时消抖多了一些优点。
一、为什么要进行消抖
首先,进行按键消抖是防止按键一次按下或释放的时候被CPU误读多次操作;其次,按键所采用的开关为机械触点式按键开关,所以必须采用软件消抖或者硬件消抖。
二、定时器消抖的步骤
1、判断按键是否按下
2、当按键按下时,开启定时器中断
3、在定时器中断中再次判断按键是否按下
4、关闭定时器,松开按键
三、定时器消抖的优点
首先,相对于通常进行的延时消抖来说,可以减少延时变得更高效;其次,采用中断驱动的方式,节约了CPU资源。
四、部分代码
void Key_Loop(void) { static u8 input1 = 0,input2 = 0; input2 = input1; input1 = Key_NumBer(); if(input1 == 0 && input2 == 1){KeyBer = 1;} if(input1 == 0 && input2 == 2){KeyBer = 2;} if(input1 == 0 && input2 == 3){KeyBer = 3;} if(input1 == 0 && input2 == 4){KeyBer = 4;} if(input1 == 0 && input2 == 5){KeyBer = 5;} if(input1 == 0 && input2 == 6){KeyBer = 6;} if(input1 == 0 && input2 == 7){KeyBer = 7;} if(input1 == 0 && input2 == 8){KeyBer = 8;} if(input1 == 0 && input2 == 9){KeyBer = 9;} if(input1 == 0 && input2 == 10){KeyBer = 10;} if(input1 == 0 && input2 == 11){KeyBer = 11;} if(input1 == 0 && input2 == 12){KeyBer = 12;} if(input1 == 0 && input2 == 13){KeyBer = 13;} if(input1 == 0 && input2 == 14){KeyBer = 14;} if(input1 == 0 && input2 == 15){KeyBer = 15;} if(input1 == 0 && input2 == 16){KeyBer = 16;} }