从零开始的单片机世界(2)——独立按键操作LED灯

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值