Micropython学习交流群 学习QQ群:786510434 提供多种固件下载和学习交流。
Micropython-扇贝物联 QQ群:31324057 扇贝物联是一个让你与智能设备沟通更方便的物联网云平台
Micropython学习交流群 学习QQ群:468985481 学习交流ESP8266、ESP32、ESP8285、wifi模块开发交流、物联网。
Micropython老哥俩的IT农场分享QQ群:929132891 为喜欢科创制作的小白们分享一些自制的计算机软硬件免费公益课程,由两位多年从事IT研发的中年大叔发起。
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.0084221363067627 seconds