//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; } } } } }