(1)独立按键控制LED的状态
独立按键控制LED灯的点亮
#include"reg52.h"
sbit open=P3^0;//这里是k2这个按键
sbit led=P2^0;
void delay(unsigned int n);
void main()
{
while(1)
{
if(open==0)//k2被按下
{
led=0;//实现点亮
}
}
}
按下k1后发现,一号灯一直是亮的,如果需要只在按k2时亮,松开后就不亮,加个else即可
#include"reg52.h"
sbit open=P3^0;
sbit led=P2^0;
void delay(unsigned int n);
void main()
{
while(1)
{
if(open==0)
{
led=0;
}
else
{
led=1;
}
}
}
除此之外还有用逻辑运算符来实现多个键对一个灯的控制
例如:
#include"reg52.h"
sbit open1=P3^0;//按键k2
sbit open2=P3^1//按键k1
sbit led=P2^0;
void main()
{
while(1)
{
if(open1==0&&open2==0)
{
led=0;
}
else
{
led=1;
}
}
}
上面代码中的逻辑与也可以换成逻辑或,从而实现按下k1或k2或同时按下k1、k2来点亮1号灯
但上面所有的这些代码,都是要一直在按独立按键才能把led点亮,那能不能实现按动之后,led一直点亮呢?
这里,我们不难想到一种思路,取反操作。
那么我们什么时候该进行取反呢,答案当然就是我们的要求——按动之后,而这,就需要用到我们while的空语句循环
#include"reg52.h"
sbit open=P3^0;
sbit led=P2^0;
void delay(unsigned int n);
void main()
{
while(1)
{
if(open==0)
{
while(open==0);//一直按下k2按键,while语句一直执行,松开后,执行取反
led=~led;
}
}
}
但在这里,我们要注意的是按键抖动(详细搜索按键抖动方面的拓展)
因此我们要进行消抖操作,代码如下:
#include"reg52.h"
sbit open=P3^0;
sbit led=P2^0;
void delay(unsigned int n);
void main()
{
while(1)
{
if(open==0)
{
delay(3000);
while(open==0);
delay(3000);
led=~led;
}
}
}
void delay(unsigned int n)
{
while(n--);
}
(2)独立按键实现led的二进制操作
已知0亮1灭,那能不能让led灯像二进制加法运算那样让led灯进行亮灭呢?
总结上面的代码,我们不难写出:
#include"reg52.h"
sbit open=P3^0;
void delay(unsigned int n);
void main()
{
while(1)
{
if(open==0)
{
delay(3000);
while(open==0);
delay(3000);
P2--;//因为P2默认是0xff(1111 1111)
}
}
}
void delay(unsigned int n)
{
while(n--);
}
由独立按键的二进制操作以及流水灯的循环点亮,我们也不难写通关独立按键来让led灯依次点亮
#include"reg52.h"
sbit open=P3^0;
void delay(unsigned int n);
void main()
{
char led=0x01;
while(1)
{
if(open==0)
{
delay(3000);
while(open==0);
delay(3000);
P2=~led;
led=led<<1;
}
}
}
void delay(unsigned int n)
{
while(n--);
}