声明:关于Wifi-IoT的按键部分,以下两片文章做了很好的分享,本文基于对以下两篇文章的学习修改完成的,感谢原作者@狄泰软件学院客服 的分享,如本文中有任何不妥请联系修改。先附上原文链接
tang实现物理按键的“长按事件”(按键通用框架 V0.0.2)
https://bbs.elecfans.com/jishu_2006297_1_1.html
Delphi Tang实现S1,S2,User三个物理按键的独立事件-上(解决思路分析)
https://bbs.elecfans.com/jishu_2007516_1_1.html
相关的理论知识以上两篇已经写得很好了,本人在其基础上进行了代码整合按照自己的需求修改代码,实现了四个物理按键USER(GPIO5)、显示板S1和S2、智能红绿灯板S1的按下、长按、释放事件。主要代码如附件1。 使用方式请参考附件2。
大概步骤如下
1.导入头文件,具体路径依据你放的位置而定,相同目录下使用
#include "KeyEvent.h"
2.回调函数以及按键功能的定义
- static void KeyEvent_Callback(KEY_ID_TYPE keyid, KEY_EVENT_TYPE event)
- {
- printf("[soon] KeyEvent_Callback() : keyid=%d event= %dn", (int)keyid, (int)event);
- switch (keyid)
- {
- case KEY_ID_GPIO8:
- printf("[soon] KEY_ID_USERn");
- if( event == KEY_EVENT_PRESSED ) { /* 按下事件处理代码 */ }
- if( event == KEY_EVENT_LONG_PRESSED ) { /* 长按事件处理代码 */ }
- if( event == KEY_EVENT_RELEESED ) { /* 释放事件处理代码 */ }
- break;
- case KEY_ID_USER:
- printf("[soon] KEY_ID_USERn");
- if( event == KEY_EVENT_PRESSED ) { /* 按下事件处理代码 */ }
- if( event == KEY_EVENT_LONG_PRESSED ) { /* 长按事件处理代码 */ }
- if( event == KEY_EVENT_RELEESED ) { /* 释放事件处理代码 */ }
- break;
- case KEY_ID_S1:
- printf("[soon] KEY_ID_S1n");
- if( event == KEY_EVENT_PRESSED ) { /* 按下事件处理代码 */ }
- if( event == KEY_EVENT_LONG_PRESSED ) { /* 长按事件处理代码 */ }
- if( event == KEY_EVENT_RELEESED ) { /* 释放事件处理代码 */ }
- break;
- case KEY_ID_S2:
- printf("[soon] KEY_ID_S2n");
- if( event == KEY_EVENT_PRESSED ) { /* 按下事件处理代码 */ }
- if( event == KEY_EVENT_LONG_PRESSED ) { /* 长按事件处理代码 */ }
- if( event == KEY_EVENT_RELEESED ) { /* 释放事件处理代码 */ }
- break;
- default:
- break;
- }
- }
3.在task中调用,对按键进行初始化和配置,相关API如下。
- // 初始化按键事件处理
- KeyEvent_Init();
- /* 设置GPIO_8按键的回调函数*/
- KeyEvent_Connect("GPIO_8", KeyEvent_Callback, KEY_EVENT_PRESSED | KEY_EVENT_LONG_PRESSED | KEY_EVENT_RELEESED);
- /* 设置GPIO_5按键的回调函数*/
- KeyEvent_Connect("GPIO_5", KeyEvent_Callback, KEY_EVENT_PRESSED | KEY_EVENT_LONG_PRESSED | KEY_EVENT_RELEESED);
附件1:
附件2:
加上OLED显示的展示效果如下。[media]https://v.youku.com/v_show/id_XNDk2MzU4OTY5Mg==.html[/media]