51单片机按键与LED的几个操作实例

建立工程的方式之前有提到过,P2和P3分别是LED和按键的寄存器组,之前的博客里详细分析过。

按键抖动及消除方法

首先说一下按键抖动,对于机械键盘,当触点断开、闭合时,由于机械触电点的弹性作用,一个开关在闭合或者断开时不会马上接通或者断开,而是会伴随一连串抖动。

在这里插入图片描述

抖动的时间大概在5~10ms,我们肉眼是无法分辨的,但是会被单片机检测出来。

消抖分为硬件消抖和软件消抖。

硬件消抖

主要是在电路设计的时候加上电容或者其它消抖电路。很麻烦,不方便实现。、

软件消抖

在检测按键状况的时候设置延时,将抖动的时间给过滤掉。

while(P3_1 == 0)
		{
			Delay(20);
			while(P3_1 == 0);//检测松手
			Delay(20);
    
    		//这里可以写主体函数。
		}

按键控制LED显示二进制

#include<REGX52.H>
// 定义一个延时函数,参数为延时的毫秒数。函数是通过STC-IPS软件生成的
void Delay(unsigned int xms)		//@12.000MHz
{
	while(xms--)
	{
		unsigned char i, j;

		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}
/*由于LED在MCU端口输出低电平的时候为亮,所以不能直接把二进制显示出来。
先定义一个字符来表示二进制数,每次按下按键后,该字符自增。同时P2显示该字符取反后的值,就能通过按键控制LED显示二进制*/
void main()
{
	unsigned char LEDNum = 0;
    while(1)
    {
		while(P3_1 == 0)
		{
			Delay(20);
			while(P3_1 == 0);//检测松手
			Delay(20);
			
			LEDNum++;
			P2 = ~LEDNum;
		}
    }
}

按键控制LED左移右移

#include<REGX52.H>
void Delay(unsigned int xms);//声明延时函数
void main()
{
	unsigned char LEDNum = 0;//定义一个参数来保存P2的状态,,原理同上
	P2 = ~0x1;//初始化一下LED的状态,让第一个LED灯亮
    while(1)
    {
		while(P3_1 == 0)//按键K1控制LED左移,每按一次向左移动一位
		{
			Delay(20);
			while(P3_1 == 0);//检测松手
			Delay(20);
			
			LEDNum++;
			if(LEDNum >= 8)//当参数大于8,让它归零,回到最右边
			{
				LEDNum = 0;
			}
			
			P2 = ~(0x00000001 << LEDNum);
		}
		while(P3_0 == 0)//按键K1控制LED右移,每按一次向右移动一位
		{
			Delay(20);
			while(P3_0 == 0);//检测松手
			Delay(20);
			
			if(LEDNum == 0)//当按键小于零,让它为8,回到最左边
			{
				LEDNum = 8;
			}
			LEDNum--;
			
			P2 = ~(0x00000001 << LEDNum);
		}
    }
}


void Delay(unsigned int xms)		//@12.000MHz
{
	while(xms--)
	{
		unsigned char i, j;

		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}

现象就不详细概述了,烧录程序可以之间观察到现象。如果出现问题,可能是按键管脚口的选择出错了,查一下电路原理图进行修改。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值