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

目录

一、独立按键模块原理图详解

二、独立按键控制LED亮灭

1、编写程序

2、实物展示

三、独立按键控制LED状态

1、按键抖动

2、编写程序

3、实物展示

四、独立按键控制LED显示二进制

1、编写程序

2、实物展示

五、独立按键控制LED移位

1、编写程序

2、实物展示


一、独立按键模块原理图详解

 右边接地,左边四个口分别连接到单片机的P3.0~P3.3;

要注意RXD与TXD的顺序与上面不一致。K1对应P3.1,K2对应P3.0,K3对应P3.2,K4对应P3.3

因为单片机上电时,I/O默认为高电平,所有按键没有按下时,则I/O口为高电平;按键按下时,I/O变为低电平


二、独立按键控制LED亮灭

1、编写程序

#include <REGX52.H>

void main()
{
	while(1)
	{
		if(P3_1==0)		//如果K1按键按下,P3.1口为低电平
		{
			P2_0=0;		//则P2.0口为低电平,LED灯D1亮
		}
		else
		{
			P2_0=1;		//K1按键没有按下,P3.1口为高电平
		}				//则P2.O为高电平,LED灯D1灭
	}
}

 

2、实物展示

独立按键控制LED灯亮灭


三、独立按键控制LED状态

1、按键抖动

对于机械开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开,所以在开关闭合及断开的瞬间会伴随一连串的抖动。

 所以需要用软件延时消除按键抖动

 

2、编写程序

#include <REGX52.H>

void Delay(unsigned int xms)		//@12.000MHz,延迟1ms,x为无符号整数参数
{
	unsigned char i, j;				//定义i、j为无符号字符
    while(xms)						//将延迟1ms函数循环x次
    {
	i = 2;
	j = 239;
	do
	    {
		while (--j);
	    } while (--i);				//将程序延迟1ms
    xms--;							//每循环一次,x自动减1
    }
     
}

void main()
{
	while(1)
	{
		if(P3_1==0)				//如果独立按键K1被按下,则P3_1==0
		{
			Delay(20);			//延时20ms,为了消除按键抖动
			while(P3_1==0);		/*如果延时后,K1还是被按下,程序会一直执行空循环
								循环体不执行程序,则等同while后加分号*/
			Delay(20);			//程序跳出循环,说明K1按键被松手
			P2_0=~P2_0;			//将D1灯取反
		}
	}
}

 

3、实物展示

独立按键控制LED状态


四、独立按键控制LED显示二进制

1、编写程序

#include <REGX52.H>

void Delay(unsigned int xms)		
{
	unsigned char i, j;				
    while(xms--)					//--在后,则是操作完xms的循环体,自动减1
    {								
		i = 2;							
		j = 239;
		do
	    {
			while (--j);			//--在前,则是在操作j前,自动减1
	    } while (--i);				
    }
} 
	
void main()
{
	unsigned char LEDNum=0;			//无符号字符型,正好是8位二进制
	while(1)
	{
		if(P3_1==0)
		{
			Delay(20);
			while(P3_1==0);
			Delay(20);
			
			LEDNum++;		    //每按键一次,LEDNum就自动加1
			P2=~LEDNum;		    //因为LED灯是0才亮,1为灭,所以需要取反才是刚好显示二进制
		}

	}
}

 

2、实物展示

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


五、独立按键控制LED移位

1、编写程序

#include <REGX52.H>
void Delay(unsigned int xms);		//函数放后面,一定要再前面声明这个函数

unsigned char LEDNum;			//全局变量,所有函数都可用
								//没有给初始值,默认为0
void main()
{
	P2=~0x01;
	while(1)
	{
		if(P3_0==0)
		{
			Delay(20);
			while(P3_0==0);
			Delay(20);

			LEDNum++;				//每按键一次,LEDNum自动加1
			if( LEDNum>=8)
				LEDNum=0;			//如果中括号中只有一句程序,可以省略
			P2=~(0x01<<LEDNum);		//每按键一次K2,就将0000 0001中的1向左移一位
									//每按键一次K2,就将D1灯向右移一位
		}
		if(P3_1==0)
		{
			Delay(20);
			while(P3_1==0);
			Delay(20);


			if(LEDNum==0)
				LEDNum=7;
			else
				LEDNum--;			//每按键一次,LEDNum自动减1
			P2=~(0x01<<LEDNum);		//每按键一次K1,就将0000 0001中的1向右移一位
									//每按键一次K1,就将D1灯向左移一位
		}
	}
	


}

void Delay(unsigned int xms)		//@12.000MHz,延迟1ms,x为无符号整数参数
{
	unsigned char i, j;				//定义i、j为无符号字符
    while(xms--)					//将延迟1ms函数循环x次
    {								//--在后,则是操作完xms的循环体,自动减1
		i = 2;							
		j = 239;
		do
	    {
			while (--j);				//--在前,则是在操作j前,自动减1
	    } while (--i);				//将程序延迟1ms
    }
} 
	

 

2、实物展示

独立按键控制LED移位

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

剑鞘的流苏

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

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

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

打赏作者

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

抵扣说明:

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

余额充值