from machine import Pin
import time
# Define Pins
load_pin = Pin(11, Pin.OUT) # PL pin gp1 to gp11
clock_enable_pin = Pin(9, Pin.OUT) # CE pin gp4 to gp9
data_in_pin = Pin(10, Pin.IN) # Q7 pin gp2 to gp10
clock_in_pin = Pin(8, Pin.OUT) # CP pin gp3 to gp8
# Pin configuration for SIPO shift register
SERIAL_DATA_PIN = Pin(0, Pin.OUT)
SHIFT_CLOCK_PIN = Pin(1, Pin.OUT)
LATCH_CLOCK_PIN = Pin(2, Pin.OUT)
interrupt_pin = Pin(7, machine.Pin.IN, machine.Pin.PULL_UP)
# Global variable to store the last interrupt time
last_interrupt_time = 0
debounce_time = 100 # debounce time in milliseconds
# Function to read data from shift registers
def read_shift_registers():
load_pin.value(0)
time.sleep_us(5)
load_pin.value(1)
time.sleep_us(5)
# Read data from 74HC165
clock_in_pin.value(1)
clock_enable_pin.value(0)
incoming = 0
for _ in range(32):
incoming <<= 1
incoming |= data_in_pin.value()
clock_in_pin.value(0)
time.sleep_us(1)
clock_in_pin.value(1)
time.sleep_us(1)
clock_enable_pin.value(1)
return incoming
# Interrupt handler function
def interrupt_handler(pin):
global last_interrupt_time
current_time = time.ticks_ms()
if time.ticks_diff(current_time, last_interrupt_time) > debounce_time:
last_interrupt_time = current_time
print("Interrupt occurred!, counter = ")
data = read_shift_registers()
if data != 0:
switch_pos = len(bin(data))-2
switch = "switch"+str(switch_pos)
shift_data(data)
print(switch)
print(data)
# Configure interrupt handler
interrupt_pin.irq(trigger=machine.Pin.IRQ_RISING, handler=interrupt_handler)
def shift_data(data):
"""Shift data into the shift register."""
LATCH_CLOCK_PIN.off() # Make sure latch clock is low
print(data)
for i in range(8):
bit = (data >> ((8 - 1) - i)) & 1
print(bit)
SERIAL_DATA_PIN.value(bit)
SHIFT_CLOCK_PIN.on()
SHIFT_CLOCK_PIN.off()
LATCH_CLOCK_PIN.on() # Latch the data to output pins
LATCH_CLOCK_PIN.off() # Make sure latch clock is low again
return "OK"
# Main loop
while True:
pass
# load_pin.value(0)
# time.sleep_us(5)
# load_pin.value(1)
# time.sleep_us(5)
# # Read data from 74HC165
# clock_in_pin.value(1)
# clock_enable_pin.value(0)
# incoming = 0
# for _ in range(32):
# incoming <<= 1
# incoming |= data_in_pin.value()
# clock_in_pin.value(0)
# time.sleep_us(1)
# clock_in_pin.value(1)
# time.sleep_us(1)
# clock_enable_pin.value(1)
# # Print pin states
# print("Pin States:")
# print("{0:08b}".format(incoming))
# time.sleep_ms(200)