一、产品简介

​ TM1638是深圳市天微电子有限公司设计的一款带键盘扫描接口的LED(发光二极管显示器)驱动控制专用芯片,内部集成有MCU数字接口、数据锁存器、LED高压驱动、键盘扫描等电路。主要应用于冰箱、空调 、家庭影院等产品的高段位显示屏驱动。

​ TM1638按键数码管LED显示模块是用TM1638芯片驱动,集合了单片机常用外围电路,最大特点是只需要占用单片机三个IO口即可驱动,扫描显示和按键扫描不需要单片机干预,只需要读写相关寄存器送显示数据或检测按键,节省MCU资源。

引脚定义(采用SPI通信协议):

  • VCC:DC-5V
  • GND:GND
  • STB:MOSI
  • CLK:SCLK
  • DIO:MISO

二、技术参数

  • 采用功率CMOS 工艺
  • 显示模式 10 段×8 位
  • 键扫描(8×3bit)
  • 8级辉度可调
  • 串行接口(CLK,STB,DIO)
  • 振荡方式:RC 振荡(450KHz+5%)
  • 内置上电复位电路
  • 采用SOP28封装

三、软件接口

驱动下载地址https://github.com/mcauser/micropython-tm1638

Methods

Power up, power down or check status.

power(val=None)

Get or set brightness.

brightness(val=None)

Write zeros to each address.

clear()

Write to all 16 addresses from a given position. Order is left to right, 1st segment, 1st LED, 2nd segment, 2nd LED etc.

write(data, pos=0)

Set the value of a single LED.

led(pos, val)

Set all LEDs at once. LSB is left most LED. Only writes to the LED positions (every 2nd starting from 1).

leds(val)

Set one or more segments at a relative position. Only writes to the segment positions (every 2nd starting from 0).

segments(segments, pos=0)

Return a byte representing which keys are pressed. LSB is SW1.

keys()

Convert a single hex digit (0x00-0x0f) to a segment.

encode_digit(digit)

Convert a string to a list of segments. Dots are merged with the previous character.

encode_string(string)

Convert a single character to a segment.

encode_char(char)

Display a number in hexadecimal format 00000000 through FFFFFFFF, right aligned, leading zeros.

hex(val)

Display a numeric value -9999999 through 99999999, right aligned.

number(num)

Display a temperature -9 through 99 followed by degrees C.

temperature(num, pos=0)

Displays a relative humidity -9 through 99 followed by RH.

humidity(num, pos=4)

Displays as much of a string as will fit.

show(string, pos=0)

Display a string, scrolling from the right to left, speed adjustable. String starts off-screen right and scrolls until off-screen left at 4 FPS by default.

scroll(string, delay=250)

四、接口案例

利用esp8266显示时钟

接线:

ESP8266 LED&KEY TM1638 Module
3V3 (or 5V) VCC
G GND
D7 (GPIO13) STB
D5 (GPIO14) CLK
D6 (GPIO12) DIO

模块导入:

from package import tm1368 as tm1638
from package import alarm as am
from machine import Pin,RTC
import time
from package import WiFi
import ntptime
import network
import uasyncio as asyncio
#import upip #用于安装asyncio库
#upip.install("_thread")

引脚定义:

rtc = RTC()
'''
D7 (GPIO13) STB
D5 (GPIO14) CLK
D6 (GPIO12) DIO
'''
tm=tm1638.TM1638(stb=Pin(13),clk=Pin(14),dio=Pin(12)) ##标号一致 板子有标记

全局变量:

alarm_hour = 12
alarm_minute = 0
alarm_flag = True #闹钟开关
alarm_status = False #闹钟状态hour = 13
minute = 14
second = 0
year = 2022
month = 5
day = 20'''
mode = 0 显示时间
mode = 1 显示日期
mode = 2 显示闹钟
'''
mode = 0

联网同步时间:

#联网并同步时间
WiFi.WIFI_Connect()
WiFi.sync_ntp()
last_sync_time = 0
print(rtc.datetime())
print("同步后本地时间:%s" %str(time.localtime()))

显示时间:

def display_time():#时间显示画面#tm.clear()global hourglobal minuteglobal secondnow_time = "{:0>2d}-{:0>2d}-{:0>2d}".format(hour,minute,second)# print(now_time)tm.show(now_time)

显示日历:

def display_calendar():#日历显示画面global monthglobal dayglobal yearnow_calendar = "{}.{:0>2d}.{:0>2d}".format(year,month,day)tm.show(now_calendar)

显示闹钟:

def display_alarm():#闹钟显示画面global alarm_hourglobal alarm_minuteglobal alarm_flagif alarm_flag == 1 :status = '-11-'else:status = 'off-'#print(status)alarm = "{}{:0>2d}.{:0>2d}".format(status,alarm_hour,alarm_minute)tm.show(alarm)

闹钟设置(只设置了led流水灯,没用蜂鸣器):

async def mode1():b = 0x80t = 0for i in range(8):b = 0x80for j in range(8-i):st = b | ttm.leds(st)time.sleep(0.3)await asyncio.sleep(0.3)b = cror(b,1)b = crol(b,1)t = b | t

按键设置:

def set_model():#设置模式,选择显示内容k = [0] *9k = key_num(k)n = button(k)global alarm_hourglobal alarm_minuteglobal modeglobal alarm_flagif n == 1:#闹钟小时增加if flag[n] == 0:alarm_hour +=1if alarm_hour > 23:alarm_hour = 0flag[n] = 1elif n == 2:#闹钟小时减少if flag[n] == 0:flag[n] = 1alarm_hour -=1if alarm_hour < 0:alarm_hour = 23elif n == 3:#闹钟分钟增加if flag[n] == 0:flag[n] = 1alarm_minute += 1if alarm_minute > 59:alarm_minute = 0elif n == 4:#闹钟分钟减少if flag[n] == 0:flag[n] = 1alarm_minute -= 1if alarm_minute < 0:alarm_minute = 59elif n ==5:#显示输出模式:时间、日历、闹钟if flag[n] == 0:flag[n] = 1mode = (mode+1)%3elif n == 6:#设置闹钟开关if flag[n] == 0:flag[n] = 1alarm_flag = ~ alarm_flag#print(alarm_flag)for i in range(1,len(k)):#按钮标志复位,防止连续按下if k[i] == 0 :flag[i] = 0

显示模块:

async def display():global yearglobal monthglobal dayglobal hourglobal minuteglobal secondglobal alarm_flagglobal alarm_statuswhile 1:t = time.localtime(time.time())year = t[0]month = t[1]day = t[2]hour = t[3]Synchronize_network_time(hour)minute = t[4]second = t[5]tm.brightness(0)if mode == 0:display_time()elif mode == 1:display_calendar()elif mode == 2:display_alarm()alarm_status = alarm_hour == hour and alarm_minute == minuteset_model()await asyncio.sleep(0.05)

五、详细代码:

alarm.py

from package import tm1368 as tm1638
from machine import Pin
import time
import uasyncio as asyncio
tm=tm1638.TM1638(stb=Pin(13),clk=Pin(14),dio=Pin(12)) ##标号一致 板子有标记
def crol(d,k):#循环左移a = 1for i in range(0,k-1):a = (a << 1) + 1a = a<<(8-k)h = (d & a ) >> (8-k)d = ((d | a ) << k)%256 + h#print("d = {:0>8b},h = {:0>8b},a = {:0>8b}".format(d,h,a))return d
def cror(d,k):#循环右移a = 1for i in range(0,k-1):a = (a << 1) + 1h = (d & a ) << (8-k)d = (d >> k) + hprint("d = {:0>8b},h = {:0>8b},a = {:0>8b}".format(d,h,a))return d
async def mode1():b = 0x80t = 0for i in range(8):b = 0x80for j in range(8-i):st = b | ttm.leds(st)time.sleep(0.3)await asyncio.sleep(0.3)b = cror(b,1)b = crol(b,1)t = b | t
def off():b = 0x00tm.leds(b)
def led():st = 0xaastatus = []mode1()
if __name__ == '__main__':while True:led()

WIFI.py

import ntptime
import network,time
from machine import RTC,Pin
rtc = RTC()print("同步前本地时间:%s" %str(time.localtime()))# 联WIFI
def WIFI_Connect():wlan = network.WLAN(network.STA_IF) #STA模式wlan.active(True)                   #激活接口start_time=time.time()              #记录时间做超时判断if not wlan.isconnected():print('connecting to network...')wlan.connect('ssid', 'password') #输入WIFI账号密码while not wlan.isconnected():if time.time()-start_time > 15 :print('WIFI Connected Timeout!')breakif wlan.isconnected():print('connected!')print('network information:', wlan.ifconfig())# 同步时间
def sync_ntp():ntptime.NTP_DELTA = 3155644800   # 可选 UTC+8偏移时间(秒),不设置就是UTC0ntptime.host = 'ntp1.aliyun.com'  # 可选,ntp服务器,默认是"pool.ntp.org"try:ntptime.settime()   # 修改设备时间,到这就已经设置好了except:#for i in range(6):#   led.value(1)              #turn off 0是亮#  time.sleep(0.1)#  led.value(0)             # time.sleep(0.1)print('同步失败')if __name__ == '__main__':WIFI_Connect()sync_ntp()print(rtc.datetime())print("同步后本地时间:%s" %str(time.localtime()))

main.py

from package import tm1368 as tm1638
from package import alarm as am
from machine import Pin,RTC
import time
from package import WiFi
import ntptime
import network
import uasyncio as asyncio
rtc = RTC()
'''
D7 (GPIO13) STB
D5 (GPIO14) CLK
D6 (GPIO12) DIO
'''
tm=tm1638.TM1638(stb=Pin(13),clk=Pin(14),dio=Pin(12)) ##标号一致 板子有标记alarm_hour = 12
alarm_minute = 0
alarm_flag = True #闹钟开关
alarm_status = False #闹钟状态hour = 13
minute = 14
second = 0
year = 2022
month = 5
day = 20#k = [0]*9
'''
mode = 0 显示时间
mode = 1 显示日期
mode = 2 显示闹钟
'''
mode = 0
#联网并同步时间
WiFi.WIFI_Connect()
WiFi.sync_ntp()
last_sync_time = 0
print(rtc.datetime())
print("同步后本地时间:%s" %str(time.localtime()))def key_num(k):#这个类是按钮用的,凑合用用if tm.keys()==1:k[1]=1elif tm.keys()==2:k[2]=1elif tm.keys()==4:k[3]=1elif tm.keys()==8:k[4]=1elif tm.keys()==16:k[5]=1elif tm.keys()==32:k[6]=1elif tm.keys()==64:k[7]=1elif tm.keys()==128:k[8]=1return kdef display_time():#时间显示画面#tm.clear()global hourglobal minuteglobal secondnow_time = "{:0>2d}-{:0>2d}-{:0>2d}".format(hour,minute,second)# print(now_time)tm.show(now_time)def display_calendar():#日历显示画面global monthglobal dayglobal yearnow_calendar = "{}.{:0>2d}.{:0>2d}".format(year,month,day)tm.show(now_calendar)def display_alarm():#闹钟显示画面global alarm_hourglobal alarm_minuteglobal alarm_flagif alarm_flag == 1 :status = '-11-'else:status = 'off-'#print(status)alarm = "{}{:0>2d}.{:0>2d}".format(status,alarm_hour,alarm_minute)tm.show(alarm)flag = [0]*9 #按键标志
def button(k):for i in range(len(k)):if k[i]==1:return ireturn 0def set_model():#设置模式,选择显示内容k = [0] *9k = key_num(k)n = button(k)global alarm_hourglobal alarm_minuteglobal modeglobal alarm_flagif n == 1:#闹钟小时增加#print(n,flag[n],flag[2])if flag[n] == 0:alarm_hour +=1if alarm_hour > 23:alarm_hour = 0flag[n] = 1elif n == 2:#闹钟小时减少#print(n,flag[n],flag[1])if flag[n] == 0:flag[n] = 1alarm_hour -=1if alarm_hour < 0:alarm_hour = 23elif n == 3:#闹钟分钟增加if flag[n] == 0:flag[n] = 1alarm_minute += 1if alarm_minute > 59:alarm_minute = 0elif n == 4:#闹钟分钟减少if flag[n] == 0:flag[n] = 1alarm_minute -= 1if alarm_minute < 0:alarm_minute = 59elif n ==5:#显示输出模式:时间、日历、闹钟if flag[n] == 0:flag[n] = 1mode = (mode+1)%3elif n == 6:#设置闹钟开关if flag[n] == 0:flag[n] = 1alarm_flag = ~ alarm_flag#print(alarm_flag)for i in range(1,len(k)):#按钮标志复位,防止连续按下if k[i] == 0 :flag[i] = 0def Synchronize_network_time(hour):#每六个小时同步时间global last_sync_timeif hour %6 == 0 and hour!= last_sync_time:wlan = network.WLAN(network.STA_IF) #STA模式if not wlan.isconnected():#print("正在连接网络")WiFi.WIFI_Connect()WiFi.sync_ntp()print('{hour}同步成功')last_sync_time == hour
''' 按下第 n 个按钮 k[n] = 1'''
async def alarm():global alarm_flagglobal alarm_statusif alarm_flag == 1 and alarm_status == 1:await am.mode1()else:am.off()async def alarm_test():while True:await alarm()await asyncio.sleep(1)async def display():global yearglobal monthglobal dayglobal hourglobal minuteglobal secondglobal alarm_flagglobal alarm_statuswhile 1:t = time.localtime(time.time())year = t[0]month = t[1]day = t[2]hour = t[3]Synchronize_network_time(hour)minute = t[4]second = t[5]tm.brightness(0)if mode == 0:display_time()elif mode == 1:display_calendar()elif mode == 2:display_alarm()alarm_status = alarm_hour == hour and alarm_minute == minuteset_model()await asyncio.sleep(0.05)loop = asyncio.get_event_loop()
loop.create_task(alarm_test())
loop.create_task(display())
loop.run_forever()

利用microPython驱动TM1638芯片相关推荐

  1. TM1638芯片的显存地址详细解读

    TM1638芯片的显存地址详细解读 相关篇<Arduino UNO 利用3个IO口 + TM1638+驱动8位数码管显示+24个独立按键> <51单片机驱动TM1638芯片+Prot ...

  2. 谷歌利用人工智能设计的芯片揭示了智能的本质

    来源:TechTalks 网站 作者:Ben Dickson 译者:Sambodhi 策划:刘燕 InfoQ 中文站曾经翻译并分享过<谷歌的深度学习在 AI 芯片中找到了一条关键路径>,该 ...

  3. Arduino 驱动TM1638显示十位的共阳数码管

    Arduino 驱动TM1638显示十位的共阳数码管 二话不说先上图: 这个是电路图,下面我在上传TM1638的手册 哈哈太乱了先凑合着看吧!效果是实现了,画了板还没有发过来. 我也不多说什么了上代码 ...

  4. 利用51单片机+hc595芯片配合在led点阵上玩贪吃蛇 第一篇“显示贪吃蛇”

    利用51单片机+hc595芯片配合在led点阵上玩贪吃蛇 第一篇"显示贪吃蛇" 完整的项目链接: https://github.com/linxinloningg/51_chip_ ...

  5. 利用51单片机+hc595芯片配合在led点阵上玩贪吃蛇 第二篇“自动运行函数”

    利用51单片机+hc595芯片配合在led点阵上玩贪吃蛇 第二篇"自动运行函数" 完整的项目链接: https://github.com/linxinloningg/51_chip ...

  6. microPython驱动tft屏幕显示中文终极解决方案

    microPython驱动tft屏幕显示中文终极解决方案 一.运行效果 二.实现原理 原理同上篇文章一样,用在线汉字取模工具获取点阵的字节信息,通过st7789py.py驱动程序显示出来. 上次的程序 ...

  7. 驱动字库芯片GT23L24M0140

     驱动字库芯片GT23L24M0140 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:WIN8 开发环境:MDK5.13 mcu: ...

  8. arm linux免驱usb声卡,arm linux利用alsa驱动并使用usb音频设备

    一.背景: arm linux的内核版本是3.13.0 二.准备工作 添加alsa驱动到内核中,也就是在编译内核的时候加入以下选项: 接下来就重新编译内核即可 三.交叉编译alsa-lib和alsa- ...

  9. 基于FPGA的CAN通信,FPGA驱动SJA1000T芯片代码,实现标准帧与扩展帧的通信驱动

    基于FPGA的CAN通信,FPGA驱动SJA1000T芯片代码,实现标准帧与扩展帧的通信驱动,已上板调通 品牌型号 CAN SJA1000T 与世面上的不同,代码不是SJA1000T芯片代码,而是驱动 ...

最新文章

  1. 神经网络的设计与分析之概述
  2. 电脑屏保海底世界_想象不到!这些世界顶尖科技,掌握在谁的手里?
  3. 利用结构体数组实现重排序(详解)
  4. 邮件发送类_SpringBoot优雅地发送邮件
  5. 设计PNG免抠素材|提高调性!透明液态气泡免扣素材
  6. Sudo: unable to initialize policy plugin 解决方法
  7. matlab2c使用c++实现matlab函数系列教程-ismember函数
  8. 基于 Keras 用 LSTM 网络做时间序列预测
  9. java实现word转pdf
  10. 象棋人机对弈java_象棋人机对弈程序的思想
  11. Vision Transformer模型/论文详解
  12. 颜值大比拼,用数据告诉你中国哪里美女多?
  13. 【经典算法实现 3】冒泡排序算法(单向冒泡,双向冒泡)
  14. Andorid APK反逆向解决方案---梆梆加固原理探寻
  15. 国内电商系统为什么要以ThinkPHP为核心开发
  16. 一个虎扑社区数据分析实战
  17. 怎样用键盘控制电脑的光标
  18. (已解决)ubuntu16.04 Nvidia驱动安装成功却无法检测到外接显示器
  19. 量化交易入门阶段:好事要成双——双均线策略
  20. xxx不在 sudoers 文件中,此事将被报告

热门文章

  1. office2010 安装错误1402
  2. 制造业SCM系统的实施经验分享
  3. 数据库同步复制|sqlserver同步工具|sqlserver数据库定时同步
  4. 四层网络模型指什么?【YYT】
  5. 【制作电子杂志软件】云展网教程 | 管理、修改电子杂志设置
  6. JQuery-slideToggle
  7. 信用卡葵花宝典 阅读笔记(三)
  8. Andriod Studio
  9. 【直接下载】x86_64-8.1.0-release-win32-sjlj-rt_v6-rev0
  10. 台式计算机设置常亮,电脑常亮不灭怎么设置