黑乌鸦的Arduino兵器库-分享一段自用的万能按键扫描代码-Arduino中文社区 - Powered by Discuz! Archiver

w466909383 发表于 2019-11-5 11:20

黑乌鸦的Arduino兵器库-----分享一段自用的万能按键扫描代码

本帖最后由 w466909383 于 2019-11-5 11:29 编辑

#define BUTTONCOUNT 5
#define HIGHMODE

int Mode=0;
const int ButtonPin = { 2,3,4,5,6 };
int ButtonStat = { 0 };
void setup()
{
      Serial.begin(9600);
      IintButton();
      //IintButton(LOWMODE);
}
void IintButton()
{
      #if define HIGHMODE
          Mode=1;
      #else
          Mode=0;
      #endif
      for (int i = 0; i < BUTTONCOUNT; ++i)
      {
                if (Mode)
                        pinMode(ButtonPin, INPUT);
                else
                        pinMode(ButtonPin, INPUT_PULLUP);
                ButtonStat = 0;
      }
}
int ScanButton()
{
      for (int i = 0; i < BUTTONCOUNT; ++i)
      {
                if (digitalRead(ButtonPin)==Mode)
                {
                        if (ButtonStat != 1)
                        {
                              if (!ButtonStat)
                              {
                                        ButtonStat = -1;
                                        delay(10);
                              }
                              else if (ButtonStat == -1)
                              {
                                        ButtonStat = 1;
                                        return i + 1;
                              }
                        }

                }
                else
                {
                        if (ButtonStat == -1)
                        {
                              ButtonStat = 0;
                        }
                        else if (ButtonStat == 1)
                        {
                              ButtonStat = 0;
                              return -1 * (i + 1);
                        }
                }
      }
      return 0;
}
void loop()
{
      int button = ScanButton();
      if (button)
      {
                Serial.println(button);
      }
      
}



#define BUTTONCOUNT 5   这里设置你的按键个数


#define HIGHMODE    这里设置按键触发模式   (低电平触发还是高电平触发)

const int ButtonPin = { 2,3,4,5,6 };    设置引脚号


扫描采用了非阻塞的方式
进行了简单的防抖处理
能有效的扫描按键的 按下状态和弹起状态

想要学习更多内容加QQ群吧
乌鸦的Arduino交流群:46127581

----------------------------------------------------------------------
写在后面:
时隔多日再次更新兵器库系列 ,回帖不多让我很难受







奈何col 发表于 2019-11-5 14:56

想找个扫描PC键盘的程序,,,自己做键盘。。。

完完全全 发表于 2019-11-6 17:28

本帖最后由 完完全全 于 2019-11-6 17:29 编辑

兄弟,我最近也在研究按键!下面怎样,实现长按
#define buttonPin7
int jianzhi=0;
int sw_state =0;
unsigned long start_hold=0;
unsigned long hold_time=0;

void setup() {
Serial.begin(9600);
Serial.print("jianzhi:");
Serial.print(jianzhi);
pinMode(buttonPin,INPUT_PULLUP);
}

void loop() {

sw_state = digitalRead(buttonPin);   
if (sw_state==LOW)
      start_hold = millis();
while (sw_state == LOW) {//应该这条语句造成阻塞
      sw_state = digitalRead(buttonPin);
      hold_time=millis()-start_hold;
    if (hold_time>5){//防抖
      switch (hold_time>1500){//判断按下的时间
      case 1:jianzhi=2;
      hold_time=0;//这句其实没什么用!
          break;
      case 0:jianzhi=1;
      hold_time=0;
          break;
      }

      }
}
Serial.println("jianzhi:");
Serial.println(jianzhi);
}


完完全全 发表于 2019-11-6 19:58

int ButtonStat = { 0 };

这是神马???

w466909383 发表于 2019-11-11 11:29

完完全全 发表于 2019-11-6 17:28
兄弟,我最近也在研究按键!下面怎样,实现长按
#define buttonPin7
int jianzhi=0;


我这段也想把长按短按的操作加上 不难

Highnose 发表于 2021-11-11 19:50

楼主的程序有问题,下标没有
页: [1]
查看完整版本: 黑乌鸦的Arduino兵器库-----分享一段自用的万能按键扫描代码