简介:
八位数码管模块是一种用于显示数字的模块,由多个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)
结果展示: