51单片机-驱动独立按键模块教程

发布于:2025-08-18 ⋅ 阅读:(22) ⋅ 点赞:(0)

本章概述思维导图:

51单片机驱动独立按键模块

按键简介

按键(Button/Switch)是电子设备中实现人机交互的核心元件,通过物理操作(按压、触摸)控制电路通断,完成指令输入。按键实物图如下:

按键在我们开发中又有哪几种呢?

1、 机械按键:金属触点 + 弹性结构(弹簧/弹片)。应用:遥控器、机械键盘、工业控制面板。

2、薄膜式按键:三层薄膜(上层电路 + 隔离层 + 下层电路)。应用:手机虚拟按键、家电控制面板、笔记本电脑键盘。

3、电容式触摸按键:触摸电极 + 电容检测电路。应用:智能手机触控、汽车中控屏、智能音箱。

特殊类型按键:

1、轻触开关:超薄型,用于电路板复位键。

2、编码器旋钮:结合旋转与按下功能,用于音量调节。

3、霍尔开关:非接触式,通过磁场控制通断,用于电动车刹车断电。

在以后我们开发中该如何选择适合的按键呢?

需明确手感,选择机械式;

需防尘防水,选择选薄膜式;

需隐藏式设计,选择电容式。

独立按键硬件电路原理图分析

独立按键硬件电路原理图:

在电路原理图中观察出一共有K1、K2、K3、K4四个独立按键。

        K1右侧连接低电平,左侧连接STC51芯片的P31引脚;

        K2右侧连接低电平,左侧连接STC51芯片的P30引脚;

        K3右侧连接低电平,左侧连接STC51芯片的P32引脚;

        K4右侧连接低电平,左侧连接STC51芯片的P33引脚;

K1、K2、K3、K4按键没有按下时,电路是没有导通。当K1、K2、K3、K4按下时,对应电路导通。要检测按键按下时的情况,STC51芯片的P30~P31引设置为输入模式,当K1、K2、K3、K4按键按下时可检测到低电平信号;

检测独立按键软件编程设计

检测按键是否按下,我们首先先使用sbit关键字声明STC51的4个引脚(P30~P33);

sbit KEY1=P3^1;//定义P30~P33引脚,用来检测按键是否按下
sbit KEY2=P3^0;
sbit KEY3=P3^2;
sbit KEY4=P3^3;

使用if条件判断语句对按键进行判断,当P30~P33为测到低电平时说明按键按下。在进行具体操作;这里对KEY1和KEY2进行判断,KEY1按下时点亮8个LED灯,KEY2按下时关闭8个LED灯;

代码示例:

#include "reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
sbit KEY1=P3^1;//定义检测独立按键的各个引脚输入状态
sbit KEY2=P3^0;
sbit KEY3=P3^2;
sbit KEY4=P3^3;
int main()															 
{
	while(1)
	{
	   if(KEY1 == 0)
	   {
	   	 P2=0x00;//驱动八个LED灯
	   }
	   else if(KEY2 == 0)
	   {
	   	 P2=0xff;//关闭八个LED灯 
	   }
	}
}

创建按键检测函数

在以后项目开发中,按键检测是并不可少的功能。这里详细创建按键检测函数,方便以后项目开发

按键检测函数示例代码:(函数返回值为:按键是否按下状态,函数形参为mode:mode为非零数代表连续检测,mode为零表达单次检测)

sbit KEY1=P3^1;//定义检测独立按键的各个引脚输入状态
sbit KEY2=P3^0;
sbit KEY3=P3^2;
sbit KEY4=P3^3;
#define KEY1_return 1//定义检测独立按键函数检测的状态变量返回值,按键按下分别返回1,2,3,4;没有按键按下返回0;
#define KEY2_return 2
#define KEY3_return 3
#define KEY4_return 4
#define KEY_return 0
u8 KEY_detect(u8 mode)//按键检测函数,返回值为判断是否有按键按下:有按键按下返回值为1-4,无按键按下返回值为:0;形参mode为非零数代表连续检测,mode为零表达单次检测
{	
	static u8 flag=1;
	if(mode)//连续按键按下
	{
		flag=1;
	}
	if((!KEY1 || !KEY2 || !KEY3 || !KEY4) && flag==1)//一次判断是否有按键按下
	{
		flag=0;
		Delay_10us(1000);//延时消抖
		if(!KEY1)	return KEY1_return;//二次判断
		else if(!KEY2)	return KEY2_return;
		else if(!KEY3)	return KEY3_return;
		else if(!KEY4)	return KEY4_return;
	}
	else if(KEY1 && KEY2 && KEY3 && KEY4)//判断所有按键是否松开
	{
		flag=1;
	}
	return KEY_return;
}

主函数使用按键检测函数代码示例:

#include "reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
void Delay_10us(u16 us)//延时函数:输入1大概延时时间为10us
{
	while(us--);
}
sbit KEY1=P3^1;//定义检测独立按键的各个引脚输入状态
sbit KEY2=P3^0;
sbit KEY3=P3^2;
sbit KEY4=P3^3;
#define KEY1_return 1//定义检测独立按键函数检测的状态变量返回值,按键按下分别返回1,2,3,4;没有按键按下返回0;
#define KEY2_return 2
#define KEY3_return 3
#define KEY4_return 4
#define KEY_return 0
u8 KEY_detect(u8 mode)//按键检测函数,返回值为判断是否有按键按下:有按键按下返回值为1-4,无按键按下返回值为:0;
{	
	static u8 flag=1;
	if(mode)
	{
		flag=1;
	}
	if((!KEY1 || !KEY2 || !KEY3 || !KEY4) && flag==1)//一次判断是否有按键按下
	{
		flag=0;
		Delay_10us(1000);//延时消抖
		if(!KEY1)	return KEY1_return;//二次判断
		else if(!KEY2)	return KEY2_return;
		else if(!KEY3)	return KEY3_return;
		else if(!KEY4)	return KEY4_return;
	}
	else if(KEY1 && KEY2 && KEY3 && KEY4)//判断所有按键是否松开
	{
		flag=1;
	}
	return KEY_return;
}
int main()															 
{
	u8 KEY_get=0;
	while(1)
	{
	   KEY_get=KEY_detect(0);//获取按键状态
	   if(KEY_get == 1)
	   {
	   	 P2=0x00;//驱动八个LED灯
	   }
	   else if(KEY_get == 2)
	   {
	   	 P2=0xff;//关闭八个LED灯 
	   }
	}
}

独立按键检测效果展示:

独立按键检测效果展示


制作不易!喜欢的小伙伴给个小赞赞!喜欢我的小伙伴点个关注!有不懂的地方和需要的资源随时问我哟!


网站公告

今日签到

点亮在社区的每一天
去签到