Не работает первая кнопка матричной клавиатуры

Medozo
Offline
Зарегистрирован: 04.02.2019

Добрй день. Буду благодарен за помощь. Ситуация следующая.

Собрал матричную клавиатуру 6х6 для игровой панели. Подключил к цифровым пинам Arduino Pro Micro. Залил скетч - все работает, кроме первой кнопки. Скетч писал не сам, а надергал по частям из интернета.

Проблема явно не аппаратная, так как матрица собрана корректно и после замены кнопки проблема сохранилась. Всегда не работает именно кнопка "1", находящаяся на пересечении последнего ряда и последней колонки. В данном слчуае это ряд на цифровом пине 7 и колонка на цифровом пине 14. Но если я поменяю порядок рядов или колонок, номера кнопок сменятся, и та, что окажется первой, всё равно не будет работать.

Вот как выгоядит код, который я использовал:

 

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


#define ENABLE_PULLUPS
#define NUMBUTTONS 36
#define NUMROWS 6
#define NUMCOLS 6

//define the symbols on the buttons of the keypads
byte buttons[NUMROWS][NUMCOLS] = {
  {1,2,3,4,5,6},
  {7,8,9,10,11,12},
  {13,14,15,16,17,18},
  {19,20,21,22,23,24},
  {25,26,27,28,29,30},
  {31,32,33,34,35,36},
};

byte rowPins[NUMROWS] = {2,3,4,5,6,7}; //connect to the row pinouts of the keypad
byte colPins[NUMCOLS] = {15,8,9,10,16,14}; //connect to the column pinouts of the keypad


//initialize an instance of class NewKeypad
Keypad buttbx = Keypad( makeKeymap(buttons), rowPins, colPins, NUMROWS, NUMCOLS);

//initialize an Joystick with 36 buttons;
Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID,
  JOYSTICK_TYPE_JOYSTICK, 36, 0,
 
  false, false, false, false, false, false,
  false, false, false, false, false);

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


void loop() {
    CheckAllButtons();
}


void CheckAllButtons(void) {
      if (buttbx.getKeys())
    {
       for (int i=0; i<LIST_MAX; i++)   // Scan the whole key list.
        {
           if ( buttbx.key[i].stateChanged )   // Only find keys that have changed state.
            {
            switch (buttbx.key[i].kstate) {  // Report active key state : IDLE, PRESSED, HOLD, or RELEASED
                    case PRESSED:
                    case HOLD:
                              Joystick.setButton(buttbx.key[i].kchar, 1);
                              break;
                    case RELEASED:
                    case IDLE:
                              Joystick.setButton(buttbx.key[i].kchar, 0);
                              break;
            }
           }   
         }
     }
}

 

Medozo
Offline
Зарегистрирован: 04.02.2019

Разобрался. Надо было здесь отсчет кнопок начинать с нуля, а не с единицы:

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},
  {24,25,26,27,28,29},
  {30,31,32,33,34,35},
};

Теперь работают все 36. Всем спасибо.