/* http://www.bristolwatch.com/arduino/arduino3.htm Connecting Arduino to a 74C164 Shift Register Connected to 7-segment Display Lewis Loflin lewis@bvu.net Uses a 74C164 shift register to count from 0 t0 F (HEX) on a 7 segment common anode LED display. To use a common cathode display change line digitalWrite(data_bit, !k); -> digitalWrite(data_bit, k); connect common to GND This program assumes a seven segment display with a bit pattern: Q7 segment a Q6 segment b Q5 segment c Q4 segment d Q3 segment e Q2 segment f Q1 segment g Q0 segment dp */ #define data_bit 13 #define clk 12 // pin connected to display segment 'a' #define mc 11 // pin connected to display dp pin // segment patterns 0 - 9, A - F Hex + dp byte Digit[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x67, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, 0x80}; void setup() { pinMode(mc, OUTPUT); pinMode(clk, OUTPUT); pinMode(data_bit, OUTPUT); digitalWrite(mc, 1); digitalWrite(clk, 0); digitalWrite(data_bit, 0); } // end setup void loop() { int i, j; for (i=0; i<= 15; i++) { digitOut(Digit[i]); delay(500); } } void digitOut(byte j) { byte k; for(int i=0; i < 8; i++) { k = j & 0x01; digitalWrite(data_bit, !k); // use just k instead of !k for common cathode displays. pulsout(clk,1); j = j >> 1; } } // toggle the output state on a pin void toggle(int pinNum) { byte pinState = digitalRead(pinNum); pinState = !pinState; digitalWrite(pinNum, pinState); } // inverts state of pin, delays, then reverts state back void pulsout(byte x, int y) { byte z = digitalRead(x); z = !z; digitalWrite(x, z); delayMicroseconds(10* y); z = !z; // return to original state digitalWrite(x, z); return; } // end pulsout()