使用C51单片机(STC89C52RC)实现独立按键控制LED灯的开关、状态显示、二进制表示和位移操作

目录

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

物联沃分享整理
物联沃-IOTWORD物联网 » 使用C51单片机(STC89C52RC)实现独立按键控制LED灯的开关、状态显示、二进制表示和位移操作

发表评论