按键

例程讲解

该例程在 例程的xxx ,可以在 CanMV IDE 中打开

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
from board import board_info
from fpioa_manager import fm
from maix import GPIO
import time

fm.register(board_info.USER_LED, fm.fpioa.GPIOHS1, force=True)
led = GPIO(GPIO.GPIOHS1, GPIO.OUT)

def test_irq(pin_num):
    led.value(key.value())

fm.register(board_info.BOOT_KEY, fm.fpioa.GPIOHS0, force=True)
key=GPIO(GPIO.GPIOHS0, GPIO.IN, GPIO.PULL_NONE)
key.irq(test_irq, GPIO.IRQ_BOTH, GPIO.WAKEUP_NOT_SUPPORT, 7)


while True:
    time.sleep_ms(500)

key.disirq()
fm.unregister(board_info.BOOT_KEY)

实验准备

  1. 野火K210 AI视觉相机 连接到 CanMV IDE

  2. 执行程序

运行结果

运行之后,按下按键用户灯会变绿,松开后灯会灭

程序分析

1
2
3
4
from board import board_info
from fpioa_manager import fm
from maix import GPIO
import time
  • from board import board_info : 从board模块导入board_info对象,其中包含了开发板的相关信息。

  • from fpioa_manager import fm : 导入fpioa_manager模块中的fm对象,用于管理管脚映射。

  • from maix import GPIO : 从maix模块导入GPIO类,用于控制通用输入输出。

1
2
fm.register(board_info.USER_LED, fm.fpioa.GPIOHS1, force=True)
led = GPIO(GPIO.GPIOHS1, GPIO.OUT)
  • fm.register(board_info.USER_LED, fm.fpioa.GPIOHS1, force=True) : 将USER_LED对应的管脚映射到GPIOHS1(高速度GPIO)。

  • led = GPIO(GPIO.GPIOHS1, GPIO.OUT) : 初始化GPIOHS1管脚作为输出,并创建一个名为led的GPIO对象

1
2
3
4
5
6
def test_irq(pin_num):
    led.value(key.value())

fm.register(board_info.BOOT_KEY, fm.fpioa.GPIOHS0, force=True)
key=GPIO(GPIO.GPIOHS0, GPIO.IN, GPIO.PULL_NONE)
key.irq(test_irq, GPIO.IRQ_BOTH, GPIO.WAKEUP_NOT_SUPPORT, 7)

def test_irq(pin_num) : 定义一个中断服务函数test_irq,它接受一个参数pin_num,即触发的GPIO管脚编号。 led.value(key.value()) : 将LED的状态设置为按键的状态。如果按键被按下(低电平),LED灯亮;如果按键释放(高电平),LED灯灭。 fm.register(board_info.BOOT_KEY, fm.fpioa.GPIOHS0, force=True) : 将BOOT_KEY对应的管脚映射到GPIOHS0(高速度GPIO)。 key=GPIO(GPIO.GPIOHS0, GPIO.IN, GPIO.PULL_NONE) : 初始化GPIOHS0管脚作为输入,并且不使用上拉或下拉电阻。 key.irq(test_irq, GPIO.IRQ_BOTH, GPIO.WAKEUP_NOT_SUPPORT, 7) : 为key对象注册中断,当按键被按下或释放时,都会触发中断。中断服务函数为test_irq,不支持下唤醒,中断优先级为7。

1
2
3
4
5
for i in range(20):
    time.sleep_ms(500)

key.disirq()
fm.unregister(board_info.BOOT_KEY)
  • while True: : 开始一个无限循环。

  • time.sleep_ms(500) : 让程序暂停500毫秒。

  • key.disirq() : 注销key对象的中断。

  • fm.unregister(board_info.BOOT_KEY) : 循环结束后,注销BOOT_KEY的管脚映射,释放资源。