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:长按
相关推荐
风之所往_5 小时前
Python 3.0 新特性全面总结
python
2401_882273725 小时前
如何在 CSS 中正确加载本地 JPG 背景图片
jvm·数据库·python
Lucas_coding6 小时前
【Claude Code Router】 Claude Code 兼容 OpenAI 格式 API, Claude code 接入本地部署模型
人工智能·python
测试员周周6 小时前
【AI测试系统】第5篇:从 Archon 看 AI 工程化落地:为什么"确定性编排+AI 弹性智能"是终局?
人工智能·python·测试
大飞记Python7 小时前
【2026更新】Python基础学习指南(AI版)——04数据类型
开发语言·人工智能·python
Hello eveybody8 小时前
介绍一下背包DP(Python)
开发语言·python·动态规划·dp·背包dp
2301_795099748 小时前
让 CSS Grid 自适应容器尺寸的动态布局方案
jvm·数据库·python
呆萌的代Ma8 小时前
python读取并加载.env的配置文件
python
Muyuan19988 小时前
27.RAG 系统中的上下文充分性判断:从 Chunk 数量、FAISS 距离到 LLM Relevance Gate
python·django·pdf·fastapi·faiss
U盘失踪了9 小时前
python curl转python脚本
开发语言·chrome·python