独立按键的使用(2)

上一节的按键的使用中,效果是按下键亮,弹起后又灭,无法保持状态,下面的实现按下弹起后,实现一次切换;

#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);
}

这是使用软件防抖,另外还可以在硬件电路上设计防抖,以后再学习。

原文地址:https://www.cnblogs.com/coloregg/p/3606361.html