# 4-digit 7-segment COMMON CATHODE display driven by Raspberry Pi B+
# code modified, tweaked and tailored from code by bertwert 
# on RPi forum thread topic 91796
# and fiddled with a bit more by S&S
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
 
# GPIO ports for the 7seg pins
segments =  (11,4,23,8,7,10,18,25)
# 7seg_segment_pins (11,7,4,2,1,10,5,3) +  100R inline
 
for segment in segments:
    GPIO.setup(segment, GPIO.OUT)
    GPIO.output(segment, 0)
 
# GPIO ports for the digit 0-3 pins 
digits = (22,27,17,24)
# 7seg_digit_pins (12,9,8,6) digits 0-3 respectively
 
for digit in digits:
    GPIO.setup(digit, GPIO.OUT)
    GPIO.output(digit, 1)
 
num = {' ':(0,0,0,0,0,0,0),
    '0':(1,1,1,1,1,1,0),
    '1':(0,1,1,0,0,0,0),
    '2':(1,1,0,1,1,0,1),
    '3':(1,1,1,1,0,0,1),
    '4':(0,1,1,0,0,1,1),
    '5':(1,0,1,1,0,1,1),
    '6':(1,0,1,1,1,1,1),
    '7':(1,1,1,0,0,0,0),
    '8':(1,1,1,1,1,1,1),
    '9':(1,1,1,1,0,1,1)}
 
try:
    while True:
        n = time.ctime()[11:13]+time.ctime()[14:16]
	s = n.rjust(4)
        for digit in range(4):
            if (int(time.ctime()[18:19])%2 == 0) and (digit == 1):
                GPIO.output(25, 1)
            else:
                GPIO.output(25, 0)
            for loop in range(0,7):
                GPIO.output(segments[loop], num[s[digit]][loop])
            GPIO.output(digits[digit], 0)
            time.sleep(0.005)
# The best sleep time for me to minimise flicker is 5 milliseconds
            GPIO.output(digits[digit], 1)
finally:
    GPIO.cleanup()