今天,我们来学习关于独立按键来控制led灯的知识。

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

首先是来用一个独立按键控制一个led灯的亮灭。其中独立按键由P3表示,其具体电路图如下

                  

 其中第一个按键为P3_1,第二个按键为P3_0,第三个按键为P3_2,第四个按键为P3_3,很明显是单片机的创作人把第一个按钮和第二个按钮给搞混了,哈哈。如果按下第一个按键则表示为P3_1=0,因此其代码便可表示为

#include <REGX52.H>
void main()
{
   while(1)
	 {
	   if(P3_1==0)
		 {
		    P2_0=0;
		 }
		 else
		 {
		    P2_0=1;
		 }
	 }

}

当按下按键,按键为0,此时小灯变亮,当再次按下,按键变为1,此时led灯熄灭。

2. 独立按键控制led状态

在开始之前需要提前补充一个小知识点,关于按键的抖动。

 由此我们可以看出当我们按下按键时它会抖动5-10ms松手时也会抖动5-10ms,因此为了避免抖动而产生的误差我们便需要延时函数来消除此的影响代码变为这样

#include <REGX52.H>
#include <INTRINS.H>
void Delay1ms(unsigned int xms)		//@11.0592MHz
{
	unsigned char i, j;
  while(xms)
	{
	_nop_();
	_nop_();
	_nop_();
	i = 11;
	j = 190;
	do
	{
		while (--j);
	} while (--i);
  xms--;
	}
}

void main()
{
  while(1)
	{
	  if(P3_1==0)
		{
		  Delay1ms(20);
			while(P3_1==0)
				Delay1ms(20);
				
		}
	}
}

这样我们就消除了抖动给我们的影响,如果还不理解的朋友们可以试着将两个延时函数删掉,也许会有以下情况发生,例如当按下时led小灯会不亮,或者亮一下就灭了,这都是抖动带给我们的影响,因此消除抖动的影响很重要。完整代码为

#include <REGX52.H>
#include <INTRINS.H>
void Delay1ms(unsigned int xms)		//@11.0592MHz
{
	unsigned char i, j;
  while(xms)
	{
	_nop_();
	_nop_();
	_nop_();
	i = 11;
	j = 190;
	do
	{
		while (--j);
	} while (--i);
  xms--;
	}
}

void main()
{
  while(1)
	{
	  if(P3_1==0)
		{
		  Delay1ms(20);
			while(P3_1==0)
				Delay1ms(20);
			P2_0=~P2_0;
		}
	}
}

这样就实现了独立按键控制led状态。

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

要实现此功能需要一个中间变量来实现,需要unsigned char这个类型,因为我们要让它呈二进制发亮因此设unsigned char lednum=0;意思是lednum=0000 0000;让它一次循环加一,并且用它的按位取反就可以实现了。代码为

#include <REGX52.H>
#include <INTRINS.H>
void Delay(unsigned int xms)		//@11.0592MHz
{
	unsigned char i, j;
  while(xms--)
	{
	_nop_();
	_nop_();
	_nop_();
	i = 11;
	j = 190;
	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;
		   
		 }
	 }


}

4. 独立按键控制led的移位

要想实现这个功能我们需要学习一个移位符号<<和>>,一个代表左移一个代表右移,例如0x01<<1,表示0000 0001向左移一位变成0000 0010,如果再将其按位取反,就变为1111 1101,这样我们就可以很轻松的来控制其移位,另外还需要注意的是,如果移了8位之后,需要让其归零,才能继续让其移位,向左移很好理解,向右移就是向右移一位就相当于向左移动了7位,这样向右移动的代码也很简便的写了出来,代码可以表示为

#include <REGX52.H>
#include <INTRINS.H>
void Delay(unsigned int xms)		//@11.0592MHz
{
	unsigned char i, j;
  while(xms--)
	{
	_nop_();
	_nop_();
	_nop_();
	i = 11;
	j = 190;
	do
	{
		while (--j);
	} while (--i);
  
	}
}
unsigned char lednum=0;
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);
		 
		 }
	 }


}

这样我们就表示出来了控制led的移位情况。

物联沃分享整理
物联沃-IOTWORD物联网 » 独立按键控制led灯

发表评论