GuyCarver-MicroPython/lib/sevenseg.py

203 wiersze
4.0 KiB
Python

from machine import Pin
from time import sleep_us, time, localtime
import pyb
class sevenseg(object):
"""docstring for 7seg"""
_CMD1 = const(0x40)
_CMD2 = const(0xC0)
_CMD3 = const(0x80)
# A
# ---
# F | | B
# -G-
# E | | C
# ---
# D
# XGFEDCBA
_numbertable = [
0b00111111, #0
0b00000110, #1
0b01011011, #2
0b01001111, #3
0b01100110, #4
0b01101101, #5
0b01111101, #6
0b00000111, #7
0b01111111, #8
0b01101111, #9
0b01110111, #A
0b01111100, #B
0b00111001, #C
0b01011110, #D
0b01111001, #E
0b01110001, #F
0b00000000, #space
0b01000000 #dash
]
@staticmethod
def flipdigit( aByte ) :
bit = 1
f = 0
#swap bits 0-2 with 3-5 (0-3, 1-4, 2-5)
for x in range(3):
f |= (aByte & bit) << 3
bit <<= 1
for x in range(3, 6):
f |= (aByte & bit) >> 3
bit <<= 1
f |= aByte & 0xC0 #Keep the rest of the bits.
return f
def __init__(self, clk, dio ):
self._clk = pyb.Pin(clk, pyb.Pin.IN)
self._dio = pyb.Pin(dio, pyb.Pin.IN)
self._brightness = 0
self._colon = False
self._flip = False
self._buffer = bytearray(4)
self._clk.init(Pin.IN)
self._dio.init(Pin.IN)
self._clk(0)
self._dio(0)
self.brightness = 7
@property
def colon( self ) : return self._colon
@colon.setter
def colon( self, aValue ) :
self._colon = aValue
@property
def flip( self ) : return self._flip
@flip.setter
def flip( self, aValue ) :
self._flip = aValue
@property
def brightness( self ) : return self._brightness
@brightness.setter
def brightness( self, aValue ) :
self._brightness = aValue & 0xF
self._write_comm1()
self._write_comm3()
def _start(self):
self._dio.init(Pin.OUT)
sleep_us(50)
def _stop(self):
self._dio.init(Pin.OUT)
sleep_us(50)
self._clk.init(Pin.IN)
sleep_us(50)
self._dio.init(Pin.IN)
sleep_us(50)
def _write_comm1(self):
self._start()
self._write_byte(_CMD1)
self._stop()
def _write_comm3(self):
self._start()
self._write_byte(_CMD3 + self._brightness + 7)
self._stop()
def _write_byte(self, b):
# send each bit
for i in range(8):
self._clk.init(Pin.OUT)
sleep_us(50)
self._dio.init(Pin.IN if b & 1 else Pin.OUT)
sleep_us(50)
self._clk.init(Pin.IN)
sleep_us(50)
b >>= 1
self._clk.init(Pin.OUT)
sleep_us(50)
self._clk.init(Pin.IN)
sleep_us(50)
self._clk.init(Pin.OUT)
sleep_us(50)
def clear( self ) :
for v in self._buffer:
v = 0
def display( self ) :
colonloc = -2 if self.flip else 1
if self.colon :
self._buffer[colonloc] |= 0x80
else:
self._buffer[colonloc] &= ~0x80
self._write_comm1()
self._start()
self._write_byte(_CMD2)
#If screen flipped we need to flip the digits and write in reverse oder.
if self.flip:
sloc = len(self._buffer) - 1
for x in range(sloc, -1, -1):
b = self.flipdigit(self._buffer[x])
self._write_byte(b)
else:
for b in self._buffer:
self._write_byte(b)
self._stop()
self._write_comm3()
def data( self, aIndex, aValue ) :
self._buffer[aIndex] = aValue
def digit( self, aIndex, aValue ) :
if 0 <= aValue < len(self._numbertable) :
self.data(aIndex, self._numbertable[aValue])
def char(self, aIndex, char):
"""Display a character 0-9, a-f, space or dash."""
o = ord(char)
c = -1
# space
if o == 32:
c = 16
# dash
if o == 45:
c = 17
# uppercase A-F
if 65 <= o <= 70:
c = o - 55
# lowercase a-f
if 97 <= o <= 102:
c = o - 87
# 0-9
if 48 <= o <= 57:
c = o - 48
self.digit(aIndex, c)
def clock(tm) :
rtc = pyb.RTC()
while True:
t = rtc.datetime()
tm.colon = t[6] & 1
tm.digit(0, t[4] // 10)
tm.digit(1, t[4] % 10)
tm.digit(2, t[5] // 10)
tm.digit(3, t[5] % 10)
tm.display()
# sleep(1 - time() % 1)