2017-11-04 21:43:37 +00:00
|
|
|
|
|
|
|
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
|
|
|
|
]
|
|
|
|
|
2017-11-25 16:17:11 +00:00
|
|
|
@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
|
|
|
|
|
2017-11-04 21:43:37 +00:00
|
|
|
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
|
2017-11-25 16:17:11 +00:00
|
|
|
self._flip = False
|
2017-11-04 21:43:37 +00:00
|
|
|
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
|
|
|
|
|
2017-11-25 16:17:11 +00:00
|
|
|
@property
|
|
|
|
def flip( self ) : return self._flip
|
|
|
|
|
|
|
|
@flip.setter
|
|
|
|
def flip( self, aValue ) :
|
|
|
|
self._flip = aValue
|
|
|
|
|
2017-11-04 21:43:37 +00:00
|
|
|
@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 ) :
|
2017-11-25 16:17:11 +00:00
|
|
|
colonloc = -2 if self.flip else 1
|
2017-11-04 21:43:37 +00:00
|
|
|
if self.colon :
|
2017-11-25 16:17:11 +00:00
|
|
|
self._buffer[colonloc] |= 0x80
|
2017-11-04 21:43:37 +00:00
|
|
|
else:
|
2017-11-25 16:17:11 +00:00
|
|
|
self._buffer[colonloc] &= ~0x80
|
2017-11-04 21:43:37 +00:00
|
|
|
|
|
|
|
self._write_comm1()
|
|
|
|
self._start()
|
|
|
|
self._write_byte(_CMD2)
|
2017-11-25 16:17:11 +00:00
|
|
|
|
|
|
|
#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)
|
|
|
|
|
2017-11-04 21:43:37 +00:00
|
|
|
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)
|
|
|
|
|