51单片机独立按键

举报
yd_274589494 发表于 2023/07/27 17:39:41 2023/07/27
【摘要】 @TOC 前言本篇文章将带大家学习独立按键按键的基本操作。独立按键式直接用I/O口线构成的单个按键电路,其特点是每个按键单独占用一根I/O口线,每个按键的工作不会影响其他I/O口线的状态。 一、按键原理图板子上面一共有4个独立按键,分别接到了P30-P33。通过原理图可以知道当按键按下时P30-P33都接到了GND,电平为低电平,当按键没有按下时电平为高电平。 二、代码编写这里我们需要对按键...

@TOC


前言

本篇文章将带大家学习独立按键按键的基本操作。

独立按键式直接用I/O口线构成的单个按键电路,其特点是每个按键单独占用一根I/O口线,每个按键的工作不会影响其他I/O口线的状态。

一、按键原理图

板子上面一共有4个独立按键,分别接到了P30-P33。
通过原理图可以知道当按键按下时P30-P33都接到了GND,电平为低电平,当按键没有按下时电平为高电平。
在这里插入图片描述

二、代码编写

这里我们需要对按键进行消抖,因为当按键按下时会发生抖动,当按键发生抖动的时候去读取按键值这个时候读出的按键值是不准确的。
在这里我们可以延时10ms等按键电平稳定的时候再去读取按键的值,这样就可以得到比较稳定的按键值了。
当按键按下时引脚的电平会发生如下图一样的抖动,所以需要等待一段时间再去读取电平数值。
在这里插入图片描述

#include <reg52.h>

//定义独立按键控制脚
sbit KEY1=P3^1;
sbit KEY2=P3^0;
sbit KEY3=P3^2;
sbit KEY4=P3^3;

unsigned char key_val = 0;

/*延时函数
单位:ms
x:延时的数值
*/
void delayms(unsigned int x)
{
   unsigned char i;
	 while(x--)
	 {
		 for(i=0;i<113;i++);
	 }
}

unsigned char key_scan(void)
{
	if(KEY1 == 0)
	{
		delayms(10);//延时消抖
		if(KEY1 == 0)
		{
			return 0;//代表按键1按下
		}
		while(KEY1 == 0);//等待按键松开
	}
	else if(KEY2 == 0)
	{
		delayms(10);//延时消抖
		if(KEY2 == 0)
		{
			return 0;//代表按键2按下
		}
		while(KEY2 == 0);//等待按键松开
	}
	else if(KEY3 == 0)
	{
		delayms(10);//延时消抖
		if(KEY3 == 0)
		{
			return 0;//代表按键3按下
		}
		while(KEY3 == 0);//等待按键松开
	}
	else if(KEY4 == 0)
	{
		delayms(10);//延时消抖
		if(KEY4 == 0)
		{
			return 0;//代表按键4按下
		}
		while(KEY4 == 0);//等待按键松开
	}
}

void main(void)
{

	while(1)
	{
		key_val = key_scan();//读取按键值
	}
}

三、模块化管理按键

什么叫模块化编程?我的理解就是每一个模块都分别写成对应的.c和.h文件,有的人可能会问道为什么要这样写呢?这样写不是增加文件数量吗?其实模块化编程主要的好处就是代码看起来更加整洁,不会显得凌乱,而且方便移植。
这里我们创建一个key.c和key.h文件将按键代码模块化管理起来,方便我们以后的调用。
以后需要使用到按键这个模块的时候将.c和.h文件添加进入我们的工程即可。

key.c

unsigned char key_val = 0;

unsigned char key_scan(void)
{
	if(KEY1 == 0)
	{
		delayms(10);//延时消抖
		if(KEY1 == 0)
		{
			return 0;//代表按键1按下
		}
		while(KEY1 == 0);//等待按键松开
	}
	else if(KEY2 == 0)
	{
		delayms(10);//延时消抖
		if(KEY2 == 0)
		{
			return 0;//代表按键2按下
		}
		while(KEY2 == 0);//等待按键松开
	}
	else if(KEY3 == 0)
	{
		delayms(10);//延时消抖
		if(KEY3 == 0)
		{
			return 0;//代表按键3按下
		}
		while(KEY3 == 0);//等待按键松开
	}
	else if(KEY4 == 0)
	{
		delayms(10);//延时消抖
		if(KEY4 == 0)
		{
			return 0;//代表按键4按下
		}
		while(KEY4 == 0);//等待按键松开
	}
}

key.h
下面的这些宏的作用就是防止头文件的重复包含。

#ifndef __KEY_H
#define __KEY_H

//定义独立按键控制脚
sbit KEY1=P3^1;
sbit KEY2=P3^0;
sbit KEY3=P3^2;
sbit KEY4=P3^3;

unsigned char key_scan(void);

#endif

总结

独立按键的操作还是很简单的,主要就是要主要按键的延时消抖处理。
这里再给大家提一点:延时函数在项目开发中最好就是少使用。延时函数的大量使用会造成系统的卡顿。大家可以想一下可以使用什么方法对按键进行消抖处理。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。