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