全体を公開すると冗長になるため、必要部のみ抜粋します
#include <M5Stack.h>
#include <WiFi.h>
#include <WiFiUdp.h>
#include "esp_system.h"
#include "Adafruit_MCP23017.h"
#define L_H_JOY 7
#define L_V_JOY 6
#define R_H_JOY 5
#define R_V_JOY 4
#define A_BTN 8
#define B_BTN 9
#define X_BTN 10
#define Y_BTN 11
#define R_BTN 12
#define RZ_BTN 13
#define L_BTN 14
#define LZ_BTN 15
#define INPUT1_BTN 0
#define INPUT2_BTN 1
#define INPUT3_BTN 2
#define INPUT4_BTN 3
#define RENDA_JUDGE_TIME 250
#define RENDA_KANKAKU_MS 60
Adafruit_MCP23017 mcp;
void setup()
{
M5.begin();
Serial.begin(115200);
M5.Lcd.fillScreen(BLACK);
mcp.begin();
mcp.pinMode(L_V_JOY, INPUT);
mcp.pinMode(L_H_JOY, INPUT);
mcp.pinMode(R_V_JOY, INPUT);
mcp.pinMode(R_H_JOY, INPUT);
mcp.pinMode(A_BTN, OUTPUT);
mcp.digitalWrite(A_BTN, 1);
mcp.pinMode(B_BTN, OUTPUT);
mcp.digitalWrite(B_BTN, 1);
mcp.pinMode(X_BTN, OUTPUT);
mcp.digitalWrite(X_BTN, 1);
mcp.pinMode(Y_BTN, OUTPUT);
mcp.digitalWrite(Y_BTN, 1);
mcp.pinMode(L_BTN, OUTPUT);
mcp.digitalWrite(L_BTN, 1);
mcp.pinMode(LZ_BTN, OUTPUT);
mcp.digitalWrite(LZ_BTN, 1);
mcp.pinMode(R_BTN, OUTPUT);
mcp.digitalWrite(R_BTN, 1);
mcp.pinMode(RZ_BTN, OUTPUT);
mcp.digitalWrite(RZ_BTN, 1);
mcp.pullUp(0, HIGH);
mcp.pullUp(1, HIGH);
mcp.pullUp(2, HIGH);
mcp.pullUp(3, HIGH);
}
void loop(){
M5.update();
if(M5.BtnA.wasPressed()){
game_idx = (game_idx-1)%3;
}
if(M5.BtnC.wasPressed()){
game_idx = (game_idx+1)%3;
}
if(game_idx != game_idx_old){
if(game_idx == 0){
M5.Lcd.drawJpgFile(SD, "/mariocart.jpg");
M5.Lcd.drawJpgFile(SD, "/mc_accel.jpg", 0, 180);
M5.Lcd.drawJpgFile(SD, "/mc_item.jpg", 80, 180);
M5.Lcd.drawJpgFile(SD, "/mc_left.jpg", 160, 180);
M5.Lcd.drawJpgFile(SD, "/mc_right.jpg", 240, 180);
}
**** 中略 ****
game_idx_old = game_idx;
}
int jyuji_val_update = jyuji_val;
int btn_val_update = btn_val;
int input_val = mcp.digitalRead(INPUT4_BTN)*8+mcp.digitalRead(INPUT3_BTN)*4+mcp.digitalRead(INPUT2_BTN)*2+mcp.digitalRead(INPUT1_BTN);
if(game_idx == 0){
if(mcp.digitalRead(INPUT1_BTN) == 0){
btn_val_update |= 0b00000001;
}
if(mcp.digitalRead(INPUT2_BTN) == 0){
btn_val_update |= 0b01000000;
}
if(mcp.digitalRead(INPUT3_BTN) == 0){
jyuji_val_update |= 0b0010;
}
if(mcp.digitalRead(INPUT4_BTN) == 0){
jyuji_val_update |= 0b0001;
}
if((input_val & 0b0001) != (input_val_old & 0b0001)){
if((input_val & 0b0001) == 0) M5.Lcd.drawJpgFile(SD, "/mc_accel_on.jpg", 0, 180);
else M5.Lcd.drawJpgFile(SD, "/mc_accel.jpg", 0, 180);
}
if((input_val & 0b0010) != (input_val_old & 0b0010)){
if((input_val & 0b0010) == 0) M5.Lcd.drawJpgFile(SD, "/mc_item_on.jpg", 80, 180);
else M5.Lcd.drawJpgFile(SD, "/mc_item.jpg", 80, 180);
}
if((input_val & 0b0100) != (input_val_old & 0b0100)){
if((input_val & 0b0100) == 0) M5.Lcd.drawJpgFile(SD, "/mc_left_on.jpg", 160, 180);
else M5.Lcd.drawJpgFile(SD, "/mc_left.jpg", 160, 180);
}
if((input_val & 0b1000) != (input_val_old & 0b1000)){
if((input_val & 0b1000) == 0) M5.Lcd.drawJpgFile(SD, "/mc_right_on.jpg", 240, 180);
else M5.Lcd.drawJpgFile(SD, "/mc_right.jpg", 240, 180);
}
*** 中略 *****
if((jyuji_val_update & 0b1000) >> 3){
mcp.pinMode(L_V_JOY, OUTPUT);
mcp.digitalWrite(L_V_JOY, 0);
Serial.println("push UP");
}else if((jyuji_val_update & 0b0100) >> 2){
mcp.pinMode(L_V_JOY, OUTPUT);
mcp.digitalWrite(L_V_JOY, 1);
Serial.println("push DOWN");
}else{
mcp.pinMode(L_V_JOY, INPUT);
}
if((jyuji_val_update & 0b0010) >> 1){
mcp.pinMode(L_H_JOY, OUTPUT);
mcp.digitalWrite(L_H_JOY, 0);
Serial.println("push LEFT");
}else if(jyuji_val_update & 0b0001){
mcp.pinMode(L_H_JOY, OUTPUT);
mcp.digitalWrite(L_H_JOY, 1);
Serial.println("push RIGHT");
}else{
mcp.pinMode(L_H_JOY, INPUT);
}
if((btn_val_update & 0b00000100) >> 2){
mcp.pinMode(X_BTN, OUTPUT);
mcp.digitalWrite(X_BTN, 0);
Serial.println("push X");
}else{
mcp.pinMode(X_BTN, INPUT);
}
if((btn_val_update & 0b00000010) >> 1){
mcp.pinMode(B_BTN, OUTPUT);
mcp.digitalWrite(B_BTN, 0);
Serial.println("push B");
}else{
mcp.pinMode(B_BTN, INPUT);
}
if((btn_val_update & 0b00001000) >> 3){
mcp.pinMode(Y_BTN, OUTPUT);
mcp.digitalWrite(Y_BTN, 0);
Serial.println("push Y");
}else{
mcp.pinMode(Y_BTN, INPUT);
}
if(btn_val_update & 0b00000001){
mcp.pinMode(A_BTN, OUTPUT);
mcp.digitalWrite(A_BTN, 0);
Serial.println("push A");
}else{
mcp.pinMode(A_BTN, INPUT);
}
if((btn_val_update & 0b10000000) >> 7){
mcp.pinMode(LZ_BTN, OUTPUT);
mcp.digitalWrite(LZ_BTN, 0);
Serial.println("push LZ");
}else{
mcp.pinMode(LZ_BTN, INPUT);
}
if((btn_val_update & 0b01000000) >> 6){
mcp.pinMode(L_BTN, OUTPUT);
mcp.digitalWrite(L_BTN, 0);
Serial.println("push L");
}else{
mcp.pinMode(L_BTN, INPUT);
}
if((btn_val_update & 0b00100000) >> 5){
mcp.pinMode(RZ_BTN, OUTPUT);
mcp.digitalWrite(RZ_BTN, 0);
Serial.println("push RZ");
}else{
mcp.pinMode(RZ_BTN, INPUT);
}
if((btn_val_update & 0b00010000) >> 4){
mcp.pinMode(R_BTN, OUTPUT);
mcp.digitalWrite(R_BTN, 0);
Serial.println("push R");
}else{
mcp.pinMode(R_BTN, INPUT);
}
input_val_old = input_val;
delay(20);
}