소스 뷰어
# shift_register.py

import RPi.GPIO as GPIO
import time

# 핀 번호 설정
DS = 10       # 데이터 입력 핀
SHCP = 11     # 쉬프트 레지스터 클럭 핀
STCP = 8      # 저장 레지스터 클럭 (래치) 핀

# GPIO 설정
GPIO.setwarnings( 0 )            # 경고 메시지 비활성화
GPIO.setmode(GPIO.BCM)           # BCM 핀 번호 사용
GPIO.setup(DS, GPIO.OUT)         # DS 핀 출력으로 설정
GPIO.setup(SHCP, GPIO.OUT)       # SHCP 핀 출력으로 설정
GPIO.setup(STCP, GPIO.OUT)       # STCP 핀 출력으로 설정

# 쉬프트 레지스터로 데이터 전송 함수
def shift_out(data):
    # 데이터의 각 비트를 쉬프트 레지스터에 전송
    for bit in range(8):  # 8비트 데이터 처리
        # 현재 비트를 DS 핀으로 출력 (MSB부터 LSB 순으로 전송)
        GPIO.output(DS, data & (1 << (7 - bit)))
        # SHCP 클럭 핀을 HIGH -> LOW로 펄스 전송
        GPIO.output(SHCP, GPIO.HIGH)
        GPIO.output(SHCP, GPIO.LOW)
    pass
pass

# 래치 함수 (출력 갱신)
def latch():
    # STCP 핀을 HIGH -> LOW로 펄스 전송하여 출력 갱신
    GPIO.output(STCP, GPIO.HIGH)
    GPIO.output(STCP, GPIO.LOW)
pass

# 메인 루프
try:
    count = 1  # 카운터 초기값 설정
    duration = 0.5 # 대기 시간
    while 1:
        # 0부터 7까지 증가한 뒤 다시 감소
        for i in ( list(range(8)) + list(range(6, 0, -1)) ):
            data = 1 << i    # 비트 쉬프트 연산
            print(f"[{count:4d}] {data:>4d} = {data:>08b} (b)")
            shift_out(data)  # 데이터 전송
            latch()          # 출력 갱신
            time.sleep( duration )  # 대기
            count += 1       # 카운트 증가
        pass

        # 0부터 255까지 모든 8비트 데이터 반복 출력
        for data in range(256):
            # 현재 카운트와 데이터 출력 (10진수와 2진수로 표시)
            print(f"[{count:4d}] {data:>4d} = {data:>08b} (b)")
            shift_out(data)  # 데이터 전송
            latch()          # 출력 갱신
            time.sleep( duration )  # 대기
            count += 1       # 카운트 증가
        pass
    pass
except KeyboardInterrupt:
    # Ctrl+C로 종료 시 GPIO 핀 초기화
    GPIO.cleanup()
pass