592|2

183

帖子

12

TA的资源

一粒金砂(高级)

楼主
 

【DigiKey“智造万物,快乐不停”创意大赛】MAIX BIT KIT 的按键处理 [复制链接]

 

给MAIX BIT 配的Grove Dual Button 按起来不太稳定,于是调整了一下代码:

class main_obj():
    def event(self,name,*args,**kw):
        print(name,*args,**kw)

def call_object_method(obj,method_name,*args,**kv):
    print('call_object_method',obj,'method',method_name,'args',args,'kv',kv)
    if method_name in dir(obj):
        getattr(obj,method_name)(method_name,*args,**kv)

import utime
from Maix import GPIO
from fpioa_manager import fm

root = main_obj()

last_ticks=0

def test_irq22(pin_num):
    global last_ticks
    disable_buttons_irq()
    utime.sleep_ms(10)
    tmp_last_ticks = utime.ticks()
    print("key22?", pin_num,'val22',key22.value(),'val23',key23.value(), 'at',tmp_last_ticks,last_ticks,tmp_last_ticks-last_ticks,"\n")
    if tmp_last_ticks - last_ticks > 250 and key22.value()==0 and key23.value()==1 :
        call_object_method(root,'event','btn1_pressed',pin_num)
    last_ticks = tmp_last_ticks
    utime.sleep_ms(200)
    enable_buttons_irq()

def test_irq23(pin_num):
    global last_ticks
    disable_buttons_irq()
    utime.sleep_ms(10)
    tmp_last_ticks = utime.ticks()
    print("key23?", pin_num,'val22',key22.value(),'val23',key23.value(),  'at',tmp_last_ticks,last_ticks,tmp_last_ticks-last_ticks,"\n")
    if tmp_last_ticks - last_ticks > 250 and key22.value()==1 and key23.value()==0 :
        call_object_method(root,'event','btn2_pressed',pin_num)
    last_ticks = tmp_last_ticks
    utime.sleep_ms(200)
    enable_buttons_irq()

fm.register(22, fm.fpioa.GPIOHS0)
key22 = GPIO(GPIO.GPIOHS0, GPIO.IN, GPIO.PULL_NONE)
fm.register(23, fm.fpioa.GPIOHS1)
key23 = GPIO(GPIO.GPIOHS1, GPIO.IN, GPIO.PULL_NONE)

print(dir(key22))

utime.sleep_ms(100)
def enable_buttons_irq():
    key22.irq(test_irq22, GPIO.IRQ_FALLING, GPIO.WAKEUP_NOT_SUPPORT,7)
    key23.irq(test_irq23, GPIO.IRQ_FALLING, GPIO.WAKEUP_NOT_SUPPORT,7)

def disable_buttons_irq():
    key22.disirq() # 禁用中断
    key23.disirq() # 禁用中断

enable_buttons_irq()
print("0\n")

while True:
    pass
    utime.sleep_ms(300) # 在 0.33 秒内等待触发

#key.disirq() # 禁用中断
#fm.unregister(16)

主要的处理技巧也很简单:先停用中断,延时 10ms消抖,然后检查是否还是低电平、是否超过了250ms。如果都满足,就认为正常触发。在恢复中断退出程序前再延时200ms。这样只要是一下下按就不会有漏,也不会因为抖动重复。如果需要减小连击间隔,同时减少250ms、200ms就可以了。

最新回复

大佬,如果硬件延时10ms,会不会对其的响应有影响呀。   详情 回复 发表于 2024-1-14 09:39
点赞 关注
 
 

回复
举报

6960

帖子

11

TA的资源

版主

沙发
 

大佬,如果硬件延时10ms,会不会对其的响应有影响呀。

点评

这10ms不算啥的,开中断前还有个延时200ms的。 在处理按键的中断时,不用硬件,也没有什么其他的任务要跑,我觉得这个影响算是比较小了。  详情 回复 发表于 2024-1-14 11:27
 
 
 

回复

183

帖子

12

TA的资源

一粒金砂(高级)

板凳
 
lugl4313820 发表于 2024-1-14 09:39 大佬,如果硬件延时10ms,会不会对其的响应有影响呀。

这10ms不算啥的,开中断前还有个延时200ms的。

在处理按键的中断时,不用硬件,也没有什么其他的任务要跑,我觉得这个影响算是比较小了。

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表