/* Controlling LEDs via NES Controller Created/Modified By Edward Ford 19 February 2010 Dixon, IL Original Work: Reading a NES Controller By Sebastian Tomczak 21 July 2007 Adelaide, Australia */ int latch = 2; // set the latch pin int clock = 3; // set the clock pin int datin = 4;// set the data in pin int upPin = 12; //set direction UP arrow to Pin 12 int downPin = 11; //set direction DOWN arrow to Pin 11 int leftPin = 10; //set direction LEFT arrow to Pin 10 int rightPin = 9; //set direction RIGHT arrow to Pin 9 int selectPin = 8; //set button SELECT arrow to Pin 8 int startPin = 7; //set button START arrow to Pin 7 int bPin = 6; //set button b to Pin 6 int aPin = 5; //set button a to Pin 5 byte controller_data = 0; /* SETUP */ void setup() { Serial.begin(57600); pinMode(latch,OUTPUT); pinMode(clock,OUTPUT); pinMode(datin,INPUT); pinMode(upPin, OUTPUT); pinMode(downPin, OUTPUT); pinMode(leftPin, OUTPUT); pinMode(rightPin, OUTPUT); pinMode(selectPin, OUTPUT); pinMode(startPin, OUTPUT); pinMode(bPin, OUTPUT); pinMode(aPin, OUTPUT); digitalWrite(latch,HIGH); digitalWrite(clock,HIGH); } /* CONTROLLER READ */ void controllerRead() { controller_data = 0; digitalWrite(latch,LOW); digitalWrite(clock,LOW); digitalWrite(latch,HIGH); delayMicroseconds(2); digitalWrite(latch,LOW); controller_data = digitalRead(datin); for (int i = 1; i <= 7; i ++) { digitalWrite(clock,HIGH); delayMicroseconds(2); controller_data = controller_data << 1; controller_data = controller_data + digitalRead(datin) ; delayMicroseconds(4); digitalWrite(clock,LOW); } } /* PROGRAM */ void loop() { controllerRead(); /*This is where all the action is. Loop calls the controllerRead function which controllerRead then returns a number in binary form. If the no buttons are pressed then controllerRead returns 11111111. See comments below for specific return values The switch statement then reads controller_data and compares it the the 8 known values it may produce. Those conditions are then mapped to an LED which is defined in the top section of the code. */ switch (controller_data) { case B01111111: // A = 01111111 digitalWrite(aPin, HIGH); //turn A LED on break; case B10111111: // B = 10111111 digitalWrite(bPin, HIGH); break; case B11011111: // Select Button = 11011111 digitalWrite(selectPin, HIGH); break; case B11101111: // Start = 11101111 digitalWrite(startPin, HIGH); //turn STRART LED on break; case B11110111: // UP = 11110111 digitalWrite(upPin, HIGH); //turn UP LED on break; case B11111011: // DOWN = 11111011 digitalWrite(downPin, HIGH); //turn DOWN LED on break; case B11111101: // LEFT = 11111101 digitalWrite(leftPin, HIGH); //turn LEFT LED on break; case B11111110: // RIGHT = 11111110 digitalWrite(rightPin, HIGH); //turn RIGHT LED on break; } delay(10); //return all pins to LOW. digitalWrite(upPin, LOW); digitalWrite(downPin, LOW); digitalWrite(leftPin, LOW); digitalWrite(rightPin, LOW); digitalWrite(selectPin, LOW); digitalWrite(startPin, LOW); digitalWrite(bPin, LOW); digitalWrite(aPin, LOW); //Wait for next button push }