51单片机-独立按键控制LED

1.   51单片机独立按键的位置:

独立按键的定义:独立按键相当于一种电子开关,按下时开关接通,松开时开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通和断开;

在整个51开发板的左下角,有4个独立按键,这一篇文章主要对这4个按键进行理解;

2.使用位寄存器控制LED开关

寄存器内部存在位寄存器   Bit Registers  可单独定义每一位-----P2_0   P2_1  等等;

#include <REGX52.H>
#include <INTRINS.H>

void main()
{
	P2_0=0;//表示第一个灯
	P2_1=1;//表示第二个灯
	P2_2=0;//表示第三个灯
	P2_3=1;//表示第四个灯
	P2_4=0;//表示第五个灯
	P2_5=1;//表示第六个灯
	P2_6=0;//表示第七个灯
	P2_7=0;//表示第八个灯
	while(1)
	{
		
	}
}

其中:

P2_0 = 0xA0;     P2_1 = 0xA1;     P2_2 = 0xA2;    P2_3 = 0xA3;    P2_4 = 0xA4;
P2_5 = 0xA5;     P2_6 = 0xA6;     P2_7 = 0xA7;   再一次验证了51单片机接收十六进制位;

2.用第一个独立按键去控制LED灯的亮灭:

 原理:首先我们要懂,任何代码的表示方式都基于我们的原理图;也就是说原理图上显示LED灯的引脚接到芯片P3_1上,所以我们的循环语句用到  P3_1   ,   p3_1==0的意思引脚工作状态下,也就是我们按下第一个独立按键的时候,默认不按第一个独立按键的时候,就是if语句的否则状态,也就是else,所有灯都是灭的状态;

#include <REGX52.H>
#include <INTRINS.H>

void main()
{
	
	while(1)
	{
		if(P3_1==0)
		{
			P2_0=0;//表示第一个灯
			P2_1=0;//表示第二个灯
			P2_2=0;//表示第三个灯
			P2_3=0;//表示第四个灯
			P2_4=0;//表示第五个灯
			P2_5=0;//表示第六个灯
			P2_6=0;//表示第七个灯
			P2_7=0;//表示第八个灯
		}
    else
		{
			P2_0=1;//表示第一个灯
			P2_1=1;//表示第二个灯
			P2_2=1;//表示第三个灯
			P2_3=1;//表示第四个灯
			P2_4=1;//表示第五个灯
			P2_5=1;//表示第六个灯
			P2_6=1;//表示第七个灯
			P2_7=1;//表示第八个灯
		}
	}
}

下述代表简单引进第二个独立按键:

 P3_1  表示第一个独立按键; P3_0  表示第二个独立按键;按位与&& 的功能是只有当同时按下 独立按键1  和  独立按键2 的情况下,8个LED灯才会亮;        

#include <REGX52.H>
#include <INTRINS.H>

void main()
{
	
	while(1)
	{
		if(P3_1==0&&P3_0==0)
		{
			P2_0=0;//表示第一个灯
			P2_1=0;//表示第二个灯
			P2_2=0;//表示第三个灯
			P2_3=0;//表示第四个灯
			P2_4=0;//表示第五个灯
			P2_5=0;//表示第六个灯
			P2_6=0;//表示第七个灯
			P2_7=0;//表示第八个灯
		}
    else
		{
			P2_0=1;//表示第一个灯
			P2_1=1;//表示第二个灯
			P2_2=1;//表示第三个灯
			P2_3=1;//表示第四个灯
			P2_4=1;//表示第五个灯
			P2_5=1;//表示第六个灯
			P2_6=1;//表示第七个灯
			P2_7=1;//表示第八个灯
		}
	}
}

3.按位左移<<  和  按位右移>> 的意思:

0011  1100<<1   ->    0111  1000    按位左移1个字符表示高位移出一个字符,低位补0;

0011  1100>>1   ->    0001  1110    按位右移1个字符表示低位移出一个字符,高位补0;

4.  按键的抖动:

对于机械开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个开关在闭合时不会马上稳点的接通,在断开时也不会一下子断开,所以在开关闭合及断开的瞬间会伴随一连串的抖动。

5. 独立按键实现按一下亮、按一下灭:   

 P3_1==0  表示按下按键 执行亮灯操作;两个延迟Delay表示按下和松开时的抖动;

特别注意:取反~    -------  表示1  0 两种状态相互交替  即按下亮 再按一下灭;

#include <REGX52.H>
#include <INTRINS.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;//取反的意思是1号LED亮灭亮灭;
		}//1  0  进行循环;
	}
}

    while(P3_1==0)表示判断独立按键的状态,只要按键,我的while语句为空,所以只要判断在按键的状态-----我的灯就没有反映(灯亮就一直亮,知道松开按键;灯灭就一直灭,知道松开按键),只要判断状态为松开按键,我就进行取反操作,灯一亮一灭;

    while(P3_1==0)  如果我按键后没有任何操作,判断一直在按键状态,我让他进行空循环;

延迟函数Delay 延迟的时间为 我按键以后灯的反应时间,也就是我按下按键  假设Delay=1000,我需要等1秒,灯才会有反应;

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

P2_ 表示8位;  P3_  表示1位;

 思路:上面是延迟函数;下面定义一个新函数unsigned char LED_L=0;

8位也就是:0000 0000 每次LED_L++; 二进制加法; 逢二进一;进行运算;

0000 0001;0000 0010;0000 0011;0000  0100;

取反:1111 1110;1111 1101;1111 1100;1111 1011;低电平亮灯   ;注意定义新函数初始化0的这种思路;

#include <REGX52.H>
#include <INTRINS.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 LED_L=0;
	while(1)
	{
		if(P3_1==0)
		{
			Delay(20);//按下按键以后的抖动延迟
		  while(P3_1==0);
			Delay(20);//松开按键以后的抖动延迟
			LED_L++;
			P2=~LED_L;
		}
	}
}

6.独立按键控制LED移位:(简单来说就是按下按键流水一次,就是灯往后亮一次)

 思路:上面是延迟函数;下面一样,只要我按键,我就执行语句,定义函数初始值0;++每次加1,只要超过8,我就初始化,8个灯进行循环,在十六进制0X01也就是1的基础上进行移位操作,每次向左移位LED_L个位  , 取反,保证低电平输出;

#include <REGX52.H>
#include <INTRINS.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 LED_L=0;
	while(1)
	{
		if(P3_1==0)
		{
			Delay(20);//按下按键以后的抖动延迟
		  while(P3_1==0);
			Delay(20);//松开按键以后的抖动延迟
			LED_L++;
			if(LED_L>=8)
				LED_L=0;//保证8个灯开始循环
			P2=~(0X01<<LED_L);
		}
	}
}

实现按下独立按键1,从左向右按位亮灯;按下独立按键2,从右向左按位亮灯;

#include <REGX52.H>
#include <INTRINS.H>

void Delay(unsigned int xms)
{
	unsigned char i,j;
	while(xms)
	{
		i=2;
		j=239;
		do
		{
			while(--j);
		}
		while(--i);
	}
	
}
void main()
{
	while(1)
	{//实现从左向右按位亮灯
		if(P3_1==0)
	{
		unsigned char LED=0;
		Delay(20);
		while(P3_1==0);
		Delay(20);
		LED++;
		if(LED>=8)
			LED=0;
		P2=~(0X01<<LED);
	}
	  if(P3_0==0)
	{//实现从右向左按位亮灯
		unsigned char LED=0;
		Delay(20);
		while(P3_0==0);
		Delay(20);
		if(LED==0)
			LED=7;
		else
			LED--;
		P2=~(0X01<<LED);
	}
	}
}

  • 36
    点赞
  • 109
    收藏
    觉得还不错? 一键收藏
  • 18
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值