シフトレジスターには74HC595を使う。
ここでは、別々のGPIOから7セグメントLEDを点灯させたときと逆に、a→dpのビット順にしていて、コードではLSBから順に読みだしてシフトレジスターに送ることにした。
表示 | a b c d e f g dp | Hex |
0 | 11111100 | 0xfc |
1 | 01100000 | 0x60 |
2 | 11011010 | 0xda |
3 | 11110010 | 0xf2 |
4 | 01100110 | 0x66 |
5 | 10110110 | 0xb6 |
6 | 10111110 | 0xbe |
7 | 11100000 | 0xe0 |
8 | 11111110 | 0xfe |
9 | 11110110 | 0xf6 |
A | 11101110 | 0xee |
B | 00111110 | 0x3e |
C | 10011100 | 0x9c |
D | 01111010 | 0x7a |
E | 10011110 | 0x9e |
F | 10001110 | 0x8e |
以下はRaspberry Piで7セグメントLEDを点灯させるコード。リストのpatternsに0~Fまでのセグメント点灯パターンを入れ、対応する桁数分シフトしてシフトレジスターに送っている。そして、各パターンを0.5秒ずつ表示させてカウントアップさせている。
キットのテキストのコードでは、time.sleep()を入れていたり入れていなかったりするが、特にこれがなくても問題なく動作する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
import RPi.GPIO as GPIO import time # Constants of GPIO port numbers in BCM SER = 17 RCLK = 27 SRCLK = 10 SRCLR = 9 # 7 segments LED light patterns # Patern is (a b c ... h dp) to send SER from LSB to MSB patterns = [0xfc, 0x60, 0xda, 0xf2, 0x66, 0xb6, 0xbe, 0xe0, 0xfe, 0xf6, 0xee, 0x3e, 0x9c, 0x7a, 0x9e, 0x8e] # Ending process def destroy(): # Clear all FlipFlops and registers GPIO.output(SRCLR, GPIO.LOW) time.sleep(0.001) GPIO.output(SRCLR, GPIO.HIGH) # Release resource GPIO.cleanup() # Initializing block GPIO.setmode(GPIO.BCM) GPIO.setup(SER, GPIO.OUT, initial=GPIO.LOW) GPIO.setup(SRCLK, GPIO.OUT, initial=GPIO.LOW) GPIO.setup(SRCLR, GPIO.OUT, initial=GPIO.HIGH) GPIO.setup(RCLK, GPIO.OUT, initial=GPIO.LOW) # Clear all segments GPIO.output(SRCLR, GPIO.LOW) time.sleep(0.01) GPIO.output(SRCLR, GPIO.HIGH) try: while True: # Do for each number display for pattern in patterns: for n in range(8): # Input bits from LSB to MSB # True == 1 == GPIO.HIGH and False == 0 == GPIO.LOW GPIO.output(SER, (pattern >> n) & 1) # Send bit to shift register GPIO.output(SRCLK, GPIO.HIGH) time.sleep(0.01) GPIO.output(SRCLK, GPIO.LOW) # Get parallel data GPIO.output(RCLK, GPIO.HIGH) time.sleep(0.01) GPIO.output(RCLK, GPIO.LOW) time.sleep(0.5) except KeyboardInterrupt: destroy() |