Files
mixly3/boards/default_src/micropython/origin/build/lib/tm1637.py

122 lines
2.5 KiB
Python

"""
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)