from machine import Pin, SPI
from time import sleep
# Initialiseer SPI
spi = SPI(1, baudrate=1000000, polarity=0, phase=0, sck=Pin(18), mosi=Pin(23))
ss = Pin(5, Pin.OUT)
ss.value(1)
NUM_DISPLAYS = 4 # 4 x 8x8 displays
# MAX7219 registers
DECODE_MODE = 0x09
INTENSITY = 0x0A
SCAN_LIMIT = 0x0B
SHUTDOWN = 0x0C
DISPLAY_TEST = 0x0F
# 8x8 smiley bitmap (1 byte per row)
SMILEY = [
0b00111100,
0b01000010,
0b10100101,
0b10000001,
0b10100101,
0b10011001,
0b01000010,
0b00111100
]
def send_frame(rows):
"""Stuurt 8 rijen tegelijk naar alle 4 displays"""
for row in range(8):
ss.value(0)
# Let op: volgorde is van meest rechtse naar meest linkse display (omgekeerd!)
for display in reversed(range(NUM_DISPLAYS)):
spi.write(bytearray([row + 1, rows[display][row]]))
ss.value(1)
def setup_max7221():
for reg, val in [
(SHUTDOWN, 0x01),
(DISPLAY_TEST, 0x00),
(DECODE_MODE, 0x00),
(SCAN_LIMIT, 0x07),
(INTENSITY, 0x08)
]:
ss.value(0)
for _ in range(NUM_DISPLAYS):
spi.write(bytearray([reg, val]))
ss.value(1)
def clear_display():
empty = [[0] * 8 for _ in range(NUM_DISPLAYS)]
send_frame(empty)
def smiley_to_columns():
"""Converteer smiley van rijen naar kolommen"""
cols = [0] * 8
for col in range(8):
byte = 0
for row in range(8):
if (SMILEY[row] >> (7 - col)) & 1:
byte |= (1 << row)
cols[col] = byte
return cols
def draw_smiley_at(offset):
"""
Plaats smiley op offset (0–31). Negatieve waarden tonen smiley nog buiten beeld links.
"""
full_cols = [0] * 32
smiley_cols = smiley_to_columns()
for i in range(8):
pos = offset + i
if 0 <= pos < 32:
full_cols[pos] = smiley_cols[i]
# Opsplitsen in 4 displays van telkens 8 kolommen
displays = []
for d in range(NUM_DISPLAYS):
block = full_cols[d*8:(d+1)*8]
# converteer kolommen naar rijen
rows = [0] * 8
for col in range(8):
for row in range(8):
if (block[col] >> row) & 1:
rows[row] |= (1 << (7 - col))
displays.append(rows)
send_frame(displays)
# Init en loop
setup_max7221()
clear_display()
while True:
for offset in range(-8, 32): # van buiten beeld links tot buiten beeld rechts
draw_smiley_at(offset)
sleep(0.1)