单片机C51(STC89C52RC)独立按键控制LED亮灭、状态、显示二进制、位移

文章详细介绍了如何使用独立按键控制LED灯的亮灭、状态、显示二进制数值以及位移,重点讨论了按键抖动问题及其软件消抖方法,并提供了相应的C语言代码示例。同时,展示了如何通过位运算来控制LED灯的不同显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1.独立按键控制LED灯亮灭

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

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

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

5.附录


1.独立按键控制LED灯亮灭

独立按键控制LED灯状态,在独立按键按下时,LED灯点亮,松手后LED灯熄灭。独立按键按下为0,松开为1,在STC89C52RC芯片上,P2为LED灯IO口,P2_0表示第一个LED灯,其他LED灯以此类推,可以通过查看芯片原理图知道。

 

#include <REGX52.H>

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

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

        机械式按钮按下或释放时,由于机械弹性作用的影响,总是伴随有一定时间的触点机械抖动,之后触点才稳定下来。在抖动期间,触点的连接状态、导电特性不稳定,接口信号的电平也不稳定,其抖动过程如图 所示,图中 t1和 t3 为抖动时间,其时长与按钮开关的机械特性有关,一般20ms;t2为按键闭合的稳定期,其时间由使用者按键的动作确定,一般为几百毫秒以上, t0和t1为按键释放期。
        与处理速度为微秒级的单片机相比而言,这种机械抖动是不可忽略的。如果在触点抖动期间进行按键的通断状态检测,那么可能会导致判断出错,即按键一次操作(按下或释放)被错误地认为是多次操作,从而使单片机产生错误的动作,这是不允许出现的。因此,为了避免按键触点机械抖动所导致的检测误判,必须采取相应的去抖动措施。消除按键抖动可以采用硬件方法,如在按键电路中增加 RS 触发器电路或 RC 积分电路进行消抖;也可采用软件方法,在按键扫描程序中增加相应的代码进行消抖。前者需要增加电路成本,且设备体积也随之增大;后者仅占用少量的 CPU 时间,单片机应用系统多采用软件方法消抖。
软件实现键信号去抖动处理的基本思想是:延时法,即当 CPU 检测到有按键按下时,执行一个20ms左右(时长可按键类型适当调整)的延时程序后再进行按键检测,如果检测到按键仍处于被按下状态,则确认按键被按下;反之,则认为是机械抖动引起的状态变化。对按键释放识别也是采用相同的办法处理。需要注意的是,如果单片机软件系统采用按键定时扫描方式,且扫描周期比软件去抖动的延时时间短,则需要对去抖动的延时程序做特殊的处理,否则可能会引起键盘误读错误。

#include <REGX52.H>
void Delay(unsigned int xms)		//@12.000MHz
{
	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;
			}
		}
	}

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

       unsigned char 表示0~255的八位二进制数,与LED灯IO口位数正好相同。

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

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

        通过独立按键控制LED灯向左或者向右位移

#include <REGX52.H>
unsigned char LEDNum;
void Delay(unsigned int xms)		//@12.000MHz
{
	unsigned char i, j;
	while(xms)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
		xms--;
	}
	}
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);
		}
	}
}

5.附录

 <<位运算,0x01<<a 表示将1按位向左移动a位

例如:0000 0001<<1表示0000 0010

~是取反运算符~(0x01)表示1111 1110

评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

FightingLod

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

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

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

打赏作者

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

抵扣说明:

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

余额充值