本站改版新增arduino频道
esp32-s3+MAX7219+八位数码管+MicroPython驱动脚本

from machine import Pin, SPI
class MAX7219:
_NOOP = 0
_DIGIT0 = 1
_DIGIT1 = 2
_DIGIT2 = 3
_DIGIT3 = 4
_DIGIT4 = 5
_DIGIT5 = 6
_DIGIT6 = 7
_DIGIT7 = 8
_DECODEMODE = 9
_INTENSITY = 10
_SCANLIMIT = 11
_SHUTDOWN = 12
_DISPLAYTEST = 15
_DIGITS = {
' ': 0x00,
'0': 0x7e,
'1': 0x30,
'2': 0x6d,
'3': 0x79,
'4': 0x33,
'5': 0x5b,
'6': 0x5f,
'7': 0x70,
'8': 0x7f,
'9': 0x7b,
}
# 小数点的掩码(右下角)
_DECIMAL_POINT = 0x80
NUM_DIGITS = 8
def __init__(self, spibus:int,baudrate:int,clk:int,din:int, cs:int):
"""
这是驱动MAX7219芯片控制八位数码管的类
该类可以通过SPI总线控制MAX7219芯片,从而控制数码管
该类提供了显示数字的方法
可以在指定引脚,声明该类,然后调用show_number方法显示数字
该脚本编写语言是MicroPython
spibus: spi总线 建议为2
baudrate: 波特率 建议为115200
clk: 时钟引脚 max7219的CLK引脚 建议为18
din: 数据引脚 max7219的DIN引脚 建议为16
cs: 片选引脚 max7219的CS引脚 建议为5
"""
self.spi = SPI(spibus, baudrate=baudrate, polarity=0, phase=0, sck=Pin(clk), mosi=Pin(din), miso=None)
self.cs = Pin(cs, Pin.OUT, value=0)
self.buffer = bytearray(8)
self.spi.init()
self.init()
def _register(self, command, data):
# 写入显示寄存器
self.cs.value(0)
self.spi.write(bytearray([command, data]))
self.cs.value(1)
def init(self):
# 初始化显示
for command, data in (
(self._SHUTDOWN, 0),
(self._DISPLAYTEST, 0),
(self._SCANLIMIT, 7),
(self._DECODEMODE, 0),
(self._SHUTDOWN, 1),
):
self._register(command, data)
def write_number(self, value, zeroPad=False, leftJustify=False, decimalPos=None):
# 显示数字,格式化并查找字符,然后传递到缓冲区
if len(str(value)) > self.NUM_DIGITS:
raise OverflowError('{0} 太大,无法显示'.format(value))
size = self.NUM_DIGITS
formatStr = '%'
if zeroPad:
formatStr += '0'
if leftJustify:
size *= -1
formatStr = '{fmt}{size}i'.format(fmt=formatStr, size=size)
position = self._DIGIT7
strValue = formatStr % value
# 处理小数点
decimalFlag = [False] * len(strValue)
if decimalPos is not None and decimalPos < len(strValue):
decimalFlag[decimalPos] = True
# 查找每个数字的字符并处理小数点
for i, char in enumerate(strValue):
digit = self.letter(char)
if decimalFlag[i]:
digit |= self._DECIMAL_POINT # 设置小数点位
self.buffer[position - 1] = digit
position -= 1
def letter(self, char):
# 查找字符编码并返回
value = self._DIGITS.get(str(char), 0x00) # 如果字符无效,默认为0
return value
def show(self):
# 显示缓冲区内容
for y in range(8):
self._register(self._DIGIT0 + y, self.buffer[y])
def show_number(self,number,decimal_places:int=-1):
"""
展示数字
decimal_places: 展示几位小数,-1表示不显示小数点,传入int类型设置该位无效
"""
if type(number) == float:
if decimal_places == -1 or decimal_places == 0:
number = int(number)
else:
now=str(int(number))
if len(now)>8:
number=int(now[:8])
decimal_places=0
elif len(now)+decimal_places>7:
decimal_places=8-len(now)
number = int(number * 10**decimal_places)
else:
number = int(number * 10**decimal_places)
decimalPos=7-decimal_places
if decimalPos==7:
decimalPos=None
self.write_number(number,decimalPos=decimalPos)
self.show()
def set_brightness(self, brightness):
"""
设置亮度,范围为 0 到 15
"""
if 0 <= brightness <= 15:
self._register(self._INTENSITY, brightness)
else:
raise ValueError("亮度值必须在 0 到 15 之间")
if __name__ == "__main__":
import time
CLK = 17
DIN = 16
CS = 15
smg = MAX7219(2,115200,CLK,DIN,CS)
smg.set_brightness(15)
for i in range(9999999,10000020):
smg.show_number(i)
time.sleep(1)
for i in range(1234567.21,1234577.21,1):
smg.show_number(i,2)
time.sleep(1)
for i in range(12345678.21,12345688.21,1):
smg.show_number(i,2)
time.sleep(1)
Copyright © 2014 ESP56.com All Rights Reserved
晋ICP备14006235号-22 晋公网安备14108102001165号
执行时间: 0.0093350410461426 seconds