from machine import Pin
from time import sleep
#TM1637驱动(不需要了解)
class TM1637:
def __init__(self, clk_pin, dio_pin, brightness=7):
# 初始化TM1637显示器
self.clk = Pin(clk_pin, Pin.OUT) # 时钟引脚
self.dio = Pin(dio_pin, Pin.OUT) # 数据引脚
self.brightness = brightness # 显示亮度,范围是0(最暗)到7(最亮)
def start(self):
# 启动信号
self.clk.value(1)
self.dio.value(1)
self.dio.value(0)
self.clk.value(0)
def stop(self):
# 停止信号
self.clk.value(0)
self.dio.value(0)
self.clk.value(1)
self.dio.value(1)
def write_byte(self, data):
# 写入一个字节数据
for i in range(8):
self.clk.value(0)
self.dio.value((data >> i) & 1)
self.clk.value(1)
# 读取ACK信号
self.clk.value(0)
self.dio.init(Pin.IN) # 设置为输入以读取ACK
self.clk.value(1)
ack = self.dio.value()
self.clk.value(0)
self.dio.init(Pin.OUT) # 重新设置为输出
return ack
def set_brightness(self, brightness):
# 设置亮度,注意范围是0到7
self.brightness = brightness & 0x07
def display(self, data, colon=False):
# 显示数据,data是一个数字列表,colon决定是否显示冒号
segment_map = [0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f]
self.start()
self.write_byte(0x40) # 设置数据命令
self.stop()
self.start()
self.write_byte(0xc0) # 设置地址命令
for i, num in enumerate(data):
seg_data = segment_map[num]
if colon and i == 1: # 如果需要显示冒号,调整第二个数字
seg_data |= 0x80 # 通过将比特7置1来打开冒号
self.write_byte(seg_data)
self.stop()
self.start()
self.write_byte(0x88 | self.brightness) # 控制显示并设置亮度
self.stop()
def display_custom(self, data):
"""显示自定义字符,data 是一个 4 元素列表,每个元素是一个段编码"""
self.start()
self.write_byte(0x40) # 设置数据命令
self.stop()
self.start()
self.write_byte(0xc0) # 设置地址命令
for seg_data in data:
self.write_byte(seg_data) # 发送段编码
self.stop()
self.start()
self.write_byte(0x88 | self.brightness) # 控制显示亮度
self.stop()
#格式化时间
def format_time(seconds):
"""将秒数转换为分钟和秒的格式,返回一个数字列表"""
minutes = seconds // 60
seconds = seconds % 60
return [minutes // 10, minutes % 10, seconds // 10, seconds % 10]
# 初始化引脚
#tm1637重点是连接CLK和DIO引脚,只需连接并定义即可
clk_pin = 21
dio_pin = 22
tm = TM1637(clk_pin, dio_pin)
#自定义要显示的字符
custom_chars = [0x76, 0x79, 0x38, 0x73] # 对应于 "H", "E", "L", "P"
#对应'P'是:(dp)GFEDCBA->二进制是:01110011->十六进制是:73
#定义计时器
def run_timer():
seconds = 0
while True:
tm.display(format_time(seconds), colon=(seconds % 2)) # 显示时间并打开冒号
sleep(1) # 每秒更新一次
seconds += 1
#run_timer() #如要显示计时器功能取消这段注释即可
tm.display_custom(custom_chars)