一、产品简介

​ 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()

用esp8266做一个网络时钟相关推荐

  1. 巴法云 使用 esp01s wifi模块 做一个网络智能开关

    巴法云 使用 esp01s wifi模块 做一个网络智能开关 前言 一:配置arduino IDE,使其支持ESP8266编程开发 二:esp01s接线问题 1 下载模式 2 运行模式 三:开发环境测 ...

  2. 如何做一个桌面时钟?

    大家好,我是qbwww,今天我们来做一个桌面时钟.淘宝买的套件.首先呢,我们先看一下原理图,简单的了解一下连线方式. 简单的了解了一下连线的方式呢,我们再来看一下元件.首先来看电路板,电路板上的线看起 ...

  3. 用树莓派PICO做一个桌面时钟超详细教程!

    用树莓派PICO做一个可显示时间和温湿度的桌面时钟 一.概述 二.材料准备 1.树莓派PICO 2.DHT11温湿度传感器 3.DS1302时钟模块(选用) 4.SSD1306屏幕 5.其他材料 三. ...

  4. 手把手教你做一个天气时钟,推荐收藏

    转自:MAKER: opengreenenergy/译:公众号:趣无尽 大家好,我是小麦,今天给大家分享一个有趣的天气时钟项目. 这个项目使用 ESP8266 和 2.8 英寸触摸屏来制作显示器,通过 ...

  5. 用Arduino做一个“空心时钟”(只有表针,没有表盘)

    这周我们来一起看看如何用Arduino自制一个只有表针,没有表盘的"空心时钟". 看起来还是挺炫酷的,再放几张网友们参照教程做的图欣赏一下: ▲ 视频演示 第0步:材料准备 步进电 ...

  6. 基于esp8266的Arduino网络时钟

    硬件 esp8266 01s arduino uno TM1637 4位数码管 软件 Arduino IDE 使用NTP服务需要先安装 NTPClient 库,按组合件 Crtrl + Shift + ...

  7. [屌丝PM]做一个网络“拾穗者”(2)

    2013-12-19 黄炎雷 IT百问 ----1024---- 为了方便大家查看文章,新做了一个全文目录. 使用方法: 回复:h    就能查看所有文章 ----1024---- 最近很喜欢听一个日 ...

  8. 利用51单片机做一个简易时钟

    利用独立键盘,数码管完成一个简易的时钟,按键一可以修改时间,按键二可以设置闹钟,按键三进行加一操作,按键四进行减一操作. 主函数: void main() {bsp_init();while(1){T ...

  9. mfc做一个网络聊天工具

    程序中写了两个类,CServer和CClent类, 分别是: /**************CServer****************/ private:  void ServerInit(); ...

  10. 做一个墨水屏电子钟,炫酷!

    这周和大家介绍一个漂亮的墨水屏电子钟,兼具气象站功能(可以通过GPS自动设置),用4节AAA电池可以续航6个月左右,而且,为了保证安全和可靠性,它不需要任何网络连接. 特点包括: 自动设置(通过GPS ...

最新文章

  1. 在ORACLE中对存储过程加密
  2. MySQL — 外键关联操作
  3. Linux解决openoffice转换PDF乱码问题(ubutun16.0.4)
  4. 身怀56个IM技术专利,网易云信如何改变即时通讯?
  5. 人人都是 DBA(X)资源信息收集脚本汇编
  6. 数据表现层文件命名参考
  7. opencv计算两数组的乘积_#剑指Offer#12. 构建乘积数组
  8. 线段树-Chossing Ads-分治,主元素思想,神题
  9. 中继代理 server2008R2
  10. html是纯文本语言吗,记事本是纯文本文件吗
  11. trycatch 不能捕获运行时异常_软件运行异常时的多种排查思路与方法
  12. 投色子--html demo
  13. 读我是一只IT小小鸟有感
  14. 浅谈三种使用Redis实现MQ的方式
  15. struts2继承ActionSupport
  16. idea格式化代码失效
  17. asp.net 按钮点击调用FileUpload
  18. 小米笔记本Air 13.3 指纹版安装黑苹果 macOS High Sierra 10.13 教程
  19. 【Python爬虫+js逆向】使用Python爬取腾讯漫画的逆向分析(典型签名验证反爬虫的解决方案)——以腾讯动漫《一人之下》第一话为例
  20. ios10 申请拍照权限_iOS 10 获取相册相机权限

热门文章

  1. 虚拟服务器的真实ip,虚拟ip和真实ip区别(图文)
  2. Helio Protocol — 分布式代币借贷和流动性质押协议
  3. XCOM 导入条目显示正在使用中解决方案
  4. oracle启动实例界面,oracle 11g 启动数据库实例
  5. 如何从0到1打磨一门 Elasticsearch 线上直播课?
  6. mindspore| lenet模型 推理过程记录
  7. ZOJ 2480 Simplest Task in Windows
  8. 如何设计一个电商平台积分兑换系统!
  9. PostgreSQL 源码解读(109)- WAL#5(相关数据结构)
  10. 工行u盾显示316_工行U盾常见故障处理