方式一:
本例子从 正点原子 STM32例程移植而来,以适应 arduino 环境。
使用效果请查看另一篇文章:《项目》 之 ESP8266 心知天气 + 时钟 + WS2812点阵屏 + B站粉丝计数
说明:mode:0,不支持连续按;1,支持连续按
0模式下,不松手不跳出扫描函数;1模式下,不松手仍会跳出扫描函数且会一直调用函数。
//按键引脚定义:
#define UP_KEY D6 //gpio12
#define M_KEY D5 //gpio14
#define DOWN_KEY D7 //gpio13
#define WAKE_UP D3 //gpio0
#define KEYU digitalRead(UP_KEY)
#define KEYM digitalRead(M_KEY)
#define KEYD digitalRead(DOWN_KEY)
#define KEYW digitalRead(WAKE_UP)
#define UP_KEY_PRES 1
#define M_KEY_PRES 2
#define DOWN_KEY_PRES 3
#define WAKE_UP_PRES 4
//按键处理函数
//mode:0,不支持连续按;1,支持连续按;
//0,没有任何按键按下
uint8_t KEY_Scan(uint8_t mode)
{
uint8_t key_up=1;//按键按松开标志
if(mode)key_up=1; //支持连按
if(key_up&&(KEYU==0||KEYM==0||KEYD==0||KEYW==0))
{
delay(5);//去抖动
key_up=0;
if(KEYU==0)return 1;
else if(KEYM==0)return 2;
else if(KEYD==0)return 3;
else if(KEYW==0)return 4;
}else if(KEYU==1||KEYM==1||KEYD==1||KEYW==1)key_up=1;
return 0;// 无按键按下
}
方式二:
说明:支持 长按 && 短按 && 不松手不跳出扫描函数。依赖于 方式一
#define UP_KEY D6 //gpio12
#define M_KEY D5 //gpio14
#define DOWN_KEY D7 //gpio13
#define WAKE_UP D3 //gpio0
#define KEYU digitalRead(UP_KEY)
#define KEYM digitalRead(M_KEY)
#define KEYD digitalRead(DOWN_KEY)
#define KEYW digitalRead(WAKE_UP)
#define UP_KEY_PRES 1
#define M_KEY_PRES 2
#define DOWN_KEY_PRES 3
#define WAKE_UP_PRES 4
#define UP_KEY_LONG_PRES 11
#define M_KEY_LONG_PRES 22
#define DOWN_KEY_LONG_PRES 33
#define WAKE_UP_LONG_PRES 44
long up_pres_time = 0;
long m_pres_time = 0;
long down_pres_time = 0;
long wake_pres_time = 0;
long key_long_pres_time = 1.2*1000;//按键长时间按下时间
//按键处理函数
//mode:0,不支持连续按;1,支持连续按;
//0,没有任何按键按下
uint8_t KEY_Scan(uint8_t mode)
{
uint8_t key_up=1;//按键按松开标志
if(mode)key_up=1; //支持连按
if(key_up&&(KEYU==0||KEYM==0||KEYD==0||KEYW==0))
{
delay(5);//去抖动
key_up=0;
if(KEYU==0)return 1;
else if(KEYM==0)return 2;
else if(KEYD==0)return 3;
else if(KEYW==0)return 4;
}else if(KEYU==1||KEYM==1||KEYD==1||KEYW==1)key_up=1;
return 0;// 无按键按下
}
//支持长按模式,长按时间需要由key_long_pres_time变量设置
uint8_t KEY_Scan2()
{
uint8_t KEY = KEY_Scan(0);
switch(KEY)
{
case UP_KEY_PRES:
up_pres_time = millis();
break;
case M_KEY_PRES:
m_pres_time = millis();
break;
case DOWN_KEY_PRES:
down_pres_time = millis();
break;
case WAKE_UP_PRES:
wake_pres_time = millis();
break;
}
while(KEYU==0||KEYM==0||KEYD==0||KEYW==0)
{
if(up_pres_time!=0&& millis()-up_pres_time >= key_long_pres_time){
KEY = UP_KEY_LONG_PRES;
}
else if(m_pres_time!=0&& millis()-m_pres_time >= key_long_pres_time){
KEY = M_KEY_LONG_PRES;
}
else if(down_pres_time!=0&& millis()-down_pres_time >= key_long_pres_time){
KEY = DOWN_KEY_LONG_PRES;
}
else if(wake_pres_time!=0&& millis()-wake_pres_time >= key_long_pres_time){
KEY = WAKE_UP_LONG_PRES;
}
ESP.wdtFeed();// 喂 狗
}
up_pres_time = 0;
m_pres_time = 0;
down_pres_time = 0;
wake_pres_time = 0;
return KEY;
}
方式三:
说明:支持 长按 && 短按 && 不松手 仍会跳出 扫描函数且不会继续调用按键扫描函数,直到判断到松手才会继续调用扫描函数。仍依赖于 方式一
累了,待写~~~~~~~~~~~