from machine import Pin, SPI
from time import sleep_ms
# 初始化 SPI 对象及其片选引脚
spi1 = SPI(0, baudrate=1000000, polarity=1, phase=0, sck=Pin(2), mosi=Pin(3), miso=None)
cs1 = Pin(5, Pin.OUT)
cs1.value(1)
spi2 = SPI(1, baudrate=1000000, polarity=1, phase=0, sck=Pin(10), mosi=Pin(11), miso=None)
cs2 = Pin(13, Pin.OUT)
cs2.value(1)
# MAX7219 寄存器设定
NOOP = bytearray([0x00, 0x00])
DIGIT0 = bytearray([0x01, 0x00])
DIGIT1 = bytearray([0x02, 0x00])
DIGMODE = bytearray([0x09, 0x00])
SLIMIT = bytearray([0x0B, 0x07])
SDOWN = bytearray([0x0C, 0x01])
DTEST = bytearray([0x0F, 0x00])
# 向 MAX7219 寄存器写入数据
def write_MAX7219(data):
cs1.value(0)
spi1.write(data)
cs1.value(1)
sleep_ms(10)
cs2.value(0)
spi2.write(data)
cs2.value(1)
sleep_ms(10)
# 初始化 MAX7219
def init_MAX7219():
write_MAX7219(NOOP)
write_MAX7219(DIGIT0)
write_MAX7219(DIGIT1)
write_MAX7219(DIGMODE)
write_MAX7219(SLIMIT)
write_MAX7219(SDOWN)
write_MAX7219(DTEST)
# 显示的二进制码
dataA = [
[0x01, 0x00], [0x01, 0x08], [0x7F, 0xFC], [0x01, 0x00], [0x05, 0x40],
[0x09, 0x30], [0x31, 0x0E], [0xC1, 0x04], [0x0F, 0xE0], [0x00, 0x40],
[0x01, 0x88], [0x7F, 0xFC], [0x01, 0x00], [0x01, 0x00], [0x05, 0x00],
[0x02, 0x00],
[0x01, 0x00], [0x01, 0x00], [0x01, 0x04], [0xFF, 0xFE], [0x03, 0x80],
[0x05, 0x40], [0x09, 0x20], [0x11, 0x10], [0x21, 0x0E], [0xC1, 0x04],
[0x01, 0x00], [0x00, 0x00], [0x24, 0x90], [0x22, 0x48], [0x22, 0x44],
[0x40, 0x04],
[0x01, 0x08], [0x7F, 0xFC], [0x00, 0x00], [0x0F, 0xE0], [0x08, 0x20],
[0x7F, 0xFE], [0x40, 0x02], [0x9F, 0xF4], [0x06, 0x10], [0x0B, 0x20],
[0x35, 0x40], [0x09, 0x80], [0x33, 0x60], [0x05, 0x1C], [0x39, 0x08],
[0x03, 0x00],
[0x00, 0x80], [0x00, 0x80], [0x01, 0xC0], [0x01, 0xC0], [0x03, 0xE0],
[0x7F, 0xFF], [0x3F, 0xFE], [0x1F, 0xFC], [0x0F, 0xF8], [0x07, 0xF0],
[0x0F, 0xF8], [0x0F, 0x78], [0x1E, 0x3C], [0x18, 0x0C], [0x20, 0x02],
[0x00, 0x00,]
]
#8位二进制数翻转
def reversal(n):
rev = 0x00
rev = rev | (n & 0x01)
for i in range(0,7,1):
n = n >> 1
rev = rev << 1
rev = rev | (n & 0x01)
return rev
#单个汉字数据缓冲区
def moveL():
for i in range(16):
dataB[i][0] = ((dataB[i][0]<<1) | (dataB[i][1]&0x80)>>7)&0xff
dataB[i][1] = ((dataB[i][1]<<1) | (dataB[i+16][0]&0x80)>>7)&0xff
dataB[i+16][0] = ((dataB[i+16][0]<<1) | (dataB[i+16][1]&0x80)>>7)&0xff
dataB[i+16][1] = ((dataB[i+16][1]<<1) | (dataB[i+32][0]&0x80)>>7)&0xff
dataB[i+32][0] = ((dataB[i+32][0]<<1) | (dataB[i+32][1]&0x80)>>7)&0xff
dataB[i+32][1] = ((dataB[i+32][1]<<1) | (dataB[i+48][0]&0x80)>>7)&0xff
dataB[i+48][0] = ((dataB[i+48][0]<<1) | (dataB[i+48][1]&0x80)>>7)&0xff
dataB[i+48][1] = ((dataB[i+48][1]<<1) | (dataB[i][0]&0x80)>>7)&0xff
#左向或右向显示一个汉字。i :0 ~ 15;j : 0 ~ 1
def display( rl ):
for i in range(0,8,1):
cs1.value(0)
if rl == 'R' : x = dataA[i][1]
if rl == 'L' : x = reversal(dataA[i][0])
data = bytearray([i+1,x])
spi1.write(data)
if rl == 'R' : y = dataA[i][0]
if rl == 'L' : y = reversal(dataA[i][1])
data = bytearray([i+1,y])
spi1.write(data)
cs1.value(1)
for i in range(8,16,1):
cs2.value(0)
if rl == 'R' : x = dataA[i][1]
if rl == 'L' : x = reversal(dataA[i][0])
data = bytearray([i-8+1,x])
spi2.write(data)
if rl == 'R' : y = dataA[i][0]
if rl == 'L' : y = reversal(dataA[i][1])
data = bytearray([i-8+1,y])
spi2.write(data)
cs2.value(1)
sleep_ms(50)
#循环显示左向“李,杰,豪”三个字
def roll_all():
for k in range(0,3,1):
for i in range(0,8,1):
cs1.value(0)
x = reversal(dataB[i+16*k][0])
data = bytearray([i+1, x])
spi1.write(data)
y = reversal(dataB[i+16*k][1])
data = bytearray([i+1,y])
spi1.write(data)
cs1.value(1)
for i in range(8, 16, 1):
cs2.value(0)
x = reversal(dataB[i+16*k][0])
data = bytearray([i-8+1,x])
spi2.write(data)
y = reversal(dataB[i+16*k][1])
data = bytearray([i-8+1,y])
spi2.write(data)
cs2.value(1)
sleep_ms(1000)
#向上滚动显示“李杰豪”
def roll_up():
for k in range(0, 48, 1):
for i in range(0, 8, 1):
cs1.value(0)
x = reversal(dataA[i+k][0])
data = bytearray([i+1, x])
spi1.write(data)
y = reversal(dataA[i+k][1])
data = bytearray([i+1,y])
spi1.write(data)
cs1.value(1)
for i in range(8, 16, 1):
cs2.value(0)
x = reversal(dataA[i+k][0])
data = bytearray([i-8+1,x])
spi2.write(data)
y = reversal(dataA[i+k][1])
data = bytearray([i-8+1,y])
spi2.write(data)
cs2.value(1)
sleep_ms(200)
#向右滚动显示“李杰豪”
def roll_rl(rl):
for i in range(0, 8, 1):
cs1.value(0)
if rl == 'R': x = dataB[i][1]
if rl == 'L': x =reversal(dataB[i][0])
data = bytearray([i+1,x])
spi1.write(data)
if rl == 'R': y = dataB[i][0]
if rl == 'L': y = reversal(dataB[i][1])
data = bytearray([i+1, y])
spi1.write(data)
cs1.value(1)
for i in range(8, 16, 1):
cs2.value(0)
if rl == 'R' : x = dataB[i][1]
if rl == 'L' : x = reversal(dataB[i][0])
data = bytearray([i-8+1,x])
spi2.write(data)
if rl == 'R' : y = dataB[i][0]
if rl == 'L' : y = reversal(dataB[i][1])
data = bytearray([i-8+1,y])
spi2.write(data)
cs2.value(1)
sleep_ms(208)
moveL()
#主程序
if __name__ == "__main__":
init_MAX7219()
roll_up()
dataB = list(dataA)
for count in range(48): roll_rl('L')
dataB = list(dataA)
for count in range(60): roll_rl('R')
dataB = list(dataA)
for count in range(60): roll_all()