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:长按
相关推荐
IVEN_32 分钟前
只会Python皮毛?深入理解这几点,轻松进阶全栈开发
python·全栈
Ray Liang2 小时前
用六边形架构与整洁架构对比是伪命题?
java·python·c#·架构设计
AI攻城狮2 小时前
如何给 AI Agent 做"断舍离":OpenClaw Session 自动清理实践
python
千寻girling2 小时前
一份不可多得的 《 Python 》语言教程
人工智能·后端·python
AI攻城狮5 小时前
用 Playwright 实现博客一键发布到稀土掘金
python·自动化运维
曲幽6 小时前
FastAPI分布式系统实战:拆解分布式系统中常见问题及解决方案
redis·python·fastapi·web·httpx·lock·asyncio
孟健20 小时前
Karpathy 用 200 行纯 Python 从零实现 GPT:代码逐行解析
python
码路飞1 天前
写了个 AI 聊天页面,被 5 种流式格式折腾了一整天 😭
javascript·python
曲幽1 天前
FastAPI压力测试实战:Locust模拟真实用户并发及优化建议
python·fastapi·web·locust·asyncio·test·uvicorn·workers