按键¶
例程讲解¶
该例程在 例程的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)
|
实验准备¶
将
野火K210 AI视觉相机
连接到CanMV IDE
执行程序
运行结果¶
运行之后,按下按键用户灯会变绿,松开后灯会灭
程序分析¶
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的管脚映射,释放资源。