# max7219.py - MAX7219驱动程序
from machine import Pin, SPI
import time
class Matrix8x8:
def __init__(self, spi_bus=0, cs_pin=5, sck_pin=2, mosi_pin=3):
"""初始化MAX7219
Args:
spi_bus: SPI总线号
cs_pin: 片选引脚
sck_pin: 时钟引脚
mosi_pin: MOSI数据引脚
"""
# 寄存器地址定义
self.REG_NOOP = 0x0
self.REG_DIGIT0 = 0x1
self.REG_DIGIT1 = 0x2
self.REG_DIGIT2 = 0x3
self.REG_DIGIT3 = 0x4
self.REG_DIGIT4 = 0x5
self.REG_DIGIT5 = 0x6
self.REG_DIGIT6 = 0x7
self.REG_DIGIT7 = 0x8
self.REG_DECODEMODE = 0x9
self.REG_INTENSITY = 0xA
self.REG_SCANLIMIT = 0xB
self.REG_SHUTDOWN = 0xC
self.REG_DISPLAYTEST = 0xF
# 初始化SPI
self.spi = SPI(spi_bus,
baudrate=10000000,
polarity=0,
phase=0,
sck=Pin(sck_pin),
mosi=Pin(mosi_pin))
self.cs = Pin(cs_pin, Pin.OUT)
self.cs.value(1) # 禁用芯片选择
# 初始化显示
self._write(self.REG_SHUTDOWN, 0x1) # 正常工作模式
self._write(self.REG_DISPLAYTEST, 0x0) # 正常显示模式
self._write(self.REG_DECODEMODE, 0x0) # 无解码模式
self._write(self.REG_SCANLIMIT, 0x7) # 显示所有数位
self._write(self.REG_INTENSITY, 0x8) # 中等亮度
self.clear() # 清除显示
def _write(self, register, data):
"""向MAX7219写入数据
Args:
register: 寄存器地址
要写入的数据
"""
self.cs.value(0)
self.spi.write(bytes([register, data]))
self.cs.value(1)
def clear(self):
"""清除显示"""
for i in range(8):
self._write(i + 1, 0)
def brightness(self, intensity):
"""设置亮度
Args:
intensity: 亮度值(0-15)
"""
if 0 <= intensity <= 15:
self._write(self.REG_INTENSITY, intensity)
def pixel(self, x, y, state):
"""设置单个像素点
Args:
x: x坐标(0-7)
y: y坐标(0-7)
state: 状态(True/False)
"""
if 0 <= x <= 7 and 0 <= y <= 7:
reg = y + 1
val = self._read_digit(reg)
if state:
val |= (1 << (7 - x))
else:
val &= ~(1 << (7 - x))
self._write(reg, val)
def _read_digit(self, digit):
"""读取数位的当前值(通过缓存)"""
return self._digit_values[digit - 1] if hasattr(self, '_digit_values') else 0
def fill(self, pattern):
"""使用图案填充显示
Args:
pattern: 8个字节的列表,每个字节代表一行
"""
if len(pattern) == 8:
for i in range(8):
self._write(i + 1, pattern[i])
# 示例代码
def demo():
# 创建MAX7219对象
display = Matrix8x8()
# 显示笑脸图案
smile = [
0b00111100,
0b01000010,
0b10100101,
0b10000001,
0b10100101,
0b10011001,
0b01000010,
0b00111100
]
# 显示图案
display.fill(smile)
time.sleep(2)
# 显示动画效果
for _ in range(3):
for i in range(16):
display.brightness(i)
time.sleep(0.1)
for i in range(15, -1, -1):
display.brightness(i)
time.sleep(0.1)
# 清除显示
display.clear()
if __name__ == '__main__':
demo()