Micropython RP2040 使用 八位数码管模块 MAX7219控制八位数码管

简介:

八位数码管模块是一种用于显示数字的模块,由多个LED段组成,可以显示0-9的数字和一些特定的字符。这种模块通常由8个LED段组成,每个段可以独立控制以显示不同的数字或字符。

八位数码管模块通过微控制器或单片机等控制器进行控制,通过向数码管发送相应的信号,以驱动数码管显示所需的数字或字符。这些信号通常由控制器内部的程序产生,以控制数码管的亮灭状态,从而实现数字或字符的显示。

八位数码管模块广泛应用于各种电子设备中,如智能仪表、测量仪器、通讯设备、智能家居等。它可以用于显示温度、压力、流量、电量等参数,也可以用于显示操作菜单、状态信息等用户界面元素。

在选择八位数码管模块时,需要考虑其显示精度、亮度、视角、工作温度范围等参数,以确保其能够满足实际应用的需求。同时,还需要考虑控制器与数码管模块之间的接口兼容性,以确保两者能够正常通信和控制。

接线: 

Thonny+RP2040+八位数码管+杜邦线

接线

RP2040            数码管      
VCC VCC
GND GND
MOSI(GPIO15) DIN
SCK(GPIO14) CLK
CS(GPIO5) CS

这里暂时只使用一个数码管,不涉及连接多个数码管,如需连接多个数码管,只需要将数码管另一侧针脚依次按照顺序接在下一个数码管上。

MAX7219驱动

# Registers and associated values
_NOOP = const(0x0) # Used when cascading Max7219
_DIGIT0 = const(0x1)
_DIGIT1 = const(0x2)
_DIGIT2 = const(0x3)
_DIGIT3 = const(0x4)
_DIGIT4 = const(0x5)
_DIGIT5 = const(0x6)
_DIGIT6 = const(0x7)
_DIGIT7 = const(0x8)
_DECODEMODE = const(0x9) # (0 = no decode/raw segment values, 1 = decode only digit 0, 0xFF = decode on all digits)
_INTENSITY = const(0xA) # (0 = lowest intensity, 0xF = max intensity)
_SCANLIMIT = const(0xB) # (0 = display digit 0 only, 7 = display all 7 digits)
_SHUTDOWN = const(0xC) # (0 = shutdown, 1 = normal operation)
_DISPLAYTEST = const(0xF) # (0 = normal mode, 1 = test mode)
 
_HEX_TO_SEG = { 0x0: 0b1111110, 0x1: 0b0110000, 0x2: 0b1101101, 0x3: 0b1111001, 0x4: 0b0110011,
                0x5: 0b1011011, 0x6: 0b1011111, 0x7: 0b1110000, 0x8: 0b1111111, 0x9: 0b1111011,
                0xA: 0b1110111, 0xB: 0b0011111, 0xC: 0b1001110, 0xD: 0b0111101, 0xE: 0b1001111,
                0xF: 0b1000111, }
 
class Max7219:
    def __init__(self, spi, cs):
        self.spi = spi
        self.cs = cs
        self.cs.init(cs.OUT, True)
        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 (
            (_SHUTDOWN, 0), # Turn display off
            (_SCANLIMIT, 7), # Display all 7 digits
            (_DECODEMODE, 0xFF),# Decode all digits 
            (_INTENSITY, 0x3), # Set brightness to 3
            (_SHUTDOWN, 1), # Turn display on
        ):
            self.register(command, data)
            
    def brightness(self, value):
        if 0 <= value <= 15:
            self.register(_INTENSITY, value)
        else:
            raise ValueError("Brightness out of range")
        
    def clear(self):
        self.register(_DECODEMODE, 0xFF)
        for i in range(8):
            self.register(_DIGIT0 + i, 0x0)
            
    def write_num(self, value):
        self.register(_DECODEMODE, 0xFF)
        if (0 <= value <= 99999999):
            for i in range(8):
                self.register(_DIGIT0 + i, value % 10)
                value = value // 10
        elif (0 > value >= -9999999):
            value = -value
            self.register(_DIGIT7, 0xA)
            for i in range(7):
                self.register(_DIGIT0 + i, value % 10)
                value = value // 10
        else:
            raise ValueError("Value out of range")
        
    def write_hex(self, value):
        self.register(_DECODEMODE, 0x0)
        if (0 <= value <= 99999999):
            for i in range(8):
                self.register(_DIGIT0 + i, _HEX_TO_SEG[value % 16])
                value = value // 16
        else:
            raise ValueError("Value out of range")
 

该驱动中的字符只涉及到数字和部分字母,有其他需要可以自行添加,该驱动也只实现了简单的使用,有其他需要可以参照数据手册更改驱动。

演示代码:

from machine import Pin,SoftSPI
from MAX7912 import *
import utime,time
 

def mul():
    m = int(input("请输入第一个乘数:"))
    display.write_num(m)
    n = int(input("请输入第二个乘数:"))
    display.write_num(n)
    time.sleep(1)
    display.write_num(m*n)
    print("{}*{}={}".format(m,n,m*n))

 
 
if __name__ == '__main__':
 
    #MAX7219 SPI实现
    vspi = SoftSPI(sck=Pin(14), mosi=Pin(15), miso=Pin(19), baudrate=1000000)
    display = Max7219(vspi, Pin(5)) # CS->Pin5
    #清空屏幕
    display.clear()
    display.write_num(12345678)
    while True:                           
        mul()
        time.sleep(2)

结果展示: