Using a shift register like the 74HC595 you can convert a serial signal to a parallel output. This is incredibly helpful if you need more digital outputs then the 14 that the ATmega328 on the Arduino Uno provides. The Arduino IDE includes a shiftOut() function that can be used to control an 8-bit shift register like the 74HC595 but I usually like to have complete control over my code so I understand what is going on. For more about how the 74HC595 works see this post then take a look at the code below, which makes it work. The comments in the code should be helpful too.
const int dataPin = 6; // can be any digital pin on the Arduino
const int clockPin = 7; // can be any digital pin on the Arduino
const int latchPin = 8; // can be any digital pin on the Arduino
byte data = B00100101; // the byte you wish to send to the shift
// register
void setup(void) {
pinMode(dataPin,OUTPUT);
pinMode(clockPin,OUTPUT);
pinMode(latchPin,OUTPUT);
digitalWrite(clockPin,LOW);
}
void loop(void) {
digitalWrite(latchPin,LOW); // set low to prevent changes from
// updating the output register.
myShiftOut(data,clockPin,dataPin); // send
digitalWrite(latchPin,HIGH);
}
void myShiftOut(byte data, int clockPin, int dataPin) {
// The 74HC595 shift register stores incoming bits as the least
// significant bit in the storage register. The most significant
// bit gets pushed out. More than one 74HC595 can be daisy chained
// together by connecting the Q7' pin (pin 9) of the first shift
// register to the data pin (pin 14) of the second. When more
// than one 74HC595 are used in series they all share a clock
// (pin 11) and latch (pin 12) with the microcontroller.
// Basic opperation: On the rising edge of the clock, whatever is
// on the data pin gets stored in the storage register. Setting
// the latch pin high puts whatever is in the storage register in
// the output register.
boolean pinState
digitalWrite(clockPin, LOW); // set these low to start
digitalWrite(dataPin, LOW);
for (int ii=0; ii<7; ii++) {
if (data & (B10000000>>ii)) { // this is a bit mask using
// a bitwise and operator. In this form, the most significant
// bit is sent first.
pinState = HIGH;
}
else {
pinState = LOW;
}
digitalWrite(dataPin, pinState);
digitalWrite(clockPin, HIGH);
digitalWrite(clockPin, LOW);
}
}