独立按键
使用独立按键时,请将开发板上面的J5跳线帽接到BTN端,此时为独立按键模式。
独立按键原理很简单,根据原理图
此时一旦按键按下,相应的I/O口就是接地状态,为低电平。
写单片机时我们都知道按键按下需要消抖,我们之前是使用delay延时程序消抖,但是不建议在程序中使用delay,我们可以使用定时器延时来完成消抖。
我们之前写独立按键原理都是
检测按键按下—>延时消抖—>再次检测按键是否还在按下状态—>确认按键按下—>操作—>检测按键是否松开—>延时消抖—>再次检测按键是否松开—>确定按键松开—>操作
但是对于多个按键来说,这样就显得繁琐了,所以在这里介绍一种简单一些的方法。
使用定时器消抖
我们使用定时器定时2ms,然后每次中断扫描一下按键,将扫描值左移至一个变量中,每移动一次就判断当前连续的8次按键状态是不是全1或者全0,如果是全1则判断为弹起,如果是全0则判断为按下,如果是0和1交错,就认为是抖动,不做任何判定。
利用这种方法就可以避免通过延时消抖占用单片机执行时间,而是转化成了一种按键状态判定而非按键过程判定,我们只对当前按键的连续16ms的状态进行判断,而不再关心它在这16ms内都做了什么事情。
void Key_Scan(void)
{
u16 i;
static u8 keybuff[] = {0xff,0xff,0xff,0xff};
keybuff[0] = (keybuff[0]<<1)|s4;
keybuff[1] = (keybuff[1]<<1)|s5;
keybuff[2] = (keybuff[2]<<1)|s6;
keybuff[3] = (keybuff[3]<<1)|s7;
for(i = 0;i < 4;i ++)
{
if(keybuff[i] == 0xff) //连续扫描8次都是1,16ms内都是弹起状态,按键已松开
{
KeySta[i] = 1;
}
else if(keybuff[i] == 0x00) //连续扫描8次都是0,16ms内都是按下状态,按键已按下
{
KeySta[i] = 0;
}
else //其他状态键值不稳定,不作处理
{}
}
}
这个算法就是经常使用的一种比较好的方法,我比较推荐这种方法,不建议在程序中加入延时。