ESP32实现按键控制led
前言
本文主要实现按键控制led灯的亮灭,当然蜂鸣器也是一样的。之前的led实验,蜂鸣器实验IO口都是作为输出来使用的,在这里按键实验IO口作为输入来使用。
一、前期准备
1、 按键分析
下面给出几个按键的原理图以及所在引脚:
KEY1 按键一端是接 3.3V 的,当按下后 PA0管脚即为高电平,未按下时处于悬空状态,所以需要将 PA0 管脚配置为浮空输入模式GPIO_Mode_IN_FLOATING(下拉输入模式 GPIO_Mode_IPD),这样 PA0 管脚的默认电平就为低电平,如果读取到 PA0 管脚的电平为高电平时,就说明 KEY1 按键按下。
KEY2~KEY4 的按键一端是接GND 的,当按下后管脚为低电平,所以需要将管脚配置为上拉输入模式GPIO_Mode_IPU(浮空输入模式GPIO_Mode_IN_FLOATING),这样管脚的默认电平就为高电平,如果读取到管脚的电平为低电平时,就说明按键按下。
KEY1接PA0,KEY2接PC4,KEY3接PC5,KEY4接PC6
2、 按键抖动
硬件上使用的按键是机械按键,按键按下和抬起都会产生电平抖动,抖动时间的长短由按键的机械特性决定的,一般为 5ms 到 10ms。按键抖动会产生干扰信号,影响判断,所以要进行去抖动处理,按键消抖有两种方式,一种是硬件消抖,另一种是软件消抖。
硬件防抖需要借助外接电容和电阻,通过电容充放电来约束电平不能跳变达到去抖动的效果。
软件防抖,用延时的方式错过这个抖动的时间。
二、代码写入
初始化按键配置,使能按键引脚的时钟,使用 GPIO 的输入模式,在定义的按键扫描函数中检测电平,从而判断按键是否被按下,当检测到按键按下后,进行去抖动,再次进行电平检测,最终确定按键状态,再进行相应处理。
1.key.c
代码如下:
#include "key.h"
#include "delay.h"
#include "beep.h"
//PA0 浮空输入
void Key_Config(void)
{
//1.开时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC, ENABLE);
//2.配置端口
GPIO_InitTypeDef GPIO_InitStructure;//定义结构体变量
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//模式
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6;//引脚
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
//声明按键引脚
#define KEY1 GPIO