from machine import Pin, SPI
from max7219 import Matrix8x8
from time import sleep
class NumberGridDisplay:
def __init__(self, num_displays=4, cs_pin=5, clk_pin=2, din_pin=3):
"""
Initialize MAX7219 display (4 chained = 32x8 pixels)
"""
self.cs = Pin(cs_pin, Pin.OUT)
self.spi = SPI(0, baudrate=10_000_000, sck=Pin(clk_pin), mosi=Pin(din_pin))
self.display = Matrix8x8(self.spi, self.cs, num_displays, orientation=2)
self.display.fill(0)
self.display.show()
# Digit bitmaps 3x5
self.digits_3x5 = {
'0': [0b111, 0b101, 0b101, 0b101, 0b111],
'1': [0b010, 0b110, 0b010, 0b010, 0b111],
'2': [0b111, 0b001, 0b111, 0b100, 0b111],
'3': [0b111, 0b001, 0b111, 0b001, 0b111],
'4': [0b101, 0b101, 0b111, 0b001, 0b001],
'5': [0b111, 0b100, 0b111, 0b001, 0b111],
'6': [0b111, 0b100, 0b111, 0b101, 0b111],
'7': [0b111, 0b001, 0b010, 0b010, 0b010],
'8': [0b111, 0b101, 0b111, 0b101, 0b111],
'9': [0b111, 0b101, 0b111, 0b001, 0b111],
}
def draw_digit(self, x, y, n):
"""Draw a 3×5 pixel digit at (x, y)."""
bitmap = self.digits_3x5.get(str(n))
if not bitmap:
return
for row, bits in enumerate(bitmap):
for col in range(3):
bit = (bits >> (2 - col)) & 1
self.display.pixel(x + col, y + row, bit)
def draw_grid(self, number_str):
"""Draw digits in a 3×5 grid (up to 12 digits)."""
self.display.fill(0)
idx = 0
for row in range(4):
for col in range(3):
if idx >= len(number_str):
break
x = col * 4 # 3 wide + 1 space
y = row * 7 # 6 tall + 1 space
self.draw_digit(x, y, number_str[idx])
idx += 1
self.display.show()
# === MAIN PROGRAM ===
display = NumberGridDisplay()
while True:
num = input("Enter up to 12 digits: ")
num = ''.join(ch for ch in num if ch.isdigit()) # keep only digits
if not num:
print("Please enter digits only!")
continue
display.draw_grid(num)
print(f"Displayed grid for: {num}")
sleep(1)