import utime
utime.sleep(0.1) # Wait for USB to become ready
from machine import Pin, I2C, Timer
from pico_i2c_lcd import I2cLcd
sda = Pin(0)
scl = Pin(1)
i2c = I2C(0, sda=sda, scl=scl, freq=40000)
lcd = I2cLcd(i2c, 0x27, 2, 16)
r0_leds = [Pin(i, Pin.OUT) for i in range(2, 6)]
r1_leds = [Pin(i, Pin.OUT) for i in range(6, 10)]
r2_leds = [Pin(i, Pin.OUT) for i in range(10, 14)]
carry_led = Pin(14, Pin.OUT)
def add_4bit_registers(r0, r1):
result = r0 + r1
carry = 0
if result > 15:
result = result & 0x0F
carry = 1
return result, carry
def display_registers(r0, r1, result, carry):
for i in range(4):
bit = (r0 >> (3 - i)) & 1
r0_leds[i].value(bit)
for i in range(4):
bit = (r1 >> (3 - i)) & 1
r1_leds[i].value(bit)
for i in range(4):
bit = (result >> (3 - i)) & 1
r2_leds[i].value(bit)
carry_led.value(carry)
def display_results(timer):
lcd.clear()
for r0 in range(16):
for r1 in range(16):
result, carry = add_4bit_registers(r0, r1)
result_str = f"r0={r0:04b} r1={r1:04b} => r2={result:04b} C={carry}"
lcd.clear()
lcd.putstr(result_str)
display_registers(r0, r1, result, carry)
utime.sleep(0.5)
timer = Timer(freq=1, mode=Timer.PERIODIC, callback=display_results)