im not a coder, but I managed to modify some code i found online to work with my arduino micro. I have a video game controller made up completely of buttons. the purpose of the code is so that when opposite directions are input simultaneously, the arduino will output which ever was input last, so if i hold down the left button, and then simultaneously hold down the right button, the output will change from left to right. the code was originally written for left/right only, but I added up/down. it actually works really well for the intended purpose, but the unintended consequence is that I can no longer go diagonal, so for example if im pressing left, and then down, it will only go left. Id really appreciate any help or a fix. like i said im not a coder, and it is pretty challenging for me to follow.
int up_input = 2;
int down_input = 3;
int up_output = 11;
int down_output = 12;
int left_input = 0; //RX
int right_input = 1; //TX
int left_output = 8;
int right_output = 9;
volatile boolean b = false;
volatile boolean c = false;
void setup()
{
pinMode(up_input, INPUT);
pinMode(down_input, INPUT);
pinMode(up_output, OUTPUT);
pinMode(down_output, OUTPUT);
pinMode(left_input, INPUT);
pinMode(right_input, INPUT);
pinMode(left_output, OUTPUT);
pinMode(right_output, OUTPUT);
attachInterrupt(1, up, CHANGE);
attachInterrupt(0, down, CHANGE);
attachInterrupt(2, left, CHANGE);
attachInterrupt(3, right, CHANGE);
}
void up(){
b = true;
}
void down(){
b= true;
}
void left(){
c= true;
}
void right(){
c= true;
}
void loop()
{
digitalWrite(up_input, HIGH);
digitalWrite(down_input, HIGH);
digitalWrite(up_output, HIGH);
digitalWrite(down_output, HIGH);
b=false;
digitalWrite(left_input, HIGH);
digitalWrite(right_input, HIGH);
digitalWrite(left_output, HIGH);
digitalWrite(right_output, HIGH);
c=false;
detachInterrupt(1);
while(digitalRead(up_input)==LOW && b==false)
{
digitalWrite(up_output, LOW);
}
attachInterrupt(1, up, CHANGE);
digitalWrite(up_input, HIGH);
digitalWrite(down_input, HIGH);
digitalWrite(up_output, HIGH);
digitalWrite(down_output, HIGH);
b=false;
detachInterrupt(0);
while(digitalRead(down_input)==LOW && b==false)
{
digitalWrite(down_output, LOW);
}
attachInterrupt(0, down, CHANGE);
detachInterrupt(2);
while(digitalRead(left_input)==LOW && c==false)
{
digitalWrite(left_output, LOW);
}
attachInterrupt(2, left, CHANGE);
digitalWrite(left_input, HIGH);
digitalWrite(right_input, HIGH);
digitalWrite(left_output, HIGH);
digitalWrite(right_output, HIGH);
c=false;
detachInterrupt(3);
while(digitalRead(right_input)==LOW && c==false)
{
digitalWrite(right_output, LOW);
}
attachInterrupt(3, right, CHANGE);
}
