Project Code
>
> Code
>
> /* SHIFT REGISTER CONTROL PINS */
> #define CLOCKPIN 11 //6 // SRCK TPICB595 // Blue // ST_CP 74HC595
> #define LATCHPIN 10 //5 // RCK TPICB595 // White // ST_HP 74HC595
> #define DATAPIN 8 // 4 // SER IN TPICB595 // White // DS 74HC595
>
> #define KEYPRESS 5
> /* SHIFT REGISTER CONTROL CONSTANTS */
> #define ALLOUTPUTSOFF 0
> #define ALLOUTPUTSON 65536 - 1
>
> int accessDiscreteIO[19] = {ALLOUTPUTSOFF, 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, ALLOUTPUTSON};
> int shiftRegState = 0;
>
> // Constants
> #define MULTIPLEXER_S0 5
> #define MULTIPLEXER_S1 4
> #define MULTIPLEXER_S2 3
> #define MULTIPLEXER_S3 2
>
> int prevnum = -1;
> int shift;
> int counter = -1;
>
>
> // Declare Multiplexer Access Variabless
> int pinA, pinB, pinC, pinD, pinABCD;
>
> void setup()
> {
> Serial.begin(57600);
>
> // Set MULTIPLEXER_S0/1/2 Mode
> pinMode(MULTIPLEXER_S0, OUTPUT);
> pinMode(MULTIPLEXER_S1, OUTPUT);
> pinMode(MULTIPLEXER_S2, OUTPUT);
> pinMode(MULTIPLEXER_S3, OUTPUT);
> pinMode(6, INPUT);
>
> pinMode(CLOCKPIN, OUTPUT);
> pinMode(LATCHPIN, OUTPUT);
> pinMode(DATAPIN, OUTPUT);
>
> /* All LEDS off - Brute Force - Zero Out All I/O Pins */
> digitalWrite(LATCHPIN, LOW);
> matrix(DATAPIN, CLOCKPIN, MSBFIRST, ALLOUTPUTSOFF);
> digitalWrite(LATCHPIN, HIGH);
> delay(500);
>
> /* All LEDS off - Brute Force - Zero Out All I/O Pins */
> digitalWrite(LATCHPIN, LOW);
> matrix(DATAPIN, CLOCKPIN, MSBFIRST, ALLOUTPUTSON);
> digitalWrite(LATCHPIN, HIGH);
> delay(500);
>
> /* All LEDS off - Brute Force - Zero Out All I/O Pins */
> digitalWrite(LATCHPIN, LOW);
> matrix(DATAPIN, CLOCKPIN, MSBFIRST, ALLOUTPUTSOFF);
> digitalWrite(LATCHPIN, HIGH);
> delay(500);
>
> //
> /* Test all I/O Pins - Move through the Shift Register,
> and turn each Led on & off, one at a time in sequence. */
> for(int i = 1; i < 18; i++)
> {
> digitalWrite(LATCHPIN, LOW);
> matrix(DATAPIN, CLOCKPIN, MSBFIRST, accessDiscreteIO[i]);
> digitalWrite(LATCHPIN, HIGH);
> delay(125);
> }
>
> // /* Test all I/O Pins - Move through the Shift Register,
> // and turn on and hold each Led, one at a time in sequence. */
> for(int i = 1; i < 18; i++)
> {
> digitalWrite(LATCHPIN, LOW);
> matrix(DATAPIN, CLOCKPIN, MSBFIRST, accessDiscreteIO[i] - 1);
> digitalWrite(LATCHPIN, HIGH);
> delay(125);
> }
>
> delay(1500);
>
> /* All LEDS off - Brute Force - Zero Out All I/O Pins */
> digitalWrite(LATCHPIN, LOW);
> matrix(DATAPIN, CLOCKPIN, MSBFIRST, ALLOUTPUTSOFF);
> digitalWrite(LATCHPIN, HIGH);
> delay(500);
>
> // Initialise Multiplexer Access Variabless
> pinA = pinB = pinC = pinD = pinABCD = 0;
> }
>
>
> void readToMultiplexer(int pin)
> {
> pinABCD = pin;
> pinA = pinABCD & 0x01;
> pinB = (pinABCD >> 1) & 0x01;
> pinC = (pinABCD >> 2) & 0x01;
> pinD = (pinABCD >> 3) & 0x01;
>
> // Poll Both Multiplexers Through the Same Pins
>
> digitalWrite(MULTIPLEXER_S0, pinA);
> digitalWrite(MULTIPLEXER_S1, pinB);
> digitalWrite(MULTIPLEXER_S2, pinC);
> digitalWrite(MULTIPLEXER_S3, pinD);
>
> if((digitalRead(6) == HIGH))
> {
> Serial.print("Pin Number: " );
> Serial.println(pin);
> Serial.println(counter);
>
> counter++;
>
> digitalWrite(LATCHPIN, LOW);
> matrix(DATAPIN, CLOCKPIN, MSBFIRST, ALLOUTPUTSOFF);
> digitalWrite(LATCHPIN, HIGH);
> delay(25);
>
> digitalWrite(LATCHPIN, LOW);
> matrix(DATAPIN, CLOCKPIN, MSBFIRST, accessDiscreteIO[pin] - 1 );
> digitalWrite(LATCHPIN, HIGH);
> delay(25);
>
> if(KEYPRESS == counter)
> setLEDState(pin);
>
> }
> delay(25);
> } // End of writeToMultiplexer()
>
>
> void setLEDState(int p)
> {
> long timer = millis();
>
> digitalWrite(LATCHPIN, LOW);
> matrix(DATAPIN, CLOCKPIN, MSBFIRST, ALLOUTPUTSOFF);
> digitalWrite(LATCHPIN, HIGH);
> delay(25);
>
> digitalWrite(LATCHPIN, LOW);
> matrix(DATAPIN, CLOCKPIN, MSBFIRST, accessDiscreteIO[random(1, p)] - 1 );
> digitalWrite(LATCHPIN, HIGH);
> delay(25);
>
> long timerOffSet = ((float) 16 - p/random(1, p))* 10000;
> Serial.println(timerOffSet/1000);
>
> //while(millis() - timer < 10000* ((float) 16 - p/random(1, p)) )
> while(millis() - timer < timerOffSet) { /* Wait for x time... */ }
>
> Serial.println("Timer Done.");
> /* Test all I/O Pins - Move through the Shift Register,
> and turn each Led on & off, one at a time in sequence. */
> for(int i = 1; i < 18; i++)
> {
> digitalWrite(LATCHPIN, LOW);
> matrix(DATAPIN, CLOCKPIN, MSBFIRST, accessDiscreteIO[i]);
> digitalWrite(LATCHPIN, HIGH);
> delay(125);
> }
>
> // /* Test all I/O Pins - Move through the Shift Register,
> // and turn on and hold each Led, one at a time in sequence. */
> for(int i = 1; i < 18; i++)
> {
> digitalWrite(LATCHPIN, LOW);
> matrix(DATAPIN, CLOCKPIN, MSBFIRST, accessDiscreteIO[i] - 1);
> digitalWrite(LATCHPIN, HIGH);
> delay(125);
> }
>
> delay(1500);
>
> digitalWrite(LATCHPIN, LOW);
> matrix(DATAPIN, CLOCKPIN, MSBFIRST, ALLOUTPUTSOFF);
> digitalWrite(LATCHPIN, HIGH);
> delay(25);
>
> counter = 0;
> }
>
> void loop ()
> {
> for(int i = 0; i < 16; i++)
> {
> readToMultiplexer(i);
> delay(25);
> }
>
>
> }
>
> /* Shift Out Data - One Bit at a time. */
> void matrix(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint16_t val)
> {
> for (uint8_t i = 0; i < 16; i++)
> {
> digitalWrite(DATAPIN, !!(val & (1 << (15 - i))));
> //Serial.print(!!(val & (1 << (10 - i))));
> digitalWrite(CLOCKPIN, HIGH);
> digitalWrite(CLOCKPIN, LOW);
> }
> }
>
>
> Code
>
> /* SHIFT REGISTER CONTROL PINS */
> #define CLOCKPIN 11 //6 // SRCK TPICB595 // Blue // ST_CP 74HC595
> #define LATCHPIN 10 //5 // RCK TPICB595 // White // ST_HP 74HC595
> #define DATAPIN 8 // 4 // SER IN TPICB595 // White // DS 74HC595
>
> #define KEYPRESS 5
> /* SHIFT REGISTER CONTROL CONSTANTS */
> #define ALLOUTPUTSOFF 0
> #define ALLOUTPUTSON 65536 - 1
>
> int accessDiscreteIO[19] = {ALLOUTPUTSOFF, 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, ALLOUTPUTSON};
> int shiftRegState = 0;
>
> // Constants
> #define MULTIPLEXER_S0 5
> #define MULTIPLEXER_S1 4
> #define MULTIPLEXER_S2 3
> #define MULTIPLEXER_S3 2
>
> int prevnum = -1;
> int shift;
> int counter = -1;
>
>
> // Declare Multiplexer Access Variabless
> int pinA, pinB, pinC, pinD, pinABCD;
>
> void setup()
> {
> Serial.begin(57600);
>
> // Set MULTIPLEXER_S0/1/2 Mode
> pinMode(MULTIPLEXER_S0, OUTPUT);
> pinMode(MULTIPLEXER_S1, OUTPUT);
> pinMode(MULTIPLEXER_S2, OUTPUT);
> pinMode(MULTIPLEXER_S3, OUTPUT);
> pinMode(6, INPUT);
>
> pinMode(CLOCKPIN, OUTPUT);
> pinMode(LATCHPIN, OUTPUT);
> pinMode(DATAPIN, OUTPUT);
>
> /* All LEDS off - Brute Force - Zero Out All I/O Pins */
> digitalWrite(LATCHPIN, LOW);
> matrix(DATAPIN, CLOCKPIN, MSBFIRST, ALLOUTPUTSOFF);
> digitalWrite(LATCHPIN, HIGH);
> delay(500);
>
> /* All LEDS off - Brute Force - Zero Out All I/O Pins */
> digitalWrite(LATCHPIN, LOW);
> matrix(DATAPIN, CLOCKPIN, MSBFIRST, ALLOUTPUTSON);
> digitalWrite(LATCHPIN, HIGH);
> delay(500);
>
> /* All LEDS off - Brute Force - Zero Out All I/O Pins */
> digitalWrite(LATCHPIN, LOW);
> matrix(DATAPIN, CLOCKPIN, MSBFIRST, ALLOUTPUTSOFF);
> digitalWrite(LATCHPIN, HIGH);
> delay(500);
>
> //
> /* Test all I/O Pins - Move through the Shift Register,
> and turn each Led on & off, one at a time in sequence. */
> for(int i = 1; i < 18; i++)
> {
> digitalWrite(LATCHPIN, LOW);
> matrix(DATAPIN, CLOCKPIN, MSBFIRST, accessDiscreteIO[i]);
> digitalWrite(LATCHPIN, HIGH);
> delay(125);
> }
>
> // /* Test all I/O Pins - Move through the Shift Register,
> // and turn on and hold each Led, one at a time in sequence. */
> for(int i = 1; i < 18; i++)
> {
> digitalWrite(LATCHPIN, LOW);
> matrix(DATAPIN, CLOCKPIN, MSBFIRST, accessDiscreteIO[i] - 1);
> digitalWrite(LATCHPIN, HIGH);
> delay(125);
> }
>
> delay(1500);
>
> /* All LEDS off - Brute Force - Zero Out All I/O Pins */
> digitalWrite(LATCHPIN, LOW);
> matrix(DATAPIN, CLOCKPIN, MSBFIRST, ALLOUTPUTSOFF);
> digitalWrite(LATCHPIN, HIGH);
> delay(500);
>
> // Initialise Multiplexer Access Variabless
> pinA = pinB = pinC = pinD = pinABCD = 0;
> }
>
>
> void readToMultiplexer(int pin)
> {
> pinABCD = pin;
> pinA = pinABCD & 0x01;
> pinB = (pinABCD >> 1) & 0x01;
> pinC = (pinABCD >> 2) & 0x01;
> pinD = (pinABCD >> 3) & 0x01;
>
> // Poll Both Multiplexers Through the Same Pins
>
> digitalWrite(MULTIPLEXER_S0, pinA);
> digitalWrite(MULTIPLEXER_S1, pinB);
> digitalWrite(MULTIPLEXER_S2, pinC);
> digitalWrite(MULTIPLEXER_S3, pinD);
>
> if((digitalRead(6) == HIGH))
> {
> Serial.print("Pin Number: " );
> Serial.println(pin);
> Serial.println(counter);
>
> counter++;
>
> digitalWrite(LATCHPIN, LOW);
> matrix(DATAPIN, CLOCKPIN, MSBFIRST, ALLOUTPUTSOFF);
> digitalWrite(LATCHPIN, HIGH);
> delay(25);
>
> digitalWrite(LATCHPIN, LOW);
> matrix(DATAPIN, CLOCKPIN, MSBFIRST, accessDiscreteIO[pin] - 1 );
> digitalWrite(LATCHPIN, HIGH);
> delay(25);
>
> if(KEYPRESS == counter)
> setLEDState(pin);
>
> }
> delay(25);
> } // End of writeToMultiplexer()
>
>
> void setLEDState(int p)
> {
> long timer = millis();
>
> digitalWrite(LATCHPIN, LOW);
> matrix(DATAPIN, CLOCKPIN, MSBFIRST, ALLOUTPUTSOFF);
> digitalWrite(LATCHPIN, HIGH);
> delay(25);
>
> digitalWrite(LATCHPIN, LOW);
> matrix(DATAPIN, CLOCKPIN, MSBFIRST, accessDiscreteIO[random(1, p)] - 1 );
> digitalWrite(LATCHPIN, HIGH);
> delay(25);
>
> long timerOffSet = ((float) 16 - p/random(1, p))* 10000;
> Serial.println(timerOffSet/1000);
>
> //while(millis() - timer < 10000* ((float) 16 - p/random(1, p)) )
> while(millis() - timer < timerOffSet) { /* Wait for x time... */ }
>
> Serial.println("Timer Done.");
> /* Test all I/O Pins - Move through the Shift Register,
> and turn each Led on & off, one at a time in sequence. */
> for(int i = 1; i < 18; i++)
> {
> digitalWrite(LATCHPIN, LOW);
> matrix(DATAPIN, CLOCKPIN, MSBFIRST, accessDiscreteIO[i]);
> digitalWrite(LATCHPIN, HIGH);
> delay(125);
> }
>
> // /* Test all I/O Pins - Move through the Shift Register,
> // and turn on and hold each Led, one at a time in sequence. */
> for(int i = 1; i < 18; i++)
> {
> digitalWrite(LATCHPIN, LOW);
> matrix(DATAPIN, CLOCKPIN, MSBFIRST, accessDiscreteIO[i] - 1);
> digitalWrite(LATCHPIN, HIGH);
> delay(125);
> }
>
> delay(1500);
>
> digitalWrite(LATCHPIN, LOW);
> matrix(DATAPIN, CLOCKPIN, MSBFIRST, ALLOUTPUTSOFF);
> digitalWrite(LATCHPIN, HIGH);
> delay(25);
>
> counter = 0;
> }
>
> void loop ()
> {
> for(int i = 0; i < 16; i++)
> {
> readToMultiplexer(i);
> delay(25);
> }
>
>
> }
>
> /* Shift Out Data - One Bit at a time. */
> void matrix(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint16_t val)
> {
> for (uint8_t i = 0; i < 16; i++)
> {
> digitalWrite(DATAPIN, !!(val & (1 << (15 - i))));
> //Serial.print(!!(val & (1 << (10 - i))));
> digitalWrite(CLOCKPIN, HIGH);
> digitalWrite(CLOCKPIN, LOW);
> }
> }
>
>