Arduino Pro Micro Digital Pins: 24 Buttons

//DIGITAL PINS 24 BUTTONS
//USE ARDUINO PRO MICRO 
//Tested
//BY LONGLO
//05.11.2020

#include <Keypad.h>
#include <Joystick.h>
#define ENABLE_PULLUPS
#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},
};
#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_M, R_CW_BEGIN, R_CCW_BEGIN, R_START},
  {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_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_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_CW_BEGIN, R_CCW_BEGIN, R_START},
  {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_NEXT, R_START, R_CCW_BEGIN, R_START},
  {R_CCW_NEXT, R_CCW_FINAL, R_START, R_START | DIR_CCW},
  {R_CCW_NEXT, R_CCW_FINAL, R_CCW_BEGIN, R_START},
};
#endif
byte rowPins[NUMROWS] = {4, 3, 2, 0, 1};
byte colPins[NUMCOLS] = {9, 8, 7, 6, 5};
Keypad buttbx = Keypad( makeKeymap(buttons), rowPins, colPins, NUMROWS, NUMCOLS);
Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID, JOYSTICK_TYPE_JOYSTICK, 24, 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++)
    {
      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;
        }
      }
    }
  }
}