上一节的按键的使用中,效果是按下键亮,弹起后又灭,无法保持状态,下面的实现按下弹起后,实现一次切换;
#include <reg52.h> sbit LED = P0^2; //控制引脚 sbit Key = P0^0; //按键 void main(void) { LED = 0; //初始亮 while (1) { if (!Key) //如果按下 { LED = !LED; //切换LED状态 } } }
测试后发现,按键按下弹起的时间间隔不同,效果也不同,有时会出现按下弹起后状态并没有改,这是因为,虽然按下了键也弹起了,但是当程序顺序执行到 if (!Key) 时,可能键已经是按下后的弹起状态,造成抖”动“,为了更好的实现一次按键按下弹起只切换一次LED的状态,代码修改如下:
#include <reg52.h> sbit LED = P0^2; //控制引脚 sbit Key = P0^0; //按键 void delay(unsigned int t); void main(void) { LED = 0; //初始亮 while (1) { if (!Key) //如果按下 { delay(1500); //延时去抖 一般10-20ms if (!Key) //如果还处于按下状态,说明是有效的 { while (!Key); //如果一直是按下,等待弹起,注意这要有";" LED = !LED; //弹起后切换LED状态 } } } } void delay(unsigned t) { while(--t); }
这是使用软件防抖,另外还可以在硬件电路上设计防抖,以后再学习。