单片机的按键在按下时会对应的引脚会变成低电平也就是0。所以只要判断值是否变为0就可以判断是否有按键按下。
按键对应的引脚一般在单片机上按键旁边都会有标示。
我的单片机上自带的按键是一种机械按键,就是按下后会马上自动弹起。也就是说引脚的值会有1变为0再变回1。
下面是按下按键后点亮灯,再按下熄灭灯的代码:
#include <reg52.h>
#include <intrins.h>
sbit Key1 = P3^2;
sbit LED0 = P0^0;
void main(){
LED0 =1;
while(1){
if(Key1==0){
LED0 = ~LED0;
}
}
}
实践后发现上面的代码有时候不灵,就是按下后灯还是不熄灭或者不亮。
原因是,这个机械按钮有一个叫做机械抖动的现象。就是按下按钮后,并不按钮马上由1变为0再变为1,中间有一段时间的抖动前摇和抖动后摇,就是在由1变为0的时候,由一段时间处于不稳定时期会在1/0之间反复跳动,然后才稳定在0一段时间,然后按键弹起后又会抖动一段时间再稳定在1。抖动的时间长短不定一般在5~10ms。
消除抖动可以通过硬件的方式也可以用软件的方式。我们这里用软件的方式,原理就是检测到变为0后再延迟10ms再检测值如果还是为0我们才执行代码,以确保抖动时间已过。然后让值为1后才完成该次代码执行(因为会在值为0的时候接触一段时间才变为1,这段时间如果我们代码执行完了,则又会再次检测值是否为0会导致一次按下多次执行)。
修改后的代码:
#include <reg52.h>
#include <intrins.h>
sbit Key1 = P3^2;
sbit LED0 = P0^0;
void Delay10ms() //@11.0592MHz
{
unsigned char i, j;
i = 108;
j = 145;
do
{
while (--j);
} while (--i);
}
void main(){
LED0 =1;
while(1){
if(Key1==0){
Delay10ms();
if(Key1==0){
LED0 = ~LED0;
while(Key1==0);
}
}
}
}