第5章 按键控制实验
第五章 按键控制实验
1. 导入
按键是一种电子开关, 使用时轻轻按开关按钮就可使开关接通, 当松开手时,开关断开。 一般机械按键按下和松开时存在抖动情况, 如下:
这种抖动可能会影响程序误判, 造成严重后果, 通常会使用软件延时 10ms来消斗。 例如, 当按键按下后, 引脚为低电平; 所以首先读取引脚电平, 若引脚为低电平, 则延时 10ms 后再次读取引脚电平, 若为低电平, 则证明按键已按下。这种方法称为软件消抖。
两者区别参考:硬件消抖和软件消抖的比较 - 面包板社区 (eet-china.com)
2. 硬件设计
本实验使用到硬件资源如下:
-
按键模块
-
ESP32 GPIO
-
LED模块
按键模块电路如下所示:
由图可知, J3 端子的 KEY1-KEY4 脚为按键控制端, 要检测按键是否被按下,只需读取 J3 端子的 KEY1-KEY4 脚是否为低电平, 因此可使用导线将 ESP32 的 IO口与 J2 端子的 KEY1-KEY4 脚连接。
本章实验使用 ESP32 的 IO14、 27、 26、 25 引脚, 接线如下所示:
3. 软件设计
3.1 MicroPython函数使用
MicroPython 中可使用 machine 模块中的 Pin 模块对 GPIO 输入检测。 其构造方法和使用方法如下:
GPIO 输入操作函数和输出是类似的, 仅在 mode 参数配置为输入方式和 pull设置上下拉电阻。
3.2 代码分析
from machine import Pin
import time
# 定义按键控制对象
key1 = Pin(14, Pin.IN, Pin.PULL_UP) # 参数:引脚号,模式,上拉电阻
key2 = Pin(27, Pin.IN, Pin.PULL_UP)
key3 = Pin(26, Pin.IN, Pin.PULL_UP)
key4 = Pin(25, Pin.IN, Pin.PULL_UP)
# 定义LED对象
led1 = Pin(15, Pin.OUT) # 参数:引脚号,模式
led2 = Pin(2, Pin.OUT)
led3 = Pin(0, Pin.OUT)
led4 = Pin(4, Pin.OUT)
# 定义按键键值
KEY1_PRESS,KEY2_PRESS,KEY3_PRESS,KEY4_PRESS = 1,2,3,4
key_en = 1
# 按键扫描函数
def key_scan():
global key_en # 声明全局变量
if key_en == 1 and (key1.value() == 0 or key2.value() == 0 or key3.value() == 0 or key4.value() == 0): # 按键被按下
time.sleep_ms(10) # 延时10ms,消抖
key_en = 0 # 按键被按下,禁止重复按键
if key1.value() == 0:
return KEY1_PRESS
elif key2.value() == 0:
return KEY2_PRESS
elif key3.value() == 0:
return KEY3_PRESS
elif key4.value() == 0:
return KEY4_PRESS
elif key1.value() == 1 and key2.value() == 1 and key3.value() == 1 and key4.value() == 1: # 按键被释放
key_en = 1 # 按键被释放,允许按键
return 0 # 按键未被按下
# 主函数
if __name__ == '__main__':
key = 0
i_led1,i_led2,i_led3,i_led4 = 0,0,0,0 # 定义LED初始状态
led1.value(i_led1)
led2.value(i_led2)
led3.value(i_led3)
led4.value(i_led4)
while True:
key = key_scan() # 扫描按键
if key == KEY1_PRESS: # 按键1被按下
i_led1 = 1 - i_led1 # 切换LED状态
led1.value(i_led1)
elif key == KEY2_PRESS: # 按键2被按下
i_led2 = 1 - i_led2
led2.value(i_led2)
elif key == KEY3_PRESS: # 按键3被按下
i_led3 = 1 - i_led3
led3.value(i_led3)
elif key == KEY4_PRESS: # 按键4被按下
i_led4 = 1 - i_led4
led4.value(i_led4)
有过学习51单片机的基础,看这个代码应该比较简单了
4. 小结
这一章主要就是一个按键扫描函数,这个我们已经在51单片机矩阵按键那章见识过了,只是C语言和python语法不一样
2024.8.20 第一次修订,后期不再维护