《Arduino》开发 之 Arduino环境下的 移植 正点原子 的 按键扫描 程序

方式一:

本例子从 正点原子 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;
}

方式三:

说明:支持 长按 && 短按 && 不松手 仍会跳出 扫描函数且不会继续调用按键扫描函数,直到判断到松手才会继续调用扫描函数。仍依赖于 方式一

累了,待写~~~~~~~~~~~

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值