Micropython学习交流群 学习QQ群:786510434 提供多种固件下载和学习交流。

Micropython-扇贝物联 QQ群:31324057 扇贝物联是一个让你与智能设备沟通更方便的物联网云平台

Micropython学习交流群 学习QQ群:468985481 学习交流ESP8266、ESP32、ESP8285、wifi模块开发交流、物联网。

Micropython老哥俩的IT农场分享QQ群:929132891 为喜欢科创制作的小白们分享一些自制的计算机软硬件免费公益课程,由两位多年从事IT研发的中年大叔发起。

Micropython ESP频道

micropython esp32-s3+MAX7219+八位数码管


esp32-s3+MAX7219+八位数码管+MicroPython驱动脚本

231839ie3zulb334ala2l4.png

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.0084221363067627 seconds