This project shows how to use the Raspberry Pi to drive a 7 Segment Display with the help of a 74HC595 chip.
Parts used in this project:
- Breadboard
- Wiring cables (Male-Male, Female-Male)
- 7 Segement display (it actually has 8 segments because of the dot)
- 74HC595 Chip
- Raspberry Pi Revision 2
- some Python code
Here is a schematic made with fritzing of the project when it is ready. Here a link to download the 7-segment-display with 74HC595 and Raspberry Pi fritzing project.

the interresting thing here is the 74HC595 Chip. It takes some time to understand what it does. I think that the video from Kevin Darrah describes it fast and easy.
[youtube=http://www.youtube.com/watch?v=6fVbJbNPrEU]
Here is the Python code: rpi_7_segment_74hc595
#!/usr/bin/python
import RPi.GPIO as GPIO
import time
#Data Pins needed on the RPi
DATAIN=17 #DS
LATCH=27 #STCP
CLOCK=22 #SHCP
CLEAR=25 #MR Low
OE=11 #Output Enable Low
#inter character sleep
icsleep=0.06
#defining all the single LEDs
led1=0x80 #10000000
led2=0x40 #01000000
led3=0x20 #00100000
led4=0x10 #00010000
led5=0x08 #00001000
led6=0x04 #00000100
led7=0x02 #00000010
led8=0x01 #00000001
#definition of all writeable letters and numbers
letter={"0":0xFC,
"1":0x30,
"2":0xDA,
"3":0x7A,
"4":0x36,
"5":0x6E,
"6":0xEE,
"7":0x38,
"8":0xFE,
"9":0x3E,
"a":0xBE,
"b":0xE6,
"c":0xCC,
"d":0xF2,
"e":0xCE,
"f":0x8E,
"g":0x7E,
"h":0xB6,
"i":0x30,
"j":0xF0,
"l":0xC4,
"n":0xBC,
"o":0xFC,
"p":0x9E,
"s":0x6E,
"t":0x38,
"u":0xF4,
"x":0xB4,
"y":0x76,
"z":0xDE
}
#loading function sequence
load1=0x06 #00000110
load2=0x22 #00100010
load3=0x60 #01100000
load4=0xC0 #11000000
load5=0x82 #10000010
load6=0x12 #00010010
load7=0x18 #00011000
load8=0x0C #00001100
#up-down loading function sequence
ud1=led8
ud2=led2
ud3=led1+led3
ud4=led7
ud5=led6+led4
ud6=led5
#left-right loading function sequence
lr1=led1+led6
lr2=led2+led5+led7
lr3=led3+led4
lr4=led8
#rotational loading function sequence
rot1=led2+led5
rot2=led1+led6+led3+led4+led7
#putting all segments of the sequences in a list
letterrange=[]
hexrange=[]
for value in letter.values():
letterrange.append(value)
for value in letter.values():
if value != "g":
hexrange.append(value)
loadrange=[load1,load2,load3,load4,load5,load6,load7,load8]
udrange=[ud1,ud2,ud3,ud4,ud5,ud6]
ledrange=[led1,led2,led3,led4,led5,led6,led7,led8]
lrrange=[lr1,lr2,lr3,lr4]
rotrange=[rot1,rot2]
spinrange=[led1,led2,led3,led4,led5,led6]
#GPIO definition
def setup():
GPIO.setmode(GPIO.BCM)
GPIO.cleanup()
GPIO.setup(DATAIN,GPIO.OUT)
GPIO.setup(CLOCK,GPIO.OUT)
GPIO.setup(LATCH,GPIO.OUT)
GPIO.setup(CLEAR,GPIO.OUT)
GPIO.setup(OE,GPIO.OUT)
GPIO.output(LATCH,False) #Latch is used to output the saved data
GPIO.output(CLEAR,True) #Clear must always be true. False clears registers
GPIO.output(OE,False) #Output Enable speaks for itself. Must be False to display
GPIO.output(CLOCK,False) #Used to shift the value of DATAIN to the register
GPIO.output(DATAIN,False)#Databit to be shifted into the register
#Clean up GPIO, set display to no character
def cleanup():
#Set all leds to off
writenumber(0)
#writeout stored in character
writeout()
#writeout "nothing"
writeout()
time.sleep(0.7)
GPIO.cleanup()
#shifts in a bit (but does not write it yet)
def shift(input):
if input == 1:
input=True
else:
input=False
GPIO.output(DATAIN,input)
GPIO.output(CLOCK,GPIO.HIGH)
GPIO.output(CLOCK,GPIO.LOW)
GPIO.output(DATAIN,GPIO.LOW)
#writes the stored data from register out to pins
def writeout():
#Display LEDs
GPIO.output(LATCH,GPIO.HIGH)
#needed to read characters. otherwise the characters would be display to fast after each other
time.sleep(icsleep)
GPIO.output(LATCH,GPIO.LOW)
#writes a character to the register
def writenumber(number):
for x in range(0,8):
shift((number>>x)%2)
#writes a range of character to the display
def writerange(range):
for x in range:
writenumber(x)
writeout()
#additive and following substractive writeout of a range of characters
def writeaddrange(range):
character=0
for x in range:
character+=x
writenumber(character)
writeout()
for x in range:
character-=x
writenumber(character)
writeout()
#additive and following substractive writeout with reversed call of a range of characters
def writeaddremrange(range):
character=0
for x in range:
character+=x
writenumber(character)
writeout()
for x in range:
character-=x
writenumber(character)
writeout()
for x in reversed(range):
character+=x
writenumber(character)
writeout()
for x in reversed(range):
character-=x
writenumber(character)
writeout()
#additive and following reversed substractive writeout of characters
def writeaddbackrange(range):
character=0
for x in range:
character+=x
writenumber(character)
writeout()
for x in reversed(range):
character-=x
writenumber(character)
writeout()
#chained XORed and reversed XORed writeout of characters
def writexorrange(range):
#close the chain to have no interrupts while displaying
character=range[0]&range[-1]
for x in range:
character^=x
writenumber(character)
writeout()
for x in range:
character^=x
writenumber(character)
writeout()
for x in reversed(range):
character^=x
writenumber(character)
writeout()
for x in reversed(range):
character^=x
writenumber(character)
writeout()
print("####Setup####")
setup()
#Tryout of most ranges and displayfunctions
try:
print("####Write Stuff####")
while True:
writerange(letterrange)
writerange(hexrange)
writerange(loadrange)
writeaddremrange(udrange)
writexorrange(loadrange)
writexorrange(udrange)
writexorrange(ledrange)
writexorrange(lrrange)
writexorrange(rotrange)
writexorrange(spinrange)
writeaddrange(ledrange)
writeaddbackrange(ledrange)
#Wait for KeyboardInterrupt or SystemExit (called by kill or others)
except (KeyboardInterrupt, SystemExit):
print("Exit...")
finally:
cleanup()

Have fun driving your 7 Segment display with the Raspberry Pi.