micropython 按键

ulib/man_key/man_key.py

python 复制代码
EVT_KEY_DOWN = 0x01
EVT_KEY_UP = 0x02
EVT_CLICK = 0x03
EVT_DBL_CLICK =0x04
EVT_PRESSING=0x05
EVT_LONG_CLICK=0x06



STT_IDLE= 0
STT_WAITING_CLICK_UP= 1
STT_WAITING_DBL_CLICK_DOWN= 2
STT_WAITING_DBL_CLICK_UP= 3
STT_LONG_PRESSING= 10



class ManKey():
    getKeyboardMask=0;
    postEvent=0;

    def __init__(self, inx):
        self.m_inx = inx
        self.m_state = STT_IDLE
        self.m_downMs = 0

    def setIndex(self,inx):
        self.m_inx = inx

    def onTick(self,ms):
        keyPressState = ManKey.getKeyboardMask(self.m_inx)
        if self.m_state==STT_IDLE:
            if keyPressState == 1:
                self.m_downMs = ms;
                ManKey.postEvent(ms,EVT_KEY_DOWN,self.m_inx)
                self.m_state = STT_WAITING_CLICK_UP;
        elif self.m_state==STT_WAITING_CLICK_UP:
            if ms - self.m_downMs > 300:
                ManKey.postEvent(ms,EVT_PRESSING,self.m_inx)
                self.m_pressingCount = 1
                self.m_state = STT_LONG_PRESSING;
            elif keyPressState == 0:
                self.m_state = STT_WAITING_DBL_CLICK_DOWN
        elif self.m_state==STT_WAITING_DBL_CLICK_DOWN:
            if ms - self.m_downMs > 400:
                ManKey.postEvent(ms,EVT_CLICK,self.m_inx)
                ManKey.postEvent(ms,EVT_KEY_UP,self.m_inx)
                self.m_state = STT_IDLE;
            elif keyPressState==1:
                self.m_state = STT_WAITING_DBL_CLICK_UP
        elif self.m_state==STT_WAITING_DBL_CLICK_UP:
            if keyPressState==0:
                ManKey.postEvent(ms, EVT_DBL_CLICK,self.m_inx);
                ManKey.postEvent(ms, EVT_KEY_UP,self.m_inx);
                self.m_state = STT_IDLE;
        elif self.m_state==STT_LONG_PRESSING:
            if keyPressState==0:
                ManKey.postEvent(ms, EVT_LONG_CLICK,self.m_inx);
                ManKey.postEvent(ms, EVT_KEY_UP,self.m_inx);
                self.m_state = STT_IDLE;
            elif ms - self.m_downMs > 300 + self.m_pressingCount * 100:
                ManKey.postEvent(ms, EVT_PRESSING,self.m_inx);
                self.m_pressingCount= self.m_pressingCount+1

main.py

python 复制代码
from machine import Pin
import utime
from ulib.man_key.man_key  import ManKey


key = Pin(0, Pin.IN, Pin.PULL_UP)
led = Pin(2, Pin.OUT)

def getKeyboardMask(inx):
    if key.value()==0:
        return 1
    else:
        return 0

def postEvent(ms,evtType,inx):
    print(f'{ms}:',end="")
    if evtType==1:
        print("按下")
    elif evtType==2:
        print("抬起")
    elif evtType==3:
        print("单击")
    elif evtType==4:
        print("双击")
    elif evtType==5:
        print("长按")
    elif evtType==6:
        print("长击")



ManKey.getKeyboardMask=getKeyboardMask
ManKey.postEvent=postEvent



mk= ManKey(1)

if __name__ == '__main__':
    while True:
        ms=utime.ticks_ms()
        mk.onTick(ms)

测试

bash 复制代码
>>> %Run -c $EDITOR_CONTENT
287004:按下
287405:单击
287405:抬起
288258:按下
288559:长按
288659:长按
相关推荐
特立独行的猫A4 小时前
我给女儿写了个打字练习:一边敲键盘,一边把小学英语单词记牢
java·后端·python
cpolar技术支持4 小时前
「我这边连不上你那个服务」—— 用清单驱动的 TCP 连通性只读看板,cpolar 让远端同事自己取证
python·内网穿透·tcp·cpolar·网络诊断
云和数据.ChenGuang5 小时前
LangGraph 异步 Node 的设计与写法实践
开发语言·人工智能·python·机器学习·php
天诰6 小时前
SA-K-11 检索会消失吗与四个未解问题
java·服务器·人工智能·python·机器学习·ai编程
benchmark_cc7 小时前
用 QuantDash 读取美股行情:AAPL.US 的运行前检查、排错顺序与数据校验清单
python·数据分析·pandas·量化交易·股票数据·quantdash
羲云网络10 小时前
GPT Image 2.6 接入指南:Flare、Sunburst 怎么选,编辑失败如何排查
人工智能·python·aigc·图像生成·acedatacloud
橙橙笔记13 小时前
具身智能的学习 - 完成一个机械臂 第1节
python·学习·机械臂·具身智能
小小张说故事13 小时前
Python 的 class 语句到底执行了什么?拆开 __prepare__、metaclass.__new__ 和那个被讲反的 __set_name__ 顺序
python
天天被压力15 小时前
【A股分钟级高频数据完全手册 #07】北交所历史分钟K线接口:京市Pro版分时批量
java·人工智能·python
天天被压力16 小时前
【A股分钟级高频数据完全手册 #08】股票日、分时数据接口对比:普通分时与Pro版差异实测
java·人工智能·python