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

按键抖动及消除方法

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

image.png

抖动的时间大概在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);
	}
}

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

————————————————

版权声明:本文为CSDN博主「孤心亦暖」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/Destiny_Di/article/details/126781175