""" TM1637 for Four Digit LED Display Micropython library for the TM1637 ======================================================= @dahanzimin From the Mixly Team """ from machine import Pin from time import sleep_us from micropython import const TM1637_CMD1 = const(0x40) TM1637_CMD2 = const(0xC0) TM1637_CMD3 = const(0x80) TM1637_DSP_ON = const(0x08) TM1637_DELAY = const(0x0A) _SEGMENTS = b'\x3F\x06\x5B\x4F\x66\x6D\x7D\x07\x7F\x6F\x77\x7C\x39\x5E\x79\x71' class TM1637: def __init__(self, clk, dio, brightness=2): self.clk = Pin(clk, Pin.OUT, value=0) self.dio = Pin(dio, Pin.OUT, value=0) sleep_us(TM1637_DELAY) self._intensity = brightness self.dbuf = [0, 0, 0, 0] self.on() def _start(self): self.dio(0) sleep_us(TM1637_DELAY) self.clk(0) sleep_us(TM1637_DELAY) def _stop(self): self.dio(0) sleep_us(TM1637_DELAY) self.clk(1) sleep_us(TM1637_DELAY) self.dio(1) def _write(self, b): for i in range(8): self.dio((b >> i) & 1) sleep_us(TM1637_DELAY) self.clk(1) sleep_us(TM1637_DELAY) self.clk(0) sleep_us(TM1637_DELAY) self.clk(0) sleep_us(TM1637_DELAY) self.clk(1) sleep_us(TM1637_DELAY) self.clk(0) sleep_us(TM1637_DELAY) def intensity(self, val=None): """Set the display brightness 0-7.""" if val is None: return self._intensity val = max(min(val, 7), 0) self._intensity = val if val == 0: self.off() else: self.on() def on(self): self._start() self._write(TM1637_CMD1) self._stop() self._start() self._write(TM1637_CMD3 | TM1637_DSP_ON | self._intensity) self._stop() def off(self): self._start() self._write(TM1637_CMD3) self._stop() def dat(self, bit, data): self._start() self._write(TM1637_CMD2 | bit) self._write(data) self._stop() def clear(self): self.dat(0, 0) self.dat(1, 0) self.dat(2, 0) self.dat(3, 0) self.dbuf = [0, 0, 0, 0] def showbit(self, num, bit=0): self.dbuf[bit % 4] = _SEGMENTS[num % 16] self.dat(bit, _SEGMENTS[num % 16]) def shownum(self, num): if num < 0: self.dat(0, 0x40) # '-' num = -num else: self.showbit((num // 1000) % 10) self.showbit(num % 10, 3) self.showbit((num // 10) % 10, 2) self.showbit((num // 100) % 10, 1) def showhex(self, num): if num < 0: self.dat(0, 0x40) # '-' num = -num else: self.showbit((num >> 12) % 16) self.showbit(num % 16, 3) self.showbit((num >> 4) % 16, 2) self.showbit((num >> 8) % 16, 1) def showDP(self, bit=1, show=True): if show: self.dat(bit, self.dbuf[bit] | 0x80) else: self.dat(bit, self.dbuf[bit] & 0x7F)