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:长按
相关推荐
极梦网络无忧2 小时前
OpenClaw 基础使用说明(中文版)
python
codeJinger2 小时前
【Python】操作Excel文件
python·excel
XLYcmy3 小时前
一个针对医疗RAG系统的数据窃取攻击工具
python·网络安全·ai·llm·agent·rag·ai安全
Islucas3 小时前
Claude code入门保姆级教程
python·bash·claude
萝卜白菜。3 小时前
TongWeb7.0相同的类指明加载顺序
开发语言·python·pycharm
赵钰老师4 小时前
【ADCIRC】基于“python+”潮汐、风驱动循环、风暴潮等海洋水动力模拟实践技术应用
python·信息可视化·数据分析
爬山算法4 小时前
MongoDB(80)如何在MongoDB中使用多文档事务?
数据库·python·mongodb
YuanDaima20484 小时前
基于 LangChain 1.0 的检索增强生成(RAG)实战
人工智能·笔记·python·langchain·个人开发·langgraph
RopenYuan5 小时前
FastAPI -API Router的应用
前端·网络·python