{"id":24091723,"url":"https://github.com/RT-Thread-packages/MultiButton","last_synced_at":"2025-09-17T01:31:54.922Z","repository":{"id":232073713,"uuid":"783392208","full_name":"RT-Thread-packages/MultiButton","owner":"RT-Thread-packages","description":"A compact and easy to use event-driven button driver module for RT-Thread. | 一个小巧易用的事件驱动按钮驱动模块.","archived":false,"fork":false,"pushed_at":"2024-04-20T15:43:18.000Z","size":174,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":6,"default_branch":"master","last_synced_at":"2024-04-20T17:10:30.416Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/RT-Thread-packages.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2024-04-07T19:03:03.000Z","updated_at":"2024-04-20T15:43:21.000Z","dependencies_parsed_at":"2024-04-07T20:31:29.864Z","dependency_job_id":"a1d87ec6-5c19-4a1e-9c9b-30ab341836e1","html_url":"https://github.com/RT-Thread-packages/MultiButton","commit_stats":null,"previous_names":["rt-thread-packages/multibutton"],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RT-Thread-packages%2FMultiButton","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RT-Thread-packages%2FMultiButton/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RT-Thread-packages%2FMultiButton/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RT-Thread-packages%2FMultiButton/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/RT-Thread-packages","download_url":"https://codeload.github.com/RT-Thread-packages/MultiButton/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":233312695,"owners_count":18657090,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-01-10T07:44:40.955Z","updated_at":"2025-09-17T01:31:49.579Z","avatar_url":"https://github.com/RT-Thread-packages.png","language":"C","readme":"# MultiButton\n\n## 简介\nMultiButton 是一个小巧简单易用的事件驱动型按键驱动模块，可无限量扩展按键，按键事件的回调异步处理方式可以简化你的程序结构，去除冗余的按键处理硬编码，让你的按键业务逻辑更清晰。\n\nMultiButton的作者是0x1abin, github地址: https://github.com/0x1abin/MultiButton. \n\n## 使用方法\n1.先申请一个按键结构\n\n```c\nstruct button button1;\n```\n2.初始化按键对象，绑定按键的GPIO电平读取接口**read_button_pin()** ，后一个参数设置有效触发电平\n\n```c\nbutton_init(\u0026button1, read_button_pin, 0);\n```\n3.注册按键事件\n\n```c\nbutton_attach(\u0026button1, SINGLE_CLICK, Callback_SINGLE_CLICK_Handler);\nbutton_attach(\u0026button1, DOUBLE_CLICK, Callback_DOUBLE_Click_Handler);\n...\n```\n4.启动按键\n\n```c\nbutton_start(\u0026button1);\n```\n5.设置一个5ms间隔的定时器循环调用后台处理函数\n\n```c\nwhile(1) {\n    ...\n    if(timer_ticks == 5) {\n        timer_ticks = 0;\n        \n        button_ticks();\n    }\n}\n```\n\n## 特性\n\nMultiButton 使用C语言实现，基于面向对象方式设计思路，每个按键对象单独用一份数据结构管理：\n\n```c\nstruct button {\n    uint16_t ticks;\n    uint16_t short_ticks;\n    uint16_t long_ticks;\n    uint8_t  repeat       : 4;\n    uint8_t  event        : 4;\n    uint8_t  state        : 3;\n    uint8_t  debounce_cnt : 3;\n    uint8_t  active_level : 1;\n    uint8_t  button_level : 1;\n    uint8_t  (*hal_button_Level)(void);\n    BtnCallback  cb[number_of_event];\n    button_t next;\n};\n```\n这样每个按键使用单向链表相连，依次进入 button_handler(button_t handle) 状态机处理，所以每个按键的状态彼此独立。\n\n\n## 按键事件\n\n事件 | 说明\n---|---\nPRESS_DOWN | 按键按下，每次按下都触发\nPRESS_UP | 按键弹起，每次松开都触发\nPRESS_REPEAT | 重复按下触发，变量repeat计数连击次数\nSINGLE_CLICK | 单击按键事件\nDOUBLE_CLICK | 双击按键事件\nLONG_PRESS_START | 达到长按时间阈值时触发一次\nLONG_PRESS_HOLD | 长按期间一直触发\n\n\n## Examples\n\n```c\n#include \u003cmulti_button.h\u003e\n\nstruct button btn1;\n\nuint8_t read_button1_GPIO() \n{\n\treturn HAL_GPIO_ReadPin(B1_GPIO_Port, B1_Pin);\n}\n\nvoid BTN1_PRESS_DOWN_Handler(void* btn)\n{\n\t//do something...\n}\nvoid BTN1_PRESS_UP_Handler(void* btn)\n{\n\t//do something...\n}\n\nint main()\n{\n\tbutton_init(\u0026btn1, read_button1_GPIO, 0);\n\tbutton_attach(\u0026btn1, PRESS_DOWN,       BTN1_PRESS_DOWN_Handler);\n\tbutton_attach(\u0026btn1, PRESS_UP,         BTN1_PRESS_UP_Handler);\n\tbutton_attach(\u0026btn1, PRESS_REPEAT,     BTN1_PRESS_REPEAT_Handler);\n\tbutton_attach(\u0026btn1, SINGLE_CLICK,     BTN1_SINGLE_Click_Handler);\n\tbutton_attach(\u0026btn1, DOUBLE_CLICK,     BTN1_DOUBLE_Click_Handler);\n\tbutton_attach(\u0026btn1, LONG_PRESS_START, BTN1_LONG_PRESS_START_Handler);\n\tbutton_attach(\u0026btn1, LONG_PRESS_HOLD,  BTN1_LONG_PRESS_HOLD_Handler);\n\tbutton_start(\u0026btn1);\n\t\n\t//make the timer invoking the button_ticks() interval 5ms.\n\t//This function is implemented by yourself.\n\t__timer_start(button_ticks, 0, 5); \n\t\n\twhile(1) \n\t{}\n}\n\n```\n\n## 状态图\n\n![states.png](states.png)\n\n## 仓库\n\nhttps://github.com/RT-Thread-packages/MultiButton\n","funding_links":[],"categories":["Packages"],"sub_categories":["Misc"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FRT-Thread-packages%2FMultiButton","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FRT-Thread-packages%2FMultiButton","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FRT-Thread-packages%2FMultiButton/lists"}