51单片机—独立按键的控制

发布于:2022-12-26 ⋅ 阅读:(700) ⋅ 点赞:(0)


一、独立按键的介绍 

     1.按键介绍

        轻触按键,相当于一种电子开关,按下使开关接通,松开时开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通断开。

     2.按键原理图

K1、K2、K3、K4一公共端接GND,另一端分别接单片机I/O口的P3^0到P3^3,因为单片机4组I/O口P0—P3都是高电平有效,当按键按下时,将I/O口拉到低电平使按键有效。

3.按键抖动

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

当没有按键按下时,电平为高电平,按下时,为0(由于机械触电,会弹逐渐稳定为0),机械开关抖动时间为5—10ms(不同开关时间不同),经过手松开的时间,若松开按键,经过5—10ms时间会逐渐回高电平。

 4.按键的消抖

(1)硬件消抖

    加一个电路,把电线通过电路,经过触发器之类的操作进行电路过滤。

(2)软件消抖

    检测按键按下时,延时时间,再继续操作,松手也同样道理。

二、独立按键控制LED指示灯亮灭

当按下k1时,LED小灯D1亮起,松开按键时D1灭掉;

当按下k2时,   LED小灯全都亮起,再次按下时全都灭掉;

当按下k3时,LED小灯向右移位,按下k4时LED小灯向左移位;

有兴趣的小伙伴可以尝试一下将LED小灯亮灭做成二进制递增的形式。

代码示例:

/******************** *******************
 *** 项目名称:独立按键控制LED灯开关
 *** 项目效果:当按下k1时,LED小灯D1亮起,松开按键时D1灭掉;当按下k2时,LED小灯全都亮起,再次按下时全都灭掉;当按下k3时,LED小灯向右移位,按下k4时LED小灯向左移位
 *** 连线方式:无
 *** 注意事项:无
********************* *******************/
#include "reg52.h"
#include "intrins.h"

//用u8,u16代替方便编写代码
typedef unsigned char u8;       //0—255
typedef unsigned int u16;				//0—65535

#define LED P2

/*定义管脚*/
//独立按键
sbit k1 = P3^1;
sbit k2 = P3^0;
sbit k3 = P3^2;
sbit k4 = P3^3;

u16 i ;								//定义判读哪一个按键按下
u16 s ;
u16 LedNum;						//定义led灯移位

/***************************
** 函数名称 :Delay_ms 
** 函数作用 :延时函数 
** 输入	    :ms(毫秒数)  
** 输出     : 
** 注意     :输入不能超出范围,否则会回到周期 
****************************/ 
int Delay_ms(u16 ms)		 
{
	unsigned char i, j;

	while(ms)
	{
			_nop_();
			i = 2;
			j = 199;
			do
			{
				while (--j);
			} while (--i);
			ms--;
	}

}

/***************************
** 函数名称 :Key_k1
** 函数作用 :当按下k1时,LED小灯D1亮起,松开按键时D1灭掉 
** 输入	    :无 
** 输出     :无
****************************/
void Key_k1()
{
	if(k1 == 0)
	{
		LED = 0xFE;//让D1亮起来
	}
	else{
	  LED = 0xFF;
	}
}
/***************************
** 函数名称 :Key_k2
** 函数作用 :当按下k2时,LED小灯全都亮起,再次按下时全都灭掉 
** 输入	    :无 
** 输出     :无
****************************/
void Key_k2()
{
	if(k2 == 0)						//判断按键按下
	{
		 Delay_ms(10);			//延时消抖
		 if(k2 == 0)				//再次判断是否按下
		 {
				LED = ~LED;     //取反LED灯的状态//这种效果是按下不松手一直亮,松手即灭
		 }
		 while(!k2);				//判断是否松开按键
	}
	//== 另一种写法 ==//
//	if(k2 == 0)						//判断按键按下
//	{
//		 Delay_ms(10);			//延时消抖
//		 while(k2 == 0);  	//再次判断是否按下
//	   Delay_ms(10);      //检测松手
//	   LED = ~LED;				//这种效果是按下不松手不亮,松手即亮
//	}
	
}
/***************************
** 函数名称 :Key_k3_k4 
** 函数作用 :当按下k3时,LED小灯向右移位,按下k4时LED小灯向左移位
** 输入	    :无 
** 输出     :无
** 注意     :这里没有初始化,D8开始没有亮,只是为了方便写函数
****************************/
void Key_k3_k4()
{
	 if(k3 == 0)						//判断k3按键是否按下
	 {
			Delay_ms(10);			  //消抖
			while(k3 == 0); 		//再次判断是否按下
			Delay_ms(10);				//消抖  
		  //== 操作 ==//
		  LedNum++;
			if(LedNum >= 8)			//限制控制大小
			{
				LedNum = 0;
			}
			LED = ~(0x80 >> LedNum);		//移位			
	 }
	 if(k4 == 0)
	 {
			Delay_ms(10);			  //消抖
			while(k4 == 0); 		//再次判断是否按下
			Delay_ms(10);				//消抖
		  //== 操作 ==//
			if(LedNum == 0)			//限制控制大小
			{
				LedNum = 7;
			}
			else
				LedNum--;
			LED = ~(0x80 >> LedNum);		//移位	
		 
	 }
}

/***************************
** 函数名称 :Judgement
** 函数作用 :判断哪一个按键成功按下
** 输入	    :P3 
** 输出     :无
****************************/
int Judgement()
{
	if(k1 == 0)
	{
		i = 1;
	}
	if(k2 == 0)
	{
		i = 2;
	}
	if(k3 == 0 || k4 == 0)
	{
	  i = 3;
	}
	return i;
}

/***************************
** 函数名称 :main 
** 函数作用 :主函数 
** 输入	    : 
** 输出     : 
****************************/ 
void main()
{
	while(1)
	{
		i = Judgement();
		switch(i)
		{
			case 1: 
				     Key_k1();
						 break;
			case 2:
    				 Key_k2();
						 break;
			case 3: 
     				 Key_k3_k4();
						 break;
			default: 
						 LED == 0x00;
					   break;
		}
	}	
} 

三、按键实验视频

独立按键控制LED灯视频


总结


以上就是独立按键的简单介绍与应用。

本文含有隐藏内容,请 开通VIP 后查看