I wrote some code for the PyBoard to drive a TM1637 4-digit 7-segment LED display. The code is basically I2C with no slave, so not terribly difficult to bit-bang.

Then I modified that code to use the PyBoard's RTC to work as a clock. That worked fine, so I thought I would get it going on the Trinket M0. Worked away at the code for a while before realizing that the Trinket M0 doesn't have an RTC. So I ditched that idea and just got the display working on the Trinket M0.

I had gotten fairly comfortable with MicroPython and the PYB library on the PyBoard. Porting my code to CircuitPython on the Trinket M0 and the Adafruit libs was different enough that I basically had to start learning all over again. The libs are quite different

In this pic I'm using a quadrature encoder to increment and decrement a counter, and displaying the number on the TM1637. Adafruit hasn't implemented any interrupts in CircuitPython yet, so the encoder has to be polled. There is a method of doing fast pseudo-interrupt polling that I might play with later

Here's the PyBoard TM1637 demo code:

from pyb import Pin
import time

CLK = Pin('X2',Pin.IN,Pin.PULL_UP)
DIO = Pin('X1',Pin.IN,Pin.PULL_UP)
CLK.low()
DIO.low()

# 0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,h,l,p,3-lines,blank
font = [0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x76,0x38,0x73,0x49,0x00]
div = [0x1000,0x100,0x10,0x01]
digit = [0,0,0,0]

def help():
    start()
    byteout(0xc0)
    byteout(font[0x10])
    byteout(font[0x0e])
    byteout(font[0x11])
    byteout(font[0x12])
    stop()

#display 4-digit number in hex - use bool to select leading zero
def hexconv(num, leadzero, colon):
    for x in range(4):
        digit[x] = int(num / div[x])
        num = num - (digit[x] * div[x])
    if leadzero == 0:           #if leading zero deselected
        leadz()                 #go blank them
    start()
    byteout(0xc0)               #set data address
    for x in range(4):
        if x == 1 and colon == 1:
            byteout(font[digit[x]] + 0x80)
        else:
            byteout(font[digit[x]])
    stop()

def leadz():                    #clear leading zeros
    for x in range(4):
        if digit[x] != 0:
            return
        else:
            digit[x] = 20

def byteout(cmd):
    for x in range(8):                          #clock out cmd byte
        CLK = Pin('X2',Pin.OUT_PP)              #clk low
        time.sleep_us(50)
        if cmd & 0x01:                          #set data bit
            DIO = Pin('X1',Pin.IN,Pin.PULL_UP)  #dio high
        else:                                   #or
            DIO = Pin('X1',Pin.OUT_PP)          #dio low
        time.sleep_us(50)
        CLK = Pin('X2',Pin.IN,Pin.PULL_UP)      #clk high
        time.sleep_us(50)
        cmd = cmd >> 1                          #rotate next bit into position
    CLK = Pin('X2',Pin.OUT_PP)              #do 9th clock pulse
    DIO = Pin('X1',Pin.IN)                  #dio input
    time.sleep_us(50)
    CLK = Pin('X2',Pin.IN,Pin.PULL_UP)      #clk high
    while DIO.value() != 0:                 #wait for ack
        pass
    DIO = Pin('X1',Pin.OUT_PP)              #dio output
    time.sleep_us(50)
    CLK = Pin('X2',Pin.OUT_PP)              #clk low
    time.sleep_us(50)

def start():
    DIO = Pin('X1',Pin.OUT_PP)              #dio low
    time.sleep_us(50)

def stop():
    DIO = Pin('X1',Pin.OUT_PP)              #dio low
    time.sleep_us(50)
    CLK = Pin('X2',Pin.IN,Pin.PULL_UP)      #clk high
    time.sleep_us(50)
    DIO = Pin('X1',Pin.IN,Pin.PULL_UP)      #dio high

def brightness(level):  # 0-7
    level = level + 0x88
    start()
    byteout(level)      #display on - brightness
    stop()

def init():
    start()
    byteout(0x40)   #write data to display register, auto address, normal
    stop()
    start()
    byteout(0x8c)   #display on - brightness (0x88 to 0x8f)
    stop()

#------------------------------------------------------
# Begin here
#------------------------------------------------------

init()

help()
pyb.delay(5000)

while True:
    for x in range(0x10000):
        hexconv(x,0,0)

Next Post Previous Post