Button Arduino矩阵按钮框,一次按键识别为四次按键同时按下

Button Arduino矩阵按钮框,一次按键识别为四次按键同时按下,button,matrix,arduino,Button,Matrix,Arduino,我正在尝试使用较少的按钮在示例代码中创建矩阵按钮框: 代码草图和接线方案: 这就是我想做的: 我已经完成了这个设置,但当我按下一个键时,它会识别为四个键同时按下。我想一定是相关的行和列。我只是arduino世界的初学者。如果有人帮忙,我会非常感激的 我曾尝试在代码中更改行和列的大小,并相互更改行和列的引脚,但都没有成功 //BUTTON BOX //USE w ProMicro //Tested in WIN10 + Assetto Corsa //AMSTUDIO //20.8.17

我正在尝试使用较少的按钮在示例代码中创建矩阵按钮框:

代码草图和接线方案:

这就是我想做的:

我已经完成了这个设置,但当我按下一个键时,它会识别为四个键同时按下。我想一定是相关的行和列。我只是arduino世界的初学者。如果有人帮忙,我会非常感激的

我曾尝试在代码中更改行和列的大小,并相互更改行和列的引脚,但都没有成功

//BUTTON BOX 
//USE w ProMicro
//Tested in WIN10 + Assetto Corsa
//AMSTUDIO
//20.8.17

#include <Keypad.h>
#include <Joystick.h>

#define ENABLE_PULLUPS
#define NUMROTARIES 4
#define NUMBUTTONS 24
#define NUMROWS 5
#define NUMCOLS 5


byte buttons[NUMROWS][NUMCOLS] = {
  {0,1,2,3,4},
  {5,6,7,8,9},
  {10,11,12,13,14},
  {15,16,17,18,19},
  {20,21,22,23},
};

struct rotariesdef {
  byte pin1;
  byte pin2;
  int ccwchar;
  int cwchar;
  volatile unsigned char state;
};

rotariesdef rotaries[NUMROTARIES] {
  {0,1,24,25,0},
  {2,3,26,27,0},
  {4,5,28,29,0},
  {6,7,30,31,0},
};

#define DIR_CCW 0x10
#define DIR_CW 0x20
#define R_START 0x0

#ifdef HALF_STEP
#define R_CCW_BEGIN 0x1
#define R_CW_BEGIN 0x2
#define R_START_M 0x3
#define R_CW_BEGIN_M 0x4
#define R_CCW_BEGIN_M 0x5
const unsigned char ttable[6][4] = {
  // R_START (00)
  {R_START_M,            R_CW_BEGIN,     R_CCW_BEGIN,  R_START},
  // R_CCW_BEGIN
  {R_START_M | DIR_CCW, R_START,        R_CCW_BEGIN,  R_START},
  // R_CW_BEGIN
  {R_START_M | DIR_CW,  R_CW_BEGIN,     R_START,      R_START},
  // R_START_M (11)
  {R_START_M,            R_CCW_BEGIN_M,  R_CW_BEGIN_M, R_START},
  // R_CW_BEGIN_M
  {R_START_M,            R_START_M,      R_CW_BEGIN_M, R_START | DIR_CW},
  // R_CCW_BEGIN_M
  {R_START_M,            R_CCW_BEGIN_M,  R_START_M,    R_START | DIR_CCW},
};
#else
#define R_CW_FINAL 0x1
#define R_CW_BEGIN 0x2
#define R_CW_NEXT 0x3
#define R_CCW_BEGIN 0x4
#define R_CCW_FINAL 0x5
#define R_CCW_NEXT 0x6

const unsigned char ttable[7][4] = {
  // R_START
  {R_START,    R_CW_BEGIN,  R_CCW_BEGIN, R_START},
  // R_CW_FINAL
  {R_CW_NEXT,  R_START,     R_CW_FINAL,  R_START | DIR_CW},
  // R_CW_BEGIN
  {R_CW_NEXT,  R_CW_BEGIN,  R_START,     R_START},
  // R_CW_NEXT
  {R_CW_NEXT,  R_CW_BEGIN,  R_CW_FINAL,  R_START},
  // R_CCW_BEGIN
  {R_CCW_NEXT, R_START,     R_CCW_BEGIN, R_START},
  // R_CCW_FINAL
  {R_CCW_NEXT, R_CCW_FINAL, R_START,     R_START | DIR_CCW},
  // R_CCW_NEXT
  {R_CCW_NEXT, R_CCW_FINAL, R_CCW_BEGIN, R_START},
};
#endif

byte rowPins[NUMROWS] = {21,20,19,18,15}; 
byte colPins[NUMCOLS] = {14,16,10,9,8}; 

Keypad buttbx = Keypad( makeKeymap(buttons), rowPins, colPins, NUMROWS, NUMCOLS); 

Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID, 
  JOYSTICK_TYPE_JOYSTICK, 32, 0,
  false, false, false, false, false, false,
  false, false, false, false, false);

void setup() {
  Joystick.begin();
  rotary_init();}

void loop() { 

  CheckAllEncoders();

  CheckAllButtons();

}

void CheckAllButtons(void) {
      if (buttbx.getKeys())
    {
       for (int i=0; i<LIST_MAX; i++)   
        {
           if ( buttbx.key[i].stateChanged )   
            {
            switch (buttbx.key[i].kstate) {  
                    case PRESSED:
                    case HOLD:
                              Joystick.setButton(buttbx.key[i].kchar, 1);
                              break;
                    case RELEASED:
                    case IDLE:
                              Joystick.setButton(buttbx.key[i].kchar, 0);
                              break;
            }
           }   
         }
     }
}


void rotary_init() {
  for (int i=0;i<NUMROTARIES;i++) {
    pinMode(rotaries[i].pin1, INPUT);
    pinMode(rotaries[i].pin2, INPUT);
    #ifdef ENABLE_PULLUPS
      digitalWrite(rotaries[i].pin1, HIGH);
      digitalWrite(rotaries[i].pin2, HIGH);
    #endif
  }
}


unsigned char rotary_process(int _i) {
   unsigned char pinstate = (digitalRead(rotaries[_i].pin2) << 1) | digitalRead(rotaries[_i].pin1);
  rotaries[_i].state = ttable[rotaries[_i].state & 0xf][pinstate];
  return (rotaries[_i].state & 0x30);
}

void CheckAllEncoders(void) {
  for (int i=0;i<NUMROTARIES;i++) {
    unsigned char result = rotary_process(i);
    if (result == DIR_CCW) {
      Joystick.setButton(rotaries[i].ccwchar, 1); delay(50); Joystick.setButton(rotaries[i].ccwchar, 0);
    };
    if (result == DIR_CW) {
      Joystick.setButton(rotaries[i].cwchar, 1); delay(50); Joystick.setButton(rotaries[i].cwchar, 0);
    };
  }
}
//按钮框
//使用w ProMicro
//在WIN10+Assetto Corsa中测试
//阿姆工作室
//20.8.17
#包括
#包括
#定义启用上拉
#定义NUMROTARIES 4
#定义按钮24
#定义NUMROWS 5
#定义NUMCOLS 5
字节按钮[NUMROWS][NUMCOLS]={
{0,1,2,3,4},
{5,6,7,8,9},
{10,11,12,13,14},
{15,16,17,18,19},
{20,21,22,23},
};
结构rotariesdef{
字节pin1;
字节pin2;
int ccwchar;
int-cwchar;
易失性无符号字符状态;
};
rotariesdef rotaries[NUMROTARIES]{
{0,1,24,25,0},
{2,3,26,27,0},
{4,5,28,29,0},
{6,7,30,31,0},
};
#定义目录CCW 0x10
#定义目录CW 0x20
#定义R_开始0x0
#ifdef半步
#定义R_CCW_开始0x1
#定义R_CW_开始0x2
#定义R_START_M 0x3
#定义R_CW_BEGIN_M 0x4
#定义R_CCW_BEGIN_M 0x5
常量无符号字符表[6][4]={
//R_开始(00)
{R_START_M,R_CW_BEGIN,R_CCW_BEGIN,R_START},
//R_CCW_开始
{R_START_M|DIR_CCW,R_START,R_CCW_BEGIN,R_START},
//开始
{R_START_M|DIR_CW,R_CW_BEGIN,R_START,R_START},
//R_开始(11)
{R_START_M,R_CCW_BEGIN_M,R_CW_BEGIN_M,R_START},
//开始
{R_START_M,R_START_M,R_CW_BEGIN_M,R_START|DIR_CW},
//R_CCW_BEGIN_M
{R_START_M,R_CCW_BEGIN_M,R_START_M,R_START | DIR_CCW},
};
#否则
#定义R_CW_FINAL 0x1
#定义R_CW_开始0x2
#定义R_CW_NEXT 0x3
#定义R_CCW_开始0x4
#定义R_CCW_FINAL 0x5
#定义R_CCW_NEXT 0x6
常量无符号字符表[7][4]={
//开始
{R_START,R_CW_BEGIN,R_CCW_BEGIN,R_START},
//R_CW_决赛
{R_CW_NEXT,R_START,R_CW_FINAL,R_START | DIR_CW},
//开始
{R_CW_NEXT,R_CW_BEGIN,R_START,R_START},
//下一个
{R_CW_NEXT,R_CW_BEGIN,R_CW_FINAL,R_START},
//R_CCW_开始
{R_CCW_NEXT,R_START,R_CCW_BEGIN,R_START},
//R_CCW_期末考试
{R_CCW_NEXT,R_CCW_FINAL,R_START,R_START | DIR_CCW},
//下一步
{R_CCW_NEXT,R_CCW_FINAL,R_CCW_BEGIN,R_START},
};
#恩迪夫
字节行pins[NUMROWS]={21,20,19,18,15};
字节colPins[NUMCOLS]={14,16,10,9,8};
小键盘buttbx=小键盘(makeymap(按钮)、行针、列针、numrow、NUMCOLS);
操纵杆(操纵杆默认报告ID),
操纵杆类型操纵杆,32,0,
假,假,假,假,假,假,假,
假,假,假,假,假,假);
无效设置(){
操纵杆。开始();
旋转_init();}
void loop(){
CheckAllEncoders();
选中所有按钮();
}
作废检查所有按钮(作废){
if(buttbx.getKeys())
{

对于(int i=0;i您能否提供您实际使用的代码,而不是您基于的另一个项目的代码?这样我们可以分析您的代码的功能。否则,我们将建议您可能已经尝试过的内容

也就是说,您是否将设置修改为此

#define NUMBUTTONS 18
#define NUMROWS 4
#define NUMCOLS 5


byte buttons[NUMROWS][NUMCOLS] = {
  {0,1,2,3,4},
  {5,6,7,8,9},
  {10,11,12,13,14},
  {15,16,17}
};
您还需要确保这些与您的接线对齐:

byte rowPins[NUMROWS] = {21,20,19,18,15}; 
byte colPins[NUMCOLS] = {14,16,10,9,8}; 

如果这不能解决问题,“按下”按钮是列还是行?

你能提供你实际使用的代码,而不是你基于的另一个项目的代码吗?这样我们可以分析你的代码的功能。否则我们会建议你可能已经尝试过的东西

也就是说,您是否将设置修改为此

#define NUMBUTTONS 18
#define NUMROWS 4
#define NUMCOLS 5


byte buttons[NUMROWS][NUMCOLS] = {
  {0,1,2,3,4},
  {5,6,7,8,9},
  {10,11,12,13,14},
  {15,16,17}
};
您还需要确保这些与您的接线对齐:

byte rowPins[NUMROWS] = {21,20,19,18,15}; 
byte colPins[NUMCOLS] = {14,16,10,9,8}; 

如果这不能解决问题,“按下”按钮是列还是行?

你能将代码粘贴到这里而不是链接github/图像吗?@BenjaminUrquhart抱歉,我现在添加了代码。你能将代码粘贴到这里而不是链接github/图像吗?@BenjaminUrquhart抱歉,我现在添加了代码。