#include <REGX52.H>
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}
void main()
{
while(1)
{
if(P3_1==0)
{
Delay(20);
while(P3_1==0);
Delay(20);
P2_0=~P2_0;
}
}
}
对于机械开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开,所以在开关闭合及断开的瞬间会伴随一连串的抖动
所以我们需要通过Delay(20)延时20ms来过滤掉这个抖动

P3_1表示独立按键K1。当P3_1按下时会接地,即P3_1=0。
所以我们用if(P3_1==0)来判断K1按键是否按下
当按下时我们首先延时20ms过滤掉按键抖动
之后我们再用while循环继续判断K1按键是否仍处于按下状态,检测P3_1=0时,继续循环上边的语句,否则跳出这个语句执行下一个语句
当K1处于松开按键状态时,K1没有接地,P3_1不等于0,跳出while循环,执行Delay(20)过滤松开前的按键抖动,然后再执行按位取反操作
单片机默认输出高电平就为1,开关按下第一次时松开之后取反P2_0,1变为0,低电平亮灯,按下第二次时松开时,取反0变1,高电平,灯灭

LED灯为一个发光二极管,导通时才发光,左边为高电平,右边默认高电平
所以当右边为低电平时,才导通发光
当右边为高电平时二极管截至不发光
