LED / Matrix - 74HC595
74HC595 + Raspberry Pi not only control LED but also Matrix with only 3 Pins. More Project Coming Soon!
Hardware
Please Click the above Pin Connect Image.
Examples
This example is to control one or more 74HC595 for 8 LED , 1 Digit 7 Segment, 4 Digits 7 Segment !
-
#
#This program is modify 8led to 16led , raspberry pi control two 74hc595
# Good!
#
#
#
#!/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
# for 4 Digits : 7 Segment
# Dig=[7, 8, 9, 10]
#How many 74HC595
no74hc595=1
#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
# SANKI - for 16 LED Display
#defining all the single LEDs
#
#
leda1=0x80FE #11111110 // FE BLANK
leda2=0x40FD #11111101 // FE -
leda3=0x20FB #11111011 // FC
leda4=0x10F7 #11110111 // F8
leda5=0x08EF #11101111 // EF
leda6=0x04DF #11011111 // CF
leda7=0x02BF #10111111 //
leda8=0x017F #01111111 //
# Matrix
#
# -7F(8)-
# FB(3) | | BF(7)
# -FD(2)-
# F7(4) | | DF(6)
# -EF(5)- . FE(1)
#
#
m0=0xFF #11111111 // BLANK
m1=0xFE #11111110 //
m2=0xFD #11111101 //
m3=0xFB #11111011 //
m4=0xF7 #11110111 //
m5=0xEF #11101111 //
m6=0xDF #11011111 //
m7=0xBF #10111111 //
m8=0x7F #01111111 //
# Number Combo
noblank=m0
nodot=m1
no0=m3&m4&m5&m6&m7&m8
no1=m7&m6
no2=m8&m7&m2&m4&m5
no3=m8&m7&m2&m6&m5
no4=m3&m2&m7&m6
no5=m8&m3&m2&m6&m5
no6=m3&m4&m5&m6&m2&m8
no7=m6&m7&m8
no8=m2&m3&m4&m5&m6&m7&m8
no9=m2&m3&m5&m6&m7&m8
#number range
numberrange=[noblank, nodot, no0, no1, no2, no3, no4, no5, no6, no7, no8, no9]
#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]
ledarange=[leda1,leda2,leda3,leda4,leda5,leda6,leda7,leda8]
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, (no74hc595 * 8)):
shift((number>>x)%2)
#writes a range of character to the display
def writerange(range):
for x in range:
writenumber(x)
writeout()
#writes a range of character to the display
def writetestrange(range):
for x in range:
time.sleep(1)
writenumber(x)
writeout()
#writes a range to 4 Digit 7 Segment
def write4x7range(range, dig):
GPIO.output(Dig[dig], GPIO.HIGH)
for x in range:
time.sleep(1)
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:
# print '8 LED TEST'
# writerange(letterrange)
# print 'lettertange'
# time.sleep(1)
# writerange(hexrange)
# print 'hexrange'
# time.sleep(1)
# writerange(loadrange)
# print 'loadrange'
# time.sleep(1)
# writeaddremrange(udrange)
# print 'udrange'
# time.sleep(1)
# writexorrange(loadrange)
# print 'loadtange'
# time.sleep(1)
# print 'udrange'
# writexorrange(udrange)
# print 'udrange'
# time.sleep(1)
# writexorrange(ledrange)
# print 'ledrange'
# time.sleep(1)
# writexorrange(lrrange)
# print 'lrrange'
# time.sleep(1)
# writexorrange(rotrange)
# print 'rotrange'
# time.sleep(1)
# writexorrange(spinrange)
# print 'spinrange'
# time.sleep(1)
# writeaddrange(ledrange)
print '1 Digit : 7 Segment - Number 0-9'
writetestrange(numberrange)
time.sleep(1)
# print '4 Digit : 7 Segment'
# for x in range(0,4)
# write4x7range(numberrange, x)
# time.sleep(1);
#
#
#
#Wait for KeyboardInterrupt or SystemExit (called by kill or others)
except (KeyboardInterrupt, SystemExit):
print("Exit...")
finally:
cleanup()
|