独立按键控制LED

目录

1.按键介绍​编辑

2.通过独立按键控制LED灯亮灭

3. 按位与 &

4.按位或 |

5.按位异或 ^   

7.按键的抖动​编辑

8.独立按键控制LED灯状态

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

10. 独立按键控制LED灯移位​编辑


1.按键介绍

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

 

2.通过独立按键控制LED灯亮灭
#include <REGX52.H>

void main()
{
	while(1)
	{
		if(P3_1==0)
		{
		P2_0=0;
		}
		else
		{
			P2_0=1;
		}
	}
}

当P3_1按下时为0,P2_0=0 LED灯亮 ,当P3_1未按下时为1,P2_0=1 LED灯灭 

3. 按位与 &

例如 1010 1100 &

        1001 1010

------------------------------------

         1000 1000

1&1-> 1    1&0-> 0   0&0-> 0

4.按位或 |

例如 1010 1100 |

        1001 1010

------------------------------------

         1011 1110

1|1-> 1    1|0-> 1   0|0-> 0

5.按位异或 ^   

(一样-> 0 不一样-> 1)

例如 1010 1100 ^

        1001 1010

------------------------------------

         0011 0110

1^1-> 0    1^0-> 1   0^0-> 0

6.按位取反 (~ 1->0 ~0->1)

例如 ~1010 1100->0101 0011

7.按键的抖动

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

未按下时高电平,一段时间后稳定,进入低电平

我们可以通过延时函数Delay 进行消抖

8.独立按键控制LED灯状态
#include <REGX52.H>
void Delay(unsigned int xms)		//1ms延时函数
{
	unsigned char i, j;
while(xms)                          //xms ms
{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	xms--;
}
}
void main()
{
	while(1)
	{
		if(P3_1==0)
		{
			Delay(20);  //延时20 ms
			while(P3_1==0); //按下时LED灯不亮 松手时LED灯亮 一直按着不松手LED灯就不会亮
			Delay(20);
			P2_0=~P2_0; //按位取反 一个周期后灭  亮 灭 亮 灭 亮 灭
		}
	}
	
}

9. 独立按键控制LED灯显示二进制
#include <REGX52.H>
void Delay(unsigned int xms)		//xms ms
{
	unsigned char i, j;
while(xms)
{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	xms--;
}
}
unsigned int a =0;
void main()
{
	while(1)
	{
		if(P3_1==0)
		{
			Delay(20);
			while(P3_1==0);
			Delay(20);
			a++;
			P2=~a;  //1 为灭 0为亮 所以取反
		}
	}
	
}

由于上电后默认都是高电平

如果是P2++,因为默认都是高电平,P2->1111 1111   

                                                         P2++->0000 0000 

                                                       ~ P2++->1111 1111 

所以定义一个变量a

10. 独立按键控制LED灯移位

LED灯向左移动 

定义num 

num从0->7  当num==8时  num=0

0x01<<num

取反赋值给P2

LED灯向右移动同理   

#include <REGX52.H>
void Delay(unsigned int xms)		//xms ms
{
	unsigned char i, j;
    while(xms)
    {
	    i = 2;
	    j = 239;
	    do
	    {
		    while (--j);
	    } while (--i);
	    xms--;
    }
}
unsigned int num;
void main()
{
	while(1)
	{
		if(P3_1==0)
		{
			Delay(20);//消抖
			while(P3_1==0); //检测是否松手
			Delay(20);//第二次消抖
			if(num==8)
			{
				num=0;
			}
			P2=~(0x01<<num);//存在运算符优先级
			num++; 
		}                
		if(P3_0==0)
		{
			Delay(20);
			while(P3_0==0);
			Delay(20);
			if(num==0)
			{
				num=7;
			}
			else
				num--;
			P2=~(0x01<<num);
		}
	}
}

谢谢观看

  • 12
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值