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:长按
相关推荐
2601_962293244 小时前
Python自动化统计团队工作量并生成可视化仪表盘的脚本方案【指导】
python·数据分析·自动化·可视化·仪表盘
2601_962293795 小时前
OCRmyPDF批处理脚本:使用Python自动化复杂OCR任务
python·自动化·批处理脚本·ocrmypdf·ocr任务
Java后端的Ai之路7 小时前
20、Python - 备忘录模式
开发语言·人工智能·python·外观模式·备忘录模式
2601_962077717 小时前
基于Python与NLP的新闻事件信息抽取实战:从NER到时空标准化
python·nlp·transformers·spacy·新闻事件抽取
JavaPub-rodert8 小时前
LangChain 从入门到 Agent 实战:用 Python 搭建一个真正能调用工具和知识库的 AI 助手
人工智能·python·langchain
郝学胜-神的一滴8 小时前
Qt 高级编程 045:坐标体系深度实战
开发语言·c++·windows·python·qt·程序人生
m0_380743879 小时前
给 OpenAI API 调用加上模型切换:GPT-5.1 和 Codex 的配置实践
人工智能·python·gpt
2601_962297489 小时前
在python3中、下列输出变量a的正确写法是_2020超星大数据Python免费答案
数据结构·python·算法·编程·字符串操作
“AI国潮设计-小江”9 小时前
Python实战 | SDXL精准控制“普宁英歌舞×星空蛋糕”IP落地,附核心Prompt与商用授权思路
开发语言·人工智能·python·prompt·aigc
公爵爱学习10 小时前
无人机视觉识别前序-Linux-YOLO安装
python·yolo·计算机视觉·conda·无人机