51单片机按键的使用
一,按键的分类
1.1 我们常用的按键电路有独立按键和矩阵按键俩种形式,独立按键比较简单,他们各自与独立的输入线相连接。
1.2 在某些设计中,如果需要很多个按键时,如果都做成了独立按键的话,会占用很多IO口,因此就引出了矩阵按键的设计。
二,矩阵按键的判断
2.1 在矩阵按键中,每根链接线都可以控制很多个按键,但是我们应该怎么判断是哪一个按键按下或弹起来了呢?在实际应用中,我们可以先根据按键的设计,保持按键一边的电频不变,判断按键另一边的电频状态,当按键按下时,判断没有固定电频的那一端的电频状态来判断按键是否按下或弹起。在矩阵按键中,我们通常是把控制端(电频保持不变的那一端)分为一个组,然后逐组的判断。
2.2 我们在扫描矩阵按键时,像扫描数码管一样,首先保证按键的一组保持一个可以让按键相应的电频;然后通过逐个扫描按键的另一组中的每一根导线的电频情况来判断是否改变,由此判断按键是否被按下或是弹起(根据电路图的设计,有的设计当按键按下时是低电平,有的则是高电平,还得根据具体情况来判断)。
2.3 按键的消抖,按键的消抖方式有俩种,种是延时消抖,种是程序消抖。当按键按下时,电频状态并不是一下子就发生改变的,而是有一个抖动后信号才平稳。延时消抖,是通过延时10ms(因为抖动时间是由按键的机械特性来决定的,一般都会在10ms以内)来实现消抖的,这种方法可以用,但是不是很理想;因为程序中延时做多了的话会严重影响代码的质量。
按键的连续扫描判断:1111111111111111111 001001 0000000000000000000 10010 1111111111111111111
弹起 抖动 按下 抖动 弹起
由按键扫描的状态来看,我们只需要连续扫描8次后,判断8次的按键状态是否一致就可了。
2.4 消抖示列(我们以一个按键的消抖,矩阵按键自己根据列子来慢慢琢磨)
#include<reg52.h>
sbit KEY4 = P0^3;
...省略部分代码
void Timer0()interrupt 1//定时器中断函数
{
static unsigned char keybuf = 0xff;
keybuf = (keybuf << 1) | KEY4;
if(keybuf == 0x00)
{
//按键按下
} else if(keybuf == 0xff)
{
按键弹起
}
}