独立按键控制LED(基于51单片机)

师从江科大

独立按键

轻触按键:

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

独立按键原理图:

 注:没有按下独立按键是高电平,按下则是低电平

注:K1是P3_1,K2是P3_0,K3是P3_2,K4是P3_3

独立按键控制LED亮灭代码

#include <REGX52.H>

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

 注:在51单片机中,寄存器是以8位为基本单位的。

C51数据运算

 注:C=5/2       C=2

        C=5%2     C=1

0011 1100<<1    ->      0111 1000  (按位左移)

0011 1100>>1    ->      0000 1111 (按位右移)

0001 1000 & 0010 1010     ->      0000 1000     (按位与)(对应位全为1才为1)

0001 1000 | 0010 1010     ->       0000 1000      (按位或)(对应位有1就为1)

0001 1000 ^ 0010 1010     ->       0011 001~0   (按位异或)(对应位一样为0,不一样为1)

~0001 1000                       ->       1110 0111      (按位取反)

按键抖动

 按键消抖

消除按键抖动通常有两种方法:硬件消抖和软件消抖。

硬件消抖

  1. RC滤波电路: 在按键的输入端接一个RC(电阻-电容)低通滤波器,利用电容充电放电的时间常数来延长按键信号变化的时间,自然过滤掉快速的抖动信号。当按键闭合或断开时,由于电容的存在,电压不会立刻稳定在高电平或低电平,而是经过一定时间后才稳定下来。

  2. 双稳态触发器: 使用如施密特触发器、D触发器或RS触发器等双稳态电路,只有当按键信号稳定在一个阈值以上或以下一段时间后,才会翻转状态,从而忽略短暂的抖动信号。

软件消抖

  1. 延时检测法: 当检测到按键按下时,程序并不立即响应,而是等待一段微秒或毫秒级别的延时(例如5ms~20ms),之后再次检查按键的状态。如果按键仍然保持在按下状态,则认为此次按键有效,进行相应的处理。

    1if (KEY == 0) { // 检测到按键按下
    2    DELAY_MS(15); // 延时消抖
    3    if (KEY == 0) { // 再次检测按键是否仍为按下状态
    4        // 执行按键处理代码
    5    }
    6}
  2. 循环检测法: 另一种软件消抖方式是在检测到按键按下的瞬间进入循环,循环内延时并持续判断按键是否释放,确保在按键稳定后执行一次操作。

    1while (KEY == 0) {
    2    DELAY_MS(10); // 循环延时
    3}
    4// 按键松开后,执行按键处理代码

通过这些方法可以有效地避免因机械开关触点接触不稳定导致的多次误触发问题,确保单次按键动作只被识别一次。

这里主要用到软件消抖。

独立按键控制LED状态代码

#include <REGX52.H>

void Delay(unsigned int xms)	//@12.000MHz
{
	unsigned char data 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;
		}
	}
	
}

代码注意点:

执行 while(P3_1==0); 这个循环,它会持续检查P3.1引脚的状态,只有当按键被释放(P3.1变为高电平)时,才会退出这个循环。这样做的目的是确保在执行后续操作(如状态翻转)前,按键确实已经稳定在释放状态,避免因按键弹起过程中的机械抖动而产生误操作

独立按键控制LED显示二进制代码

#include <REGX52.H>

void Delay(unsigned int xms)	//@12.000MHz
{
	unsigned char data i, j;
  while(xms--)
		{
				i = 2;
			j = 239;
			do
			{
				  while (--j);
			} while (--i);
		}
	
}

void main()
{
	unsigned char LEDNum=0;
	
	while(1)
	{
		if(P3_1==0)
		{
			Delay(20);
			while(P3_1==0);
			Delay(20);
			
			LEDNum++;
			P2=~LEDNum;
		}
	}
}

独立按键控制LED位移代码

#include <REGX52.H>
void Delay(unsigned int xms)	//@12.000MHz
{
	unsigned char data i, j;
  while(xms--)
		{
				i = 2;
			j = 239;
			do
			{
				  while (--j);
			} while (--i);
		}
	
}
	unsigned char LEDNum;
void main()
{
	P2=~0x01;
	while(1)
	{
		if(P3_1==0)
		{
	     Delay(20);
				while(P3_1==0)
				Delay(20);
				LEDNum++;
				if(LEDNum>=8)
					LEDNum=0;
				P2=~(0x01<<LEDNum);
		}		
		if(P3_0==0)
		{
	     Delay(20);
				while(P3_0==0)
				Delay(20);
				if(LEDNum==0)
					LEDNum=7;
				else
					LEDNum--;
				P2=~(0x01<<LEDNum);
		}
	}
	
}

若有侵权,请联系作者

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

乘~风

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

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

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

打赏作者

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

抵扣说明:

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

余额充值