本章概述思维导图:
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灯
}
}
}
独立按键检测效果展示:
独立按键检测效果展示
制作不易!喜欢的小伙伴给个小赞赞!喜欢我的小伙伴点个关注!有不懂的地方和需要的资源随时问我哟!