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

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3325|回复: 5

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

[复制链接]
发表于 2019-11-5 11:20 | 显示全部楼层 |阅读模式
本帖最后由 w466909383 于 2019-11-5 11:29 编辑

[mw_shl_code=arduino,true]#define BUTTONCOUNT 5
#define HIGHMODE

int Mode=0;
const int ButtonPin[BUTTONCOUNT] = { 2,3,4,5,6 };
int ButtonStat[BUTTONCOUNT] = { 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);
        }
        
}
[/mw_shl_code]



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


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

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


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

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

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







发表于 2019-11-5 14:56 | 显示全部楼层
想找个扫描PC键盘的程序,,,自己做键盘。。。
发表于 2019-11-6 17:28 | 显示全部楼层
本帖最后由 完完全全 于 2019-11-6 17:29 编辑

兄弟,我最近也在研究按键!下面怎样,实现长按
#define buttonPin  7
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[BUTTONCOUNT] = { 0 };

这是神马???
 楼主| 发表于 2019-11-11 11:29 | 显示全部楼层
完完全全 发表于 2019-11-6 17:28
兄弟,我最近也在研究按键!下面怎样,实现长按
#define buttonPin  7
int jianzhi=0;

我这段也想把长按短按的操作加上 不难
发表于 2021-11-11 19:50 | 显示全部楼层
楼主的程序有问题,下标没有
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 09:37 , Processed in 0.072556 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表