from machine import Pin
import time
# Pin Definitions for 74HC595
SD = Pin(0, Pin.OUT) # Serial Data Input
ST_CP = Pin(1, Pin.OUT) # Storage Register Clock (Latch)
SH_CP = Pin(2, Pin.OUT) # Shift Register Clock
# Push buttons
push_button_HIGH = Pin(21, Pin.IN, Pin.PULL_DOWN)
push_button_LOW = Pin(20, Pin.IN, Pin.PULL_DOWN)
# Global Variables
magic_key = 0xF0 # Target pattern: 11110000
bits_entered = 0 # Shift register for storing bits
def shift_bit(bit):
global bits_entered
# Send bit to SD
SD.value(bit)
# Pulse SH_CP (Shift clock)
SH_CP.value(1)
time.sleep_us(10)
SH_CP.value(0)
# Pulse ST_CP (Store clock)
ST_CP.value(1)
time.sleep_us(10)
ST_CP.value(0)
# Shift bits_entered and append new bit
bits_entered = ((bits_entered << 1) | bit) & 0xFF
print(f"Current bits: {bits_entered:08b}")
if bits_entered == magic_key:
print("SUCCESS!")
Pin(5, Pin.OUT).value(1) # Green LED ON
Pin(6, Pin.OUT).value(0) # Red LED OFF
elif bits_entered & 0xF0 == 0xF0 or bits_entered & 0x0F == 0x00:
print("FAIL!")
Pin(5, Pin.OUT).value(0) # Green LED OFF
Pin(6, Pin.OUT).value(1) # Red LED ON
def push_button_HIGH_interrupt_handler(pin):
print("Push button HIGH interrupt detected...")
shift_bit(1)
def push_button_LOW_interrupt_handler(pin):
print("Push button LOW interrupt detected...")
shift_bit(0)
# Setup interrupt handlers
push_button_HIGH.irq(trigger=Pin.IRQ_RISING, handler=push_button_HIGH_interrupt_handler)
push_button_LOW.irq(trigger=Pin.IRQ_RISING, handler=push_button_LOW_interrupt_handler)