物联网开发111 - Micropython ESP32 C3连接4x4矩阵按键模块操作

一、目的

        这一节我们来学习如何使用合宙ESP32 C3,连接0.96寸ssd1306屏幕、4x4 矩阵按键模块,进行两个小实验的演示。

二、环境

        ESP32 C3开发板(MicroPython v1.19.1 on 2022-06-18)+ I2C 0.96寸ssd1306屏幕模块+ 4x4 矩阵按键模块  + 几根杜邦线 + Win10商业版

        ESP32 C3和各个模块接线方法:

 三、示例代码1

演示将按下的按键名字显示在屏幕上

from machine import Pin,I2C
from ssd1306 import SSD1306_I2C
from ufont import BMFont
import time

# 创建I2C对象
i2c  = I2C(0,scl = Pin(5),sda = Pin(4),freq = 400_000)
# 创建oled屏幕对象
oled = SSD1306_I2C(128,64,i2c,0x3c)
# 定义字库文件
font = BMFont("fonts/unifont-14-12888-16.v3.bmf")
# 创建led对象
led = Pin(12,Pin.OUT)  # 板载led D4

# 行定义
R1 = Pin( 2,Pin.OUT)
R2 = Pin( 3,Pin.OUT)
R3 = Pin(10,Pin.OUT)
R4 = Pin( 6,Pin.OUT)

# 列第一
C1 = Pin( 7,Pin.IN,Pin.PULL_UP)
C2 = Pin( 8,Pin.IN,Pin.PULL_UP)
C3 = Pin(18,Pin.IN,Pin.PULL_UP)
C4 = Pin(19,Pin.IN,Pin.PULL_UP)

# 创建按键函数
def Key():
    
#     R1.value(0)
#     R2.value(1)
#     R3.value(1)
#     R4.value(1)
    
    key = 0
    bzw = 0
    
    # 第一行
    [R1.value(0),R2.value(1),R3.value(1),R4.value(1)]
    if(C1.value() == 0 or C2.value() == 0 or C3.value() == 0 or C4.value() == 0):
        
        time.sleep(0.020)
        
        if C1.value() == 0:
            bzw = 1
            key = 0
            while not C1.value():
                None
        elif C2.value() == 0:
            bzw = 1
            key = 1
            while not C2.value():
                None               
        elif C3.value() == 0:
            bzw = 1
            key = 2
            while not C3.value():
                None
        elif C4.value() == 0:
            bzw = 1
            key = 3
            while not C4.value():
                None
        else:
            
            key = 0
            bzw = 0
            R1.value(1)
            
    # 第二行
    [R1.value(1),R2.value(0),R3.value(1),R4.value(1)]
    if(C1.value() == 0 or C2.value() == 0 or C3.value() == 0 or C4.value() == 0):
        
        time.sleep(0.020)
        
        if C1.value() == 0:
            bzw = 1
            key = 4
            while not C1.value():
                None
        elif C2.value() == 0:
            bzw = 1
            key = 5
            while not C2.value():
                None               
        elif C3.value() == 0:
            bzw = 1
            key = 6
            while not C3.value():
                None
        elif C4.value() == 0:
            bzw = 1
            key = 7
            while not C4.value():
                None
        else:
            
            key = 0
            bzw = 0
            R1.value(1)
            
    # 第三行
    [R1.value(1),R2.value(1),R3.value(0),R4.value(1)]
    if(C1.value() == 0 or C2.value() == 0 or C3.value() == 0 or C4.value() == 0):
        
        time.sleep(0.020)
        
        if C1.value() == 0:
            bzw = 1
            key = 8
            while not C1.value():
                None
        elif C2.value() == 0:
            bzw = 1
            key = 9
            while not C2.value():
                None               
        elif C3.value() == 0:
            bzw = 1
            key = 10
            while not C3.value():
                None
        elif C4.value() == 0:
            bzw = 1
            key = 11
            while not C4.value():
                None
        else:
            
            key = 0
            bzw = 0
            R1.value(1)

    # 第四行
    [R1.value(1),R2.value(1),R3.value(1),R4.value(0)]
    if(C1.value() == 0 or C2.value() == 0 or C3.value() == 0 or C4.value() == 0):
        
        time.sleep(0.020)
        
        if C1.value() == 0:
            bzw = 1
            key = 12
            while not C1.value():
                None
        elif C2.value() == 0:
            bzw = 1
            key = 13
            while not C2.value():
                None               
        elif C3.value() == 0:
            bzw = 1
            key = 14
            while not C3.value():
                None
        elif C4.value() == 0:
            bzw = 1
            key = 15
            while not C4.value():
                None
        else:
            
            key = 0
            bzw = 0
            R1.value(1)


    if bzw == 1:
        bzw = 0
        
        if key == 3:
            led.value(not led.value())
            
        print("%d"%key)
        font.text(oled,&#
### 关于ESP32矩阵键盘的使用方法 #### 矩阵键盘简介 矩阵键盘通过减少所需的I/O引脚数量,提供了一种高效的方式来连接多个按键。对于一个4×4矩阵键盘,通常只需要8根线即可完成所有按键状态的读取[^1]。 #### ESP32-S3上的应用实例 在某些定制化的机械键盘设计中,例如基于ESP32-S3芯片的产品(如ESP-KeyBoard),可以通过GPIO引脚实现硬件复位功能以及启动模式的选择。虽然这主要涉及单个按键的功能,但它展示了ESP32系列芯片如何灵活处理输入信号[^2]。 #### 微型Python(MicroPython)下的操作示例 当利用MicroPython框架开发时,可以轻松编写程序来检测并响应来自4x4矩阵按键模块的动作。下面是一个简单的例子,它演示了如何根据按下的不同键改变LED的状态: ```python from machine import Pin import time def setup_pins(rows, cols): row_pins = [Pin(pin_num, Pin.OUT) for pin_num in rows] col_pins = [Pin(pin_num, Pin.IN, Pin.PULL_UP) for pin_num in cols] return row_pins, col_pins def scan_keypad(row_pins, col_pins): key_map = [ [&#39;1&#39;, &#39;2&#39;, &#39;3&#39;, &#39;A&#39;], [&#39;4&#39;, &#39;5&#39;, &#39;6&#39;, &#39;B&#39;], [&#39;7&#39;, &#39;8&#39;, &#39;9&#39;, &#39;C&#39;], [&#39;*&#39;, &#39;0&#39;, &#39;#&#39;, &#39;D&#39;] ] pressed_keys = [] for idx_r, r_pin in enumerate(row_pins): r_pin.value(0) for idx_c, c_pin in enumerate(col_pins): if not c_pin.value(): pressed_keys.append(key_map[idx_r][idx_c]) r_pin.value(1) return pressed_keys rows = [16, 17, 18, 19] cols = [21, 22, 23, 2] row_pins, col_pins = setup_pins(rows, cols) while True: keys_pressed = scan_keypad(row_pins, col_pins) if keys_pressed: print(f&#39;Keys Pressed: {keys_pressed}&#39;) led = Pin(2, Pin.OUT) if &#39;*&#39; in keys_pressed: led.on() elif &#39;#&#39; in keys_pressed: led.off() time.sleep_ms(100) ``` 此代码片段设置了行和列作为输出和输入,并循环查询是否有任何按键被按下。如果发现特定字符&#39;*&#39;或&#39;#&#39;被触发,则分别开启或者关闭板载LED灯泡[^3]。 #### 原生ESP-IDF环境中的实现细节 针对更底层的操作需求,在原生ESP-IDF环境中提供了专门用于管理专用GPIO接口的API集合`dedic_gpio_*()`。这些工具允许开发者创建所谓的“GPIO捆绑包”,从而简化对整个行列组的同时配置过程。具体而言,函数`dedic_gpio_new_bundle`负责初始化一组指定范围内的GPIOs作为一个整体对待;而实际执行扫描动作则依赖回调机制配合中断服务例程(ISR),一旦某一行变为低电平时即意味着存在有效按键事件发生[^4]。 以下是部分核心逻辑摘录: ```c esp_err_t matrix_kbd_start(matrix_kbd_handle_t mkbd_handle){ ... // 设置所有的行高电平,所有列为低电平 dedic_gpio_bundle_write(mkbd_handle->row_bundle, ((uint32_t)(1 << mkbd_handle->nr_row_gpios)) - 1, ((uint32_t)(1 << mkbd_handle->nr_row_gpios)) - 1); dedic_gpio_bundle_write(mkbd_handle->col_bundle, ((uint32_t)(1 << mkbd_handle->nr_col_gpios)) - 1, 0); // 初始化每行初始状态全为未按下 for(int i=0;i<mkbd_handle->nr_row_gpios;i++){ mkbd_handle->row_state[i]=((uint32_t)(1<<mkbd_handle->nr_col_gpios))-1; } // 注册行方向上的边沿变化中断及其相应处理函数 dedic_gpio_bundle_set_interrupt_and_callback( mkbd_handle->row_bundle, ((uint32_t)(1<<mkbd_handle->nr_row_gpios))-1, DEDIC_GPIO_INTR_BOTH_EDGE,matrix_kbd_row_isr_callback,(void*)mkbd_handle); ... } ``` 以上展示的是如何准备矩阵键盘的工作条件并通过监听外部干扰快速定位哪个位置发生了交互活动。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

魔都飘雪

您的1毛奖励是我创作的源源动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值