51单片机独立按键控制LED灯学习笔记

1.独立按键控制LED亮灭

在51单片机上一共有4个独立按键,这四个键都由P3来表示具体按键就用P3_1(或0或2或3)来指向4个独立按键

而想要用独立按键控制LED亮灭,那么我们可以用if  else的方式实现.

#include <REGX52.H>

void main()
{
	
	while(1)
	{
		if(P3_1==0)//独立按键按下
		{
			P2_0=0;//第一个LED就会亮
		}else{
			P2_0=1;//独立按键没被按压时,第一个LED就会灭
		}
	}
}

2.独立按键控制LED的状态

独立按键控制LED亮灭时,并不是我们在按键上松手时,LED变亮或不亮,因此我们需要用延迟之前的状态的方法来进行改进

但是,当我们按下按键或松开按键时,按键里面的金属片总会抖动,即使我们肉眼无法观察到,但是计算机上却可以精准的计算出来,为了让LED灯确确实实地亮一次,我们可以在通过延迟LED灯的亮灭,来实现让LED灯在抖动期间保持前面稳定时的状态

#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;//"~"表示取反的意思  如二进制中0取反就是1,1取反就是0
		}              //从而让第一个LED灯的状态进行转换  
	}
}

 

3.独立按键控制LED显示二进制

想让LED灯通过一个独立按键的操作来逐个点亮,我们便可以用取反的思路来进行,

如十进制的1转换成二进制0000 0001,然后在进行取反就是1111 1110,这样就可以让第一个LED灯亮起来,

像十进制的3转换成二进制0000 0011,然后在进行取反就是1111 1100,这样第一个和第二个LED灯就会亮起来

所以代码可以像下图这样写

#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()
{
	unsigned char LEDNum=0;//用char是因为它刚刚好与8位二进制的表达相同
	while(1)
	{
		if(P3_1==0)//独立按键按下
		{
			Delay(20);
			while(P3_1==0);
			Delay(20);//按键消抖处理
			
			LEDNum++;
			P2=~LEDNum;
		}
	}
}

4.独立按键控制LED移位

在独立按键控制LED显示二进制中,我们发现一个比较麻烦的事情,就是独立按键并不能让LED灯的光可以一次性的在下一个LED灯处发亮,反而是要按下多次按键才能到达,因此按多了手指也会感到累,并且按键只能让LED灯在一个方向上移动,不能够左右移动。

想要改进,我们可以运用"<<"这个符号

而这个符号表示移位

比如1111 1110中进行0x00<<1,就是让0像左移一位,即1111 1101

然后将一个按键的代码在复制下来并稍微改一下就可以让另一个独立按键实现让LED灯向反方向进行移动。

#include <REGX52.H>

void Delay(unsigned int xms);//声明

unsigned char LEDNum;//在外部设一个变量,这样能狗在任意一个函数中使用

void Delay(unsigned int xms)		//延迟时间函数
{
	unsigned char i, j;
	while(xms)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
		xms--;
	}

}

void main()
{
	P2=~0x01;//P2在二进制就表示1111 1110
	while(1)
	{
		if(P3_1==0)//第一个独立按键被按下
		{
			Delay(20);
			while(P3_1==0);
			Delay(20);//按键消抖处理
			
			LEDNum++;
			if(LEDNum>=8)//如果到了最后一个LED灯,那么在继续下去就可以
			{            //让LED循环到第一个
				LEDNum=0;
			}
			P2=~(0x01<<LEDNum);//可以实现每按一次独立按键,LED灯就会向下一个LED灯移动
		}
		if(P3_0==0)//第二个独立按键被按下
		{
			Delay(20);
			while(P3_0==0);
			Delay(20);//消抖处理
			
			if(LEDNum==0)
			{
				LEDNum=7;
			}else{
				LEDNum--;
			}
			P2=~(0x01<<LEDNum);
		}
	}
}

  • 2
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜雨星辰487

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值