独立按键1(超详细版)

大家好,上一篇我们一起学习了数码管的理论基础和代码书写思路,并学会数码管如何应用——多参数分时显示,今天我们将一起学习独立按键的基本理论和相关应用。
我的人生格言:“尽最大努力,做最好的自己!”

一、按键介绍

1.按键图

独立按键一端接I/O口,另一端接地。
在这里插入图片描述

看下图为独立按键模块,按键左端统一接P3口,右端均接地:

key1接P3^0,
key2接P3^1,
key3接P3^2,
key4接P3^3。

在这里插入图片描述

2.按键抖动

按键写代码一定要注意抖动

按键按下时,由于一端接地,会使按键接IO端变成低电平,相反,当按键被松开时,由于按键接IO端与接地端断开,会变成高电平。值得注意的是,按键是有一定弹性的,按键在按下时,按键接IO端变成低电平需要时间,这段时间按键会发生前沿抖动,同理,松开按键,按键接IO端变成高电平也需要一段时间,这段时间按键会发生后沿抖动,整个抖动需要5ms-10ms时间。

在这里插入图片描述

3.按键消抖

按键抖动大致有两个方向解决,分别为硬件消抖和软件消抖

1.硬件消抖
加一个电路,可以利用触发器等进行电路过滤。
2.软件消抖
(1)利用延时函数消抖。
(2)利用定时器精准消抖。
(2)中断法消抖

本章先我们简单使用延时函数进行代码讲解,后续会讲其他方法。

二、相关运用

1.简单实现按键控制8个LED的亮灭

(1)仿真图1

在这里插入图片描述

(2)代码1

key.c
这是按键控制模块,当按下key1的按键时,该模块函数key()会返回一个值,这个值表示第一个按键被按下。

#include "key.h"//独立键盘头文件
#include "delay.h"//延时头文件

/******************************************************************************************
函数名:key
功能:  独立键盘函数
参数:  无
返回值:unsigned char
******************************************************************************************/
unsigned char key()//独立键盘按键函数
{
	unsigned char temp=0;
	if(key1==0)//判断是否按下键盘
	{
		delay(10);//消抖
		if(key1==0)//再次判断是否按下键盘
		{
			temp=1;//键盘按下,中间值temp赋为1
		}while(key1==0);//松手等待
	}
	return temp;//返回中间值
}

key.h

#ifndef __KEY_H__
#define __KEY_H__

#include <reg51.h>//51头文件

sbit key1=P3^0;//与键盘连接的IO设置为key1

unsigned char key();//独立键盘函数声明

#endif


main.c

#include <reg51.h>//51头文件
#include "key.h"//独立键盘头文件

void main()
{
	while(1)
	{
		if(1==key())//判断返回值是否为1
		{
			P1=~P1;
		}
	}
}

2.按键显示数值

(1)仿真图2

开始默认界面:
在这里插入图片描述
按第二个按键key2,显示数值2:
在这里插入图片描述

(2)代码2

在这里插入图片描述
key.c

/******************************************************************************************
函数名:key
功能:  独立键盘函数
参数:  无
返回值:unsigned char
******************************************************************************************/
unsigned char key()//独立键盘按键函数
{
	static unsigned char temp=0;
	
	//方法一:
	/***if(key1==0)//判断是否按下键盘
	{
		delay(10);//消抖
		if(key1==0)//再次判断是否按下键盘
		{
			temp=1;//键盘按下,中间值temp赋为1
		}while(key1==0);//松手等待
	}
	if(key2==0)
	{
		delay(10);
		if(key2==0)
		{
			temp=2;
		}while(key2==0);
	}
	if(key3==0)
	{
		delay(10);
		if(key3==0)
		{
			temp=3;
		}while(key3==0);
	}
	if(key4==0)
	{
		delay(10);
		if(key4==0)
		{
			temp=4;
		}while(key4==0);
	}
	**/
	
	//方法二:
	if(key1==0||key2==0||key3==0||key4==0)
	{
		delay(10);
		if(key1==0||key2==0||key3==0||key4==0)
		{
			if(key1==0)
				temp=1;
			if(key2==0)
				temp=2;
			if(key3==0)
				temp=3;
			if(key4==0)
				temp=4;
		}while(key1==0||key2==0||key3==0||key4==0);
	}
	return temp;//返回中间值
}

key.h

#ifndef __KEY_H__
#define __KEY_H__

#include <reg51.h>//51头文件

sbit key1=P3^0;//与键盘连接的IO设置为key1
sbit key2=P3^1;//与键盘连接的IO设置为key2
sbit key3=P3^2;//与键盘连接的IO设置为key3
sbit key4=P3^3;//与键盘连接的IO设置为key4

unsigned char key();//独立键盘函数声明

#endif

main.c

#include <reg51.h>
#include "display.h"
#include "key.h"

void key_service();

void main()
{
	LEDBuf[0]=23;
	LEDBuf[1]=23;
	LEDBuf[2]=23;
	while(1)
	{
    key_service();
		
		display();
  }
}

void key_service()
{
	switch(key())
	  {
		  case 0:break;
		  case 1:
			  LEDBuf[3]=1;
		    break;
		  case 2:
			  LEDBuf[3]=2;
		    break;
		  case 3:
			  LEDBuf[3]=3;
		    break;
		  case 4:
			  LEDBuf[3]=4;
		    break;
		  default:break;
	  }
}

三、按键模块书写思路

按键模块主要有四步,即判断是否按下—>延时1ms—>再次判断是否按下—>松手等待,书写该按键函数,作用在于通过返回值判断哪个按键按下。

  • 6
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是基于51单片机独立按键按钮计数1到4的代码: ```c #include <reg52.h> // 51单片机头文件 #define uchar unsigned char // 定义uchar为unsigned char类型 sbit btn1 = P3^0; // 定义按键1引脚 sbit btn2 = P3^1; // 定义按键2引脚 sbit btn3 = P3^2; // 定义按键3引脚 sbit btn4 = P3^3; // 定义按键4引脚 void delay(unsigned int xms) // 延时函数 { unsigned int i, j; for (i = xms; i > 0; i--) for (j = 110; j > 0; j--); } void main() { uchar cnt = 0; // 计数器初始化为0 while (1) // 无限循环 { if (btn1 == 0) // 检测按键1状态 { delay(10); // 延时去抖 if (btn1 == 0) // 再次检测按键1状态 { cnt = 1; // 计数器加1 while (!btn1); // 等待按键1释放 } } else if (btn2 == 0) // 检测按键2状态 { delay(10); // 延时去抖 if (btn2 == 0) // 再次检测按键2状态 { cnt = 2; // 计数器加2 while (!btn2); // 等待按键2释放 } } else if (btn3 == 0) // 检测按键3状态 { delay(10); // 延时去抖 if (btn3 == 0) // 再次检测按键3状态 { cnt = 3; // 计数器加3 while (!btn3); // 等待按键3释放 } } else if (btn4 == 0) // 检测按键4状态 { delay(10); // 延时去抖 if (btn4 == 0) // 再次检测按键4状态 { cnt = 4; // 计数器加4 while (!btn4); // 等待按键4释放 } } P1 = cnt; // 将计数器值显示在P1口 } } ``` 以上代码实现了独立按键按钮计数1到4的功能。在主函数中,使用while循环不断检测按键状态,如果检测到按键按下,就将计数器加1/2/3/4,并等待按键释放。最后将计数器值显示在P1口。需要注意的是,为了防止按键抖动,需要在检测到按键按下时加一个延时去抖的操作,具体实现可以根据实际情况调整延时时间。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值