基于STC89C52,使用独立按键对LED进行一些基础的控制

172 阅读3分钟

按键控制LED亮灭

首先我们需要对独立按键有一个基本的了解,通过查看原理图

TQ79DYMMFALRH6BK7RYSb7e0ffdbd24a0491.png

可以发现,该板子的独立按键与寄存器P3相连,独立按键的值存放在寄存器中,我们无法对其进行赋值,只能检查寄存器的值,当存放在寄存器中的值为0的时候,代表寄存器成功接地,即开关按下,寄存器中存放1,表示开关是弹开的。

所以我们可以通过这个特点来实现开关按下时灯亮,松开时灯熄:

#include <REGX52.H>

void main()
{
	while(1)							//注意放在循环体内
	{
		if(P3_0==0 || P3_1==0)					//开关按下,点亮
		{
			P2_3=0;
		}
		else								//开关松开,熄灭
			P2_3=1;
	}
}

按键控制LED状态

通过查询独立按键的特性具有如下特点

a415ebe2a169436f9c6538c8a19aad84c23c47c49872a163.png

当按键按下时金属片不会瞬间接通而是会回弹一段后稳定接通,松开时也不会瞬间松开,而是会回弹,通过了解,金属片状态改变时,回弹的时间大约为20ms,所以我们在按下和关闭按键时,要延迟大约20ms后再对按键状态进行判断。

总结逻辑为:当按键按下(寄存器中值为0)时,等20ms确保它稳定了,再对按钮状态判断,如果此时寄存器的值还是0,说明我们按下按键还没松开,程序就循环执行判断,一旦按键松开(寄存器中值不为0),跳出循环,等20ms确保它稳定了,对LED灯的值取反,即使其状态改变。此时成功完成了 一次按下松开按钮,使LED状态改变:

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

按键控制LED显示二进制

在按键控制LED状态的基础上,我们将每次按下并松开一次按钮后,添加一个对P2寄存器的值改变的操作,我们想要控制LED显示二进制,我们用0表示灯灭,一表示灯亮即变化规律为0000 0000->0000 0001->0000 0010->0000 0011,对应的二进制数在不断增大,而在LED灯的控制中,0为亮,1为灭,所以我们将P2的初值赋为0xFF,每控制一次按键,P2的值减少一个。

即可实现LED显示二进制:

#include <REGX52.H>

void Delay(int n)	//@12.000MHz		ms
{		
	unsigned char data i, j;
	while(n--)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}
 
void main()
{
	P2=0xFF;
	while(1)
	{
		if(P3_1==0)
		{
			Delay(20);
			while(P3_1==0);
			Delay(20);
			
			P2--;
		}
	}
}

按键控制LED移位

依旧是在按键控制LED状态的基础上,我们将每次按下并松开一次按钮后,添加一个对P2寄存器的值改变的操作,只是这一次是将LED移位,我们可以使用移位操作符<<和>>来实现左移和右移

使用一个无符号计数变量,num,每当按下左侧按钮(我这个板子为P3_1)时,num就会减少1;每当按下右侧按钮(我这个板子为P3_0)时,num就会增加1,操作完按钮后,就会根据num的值,对8取余,来对初始状态0xFE进行移位,实现按键控制LED移位:

#include <REGX52.H>

void Delay(int n)	//@12.000MHz		ms
{		
	unsigned char data i, j;
	while(n--)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}
unsigned int num=0;
void main()
{
	P2=0xFE;

	while(1)
	{
		if(P3_1==0)
		{
			Delay(20);
			while(P3_1==0);
			Delay(20);
			num--;
            P2=~(0x01>>(num%8));
		}
		if(P3_0==0)
		{
			Delay(20);
			while(P3_0==0);
			Delay(20);
			num++;
             P2=~(0x01<<(num%8));
		}
	}
}