Friday, September 13, 2013

Using an address shift to control a LED number array

This is the setup for controlling an LED Number array. Sorry no videos... my videos are not uploading :(
int data = 2;
int clock = 3;
int latch = 4;
int one[] ={6,4};
int two[] ={2,3};
int three[] ={1,5};
String numbers[]= {"one", "two", "three"};

int ledState = 0;
const int ON = HIGH;
const int OFF = LOW;

void setup() {
pinMode(2, OUTPUT); //data
pinMode(3,OUTPUT); //clock
pinMode(4, OUTPUT); //latch
}

void loop() {
   for(int b=0; b < sizeof(numbers); b++){
     for(int i=0; i < sizeof(numbers[b]); i++){ //loops through each element of the array that was created earlier
      changeLED(numbers[b][i], ON);             //uses the sizeof function to determine the length of the array
      }
      delay(1000);
      for(int i=0; i <  sizeof(numbers[b]); i++){
      changeLED(numbers[b][i], OFF);
      }
      delay(1000);
   }
}
void updateLEDs(int value){
  digitalWrite(latch, LOW);     //Pulls the chips latch low
  shiftOut(data, clock, MSBFIRST, value); //Shifts out the 8 bits to the shift register
  digitalWrite(latch, HIGH);   //Pulls the latch high displaying the data
}

/*
 * updateLEDsLong() - sends the LED states set in ledStates to the 74HC595
 * sequence. Same as updateLEDs except the shifting out is done in software
 * so you can see what is happening.
 */
void updateLEDsLong(int value){
  digitalWrite(latch, LOW);    //Pulls the chips latch low
  for(int i = 0; i < 8; i++){  //Will repeat 8 times (once for each bit)
  int bit = value & B10000000; //We use a "bitmask" to select only the eighth
                               //bit in our number (the one we are addressing this time through
  value = value << 1;          //we move our number up one bit value so next time bit 7 will be
                               //bit 8 and we will do our math on it
  if(bit == 128){digitalWrite(data, HIGH);} //if bit 8 is set then set our data pin high
  else{digitalWrite(data, LOW);}            //if bit 8 is unset then set the data pin low
  digitalWrite(clock, HIGH);                //the next three lines pulse the clock pin
  delay(1);
  digitalWrite(clock, LOW);
  }
  digitalWrite(latch, HIGH);  //pulls the latch high shifting our data into being displayed
}



int bits[] = {B00000001, B00000010, B00000100, B00001000, B00010000, B00100000, B01000000, B10000000};
int masks[] = {B11111110, B11111101, B11111011, B11110111, B11101111, B11011111, B10111111, B01111111};
/*
 * changeLED(int led, int state) - changes an individual LED
 * LEDs are 0 to 7 and state is either 0 - OFF or 1 - ON
 */
 void changeLED(int led, int state){
   ledState = ledState & masks[led];  //clears ledState of the bit we are addressing
   if(state == ON){ledState = ledState | bits[led];} //if the bit is on we will add it to ledState
   updateLEDs(ledState);              //send the new LED state to the shift register
 }

No comments:

Post a Comment