TM1650四位数码管模块


项目介绍

Keyes TM1650四位数码管模块选用的 0.36 英寸红色共阴4位数码管的驱动芯片是TM1650。TM1650是一种带键盘扫描接口的LED驱动控制专用电路的芯片。内部集成有MCU输入输出控制数字接口、数据锁存器、LED 驱动、键盘扫描等电路。TM1650性能稳定、质量可靠、抗干扰能力强,可适用于24小时长期连续工作的应用场合。TM1650采用两线串行传输协议通讯(注意:该数据传输协议不是标准的I2C协议)。该芯片只需要通过两个引脚与MCU通讯就可以完成数码管的驱动,可以节省MCU引脚资源。

实验中使用Keyes TM1650四位数码管模块时,我们只需要2根信号线即可使单片机控制4位数码管,大大节约了控制板IO口资源。

模块参数

工作电压DC 5V
电流100 mA
最大功率0.5 W
数码管显示颜色红色
LED极性共阴
通讯方式2线高速串行接口(CLK,DAT)
工作温度-10°C ~ +50°C
尺寸47.6 x 23.8 x 10.6 mm
定位孔大小直径为 4.8 mm
接口间距为2.54 mm 4pin防反接口

模块原理图

TM1650模块原理图

通讯时序格式

TM1650通讯时序图 TM1650通讯时序图 TM1650通讯时序图 TM1650通讯时序图

指令集说明

TM1650指令集1 TM1650指令集2 TM1650指令集3 TM1650指令集4

实验组件

ESP32 Plus主板
ESP32 Plus主板 x1
Keyes TM1650四位数码管模块
Keyes TM1650四位数码管模块 x1
XH2.54-4P 转杜邦线母单线
XH2.54-4P 转杜邦线母单线 x1
USB线
USB线 x1

模块接线图

TM1650模块接线图

代码

from machine import Pin
import time

### TM1650的定义
ADDR_DIS = 0x48 #加密模式命令
ADDR_KEY = 0x49 #读键值命令

### 亮度的定义
BRIGHT_DARKEST = 0
BRIGHT_TYPICAL = 2
BRIGHTEST = 7

on = 1
off = 0

### number:0~9
NUM = [0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f]
DIG = [0x6e,0x6c,0x6a,0x68]
DOT = [0,0,0,0]

clkPin = 22
dioPin = 21
clk = Pin(clkPin, Pin.OUT)
dio = Pin(dioPin, Pin.OUT)

DisplayCommand = 0

def writeByte(wr_data):
global clk,dio
for i in range(8):
if(wr_data & 0x80 == 0x80):
dio.value(1)
else:
dio.value(0)
clk.value(0)
time.sleep(0.0001)
clk.value(1)
time.sleep(0.0001)
clk.value(0)
wr_data <<= 1
return

def start():
global clk,dio
dio.value(1)
clk.value(1)
time.sleep(0.0001)
dio.value(0)
return

def ack():
global clk,dio
dy = 0
clk.value(0)
time.sleep(0.0001)
dio = Pin(dioPin, Pin.IN)
while(dio.value() == 1):
time.sleep(0.0001)
dy += 1
if(dy>5000):
break
clk.value(1)
time.sleep(0.0001)
clk.value(0)
dio = Pin(dioPin, Pin.OUT)
return

def stop():
global clk,dio
dio.value(0)
clk.value(1)
time.sleep(0.0001)
dio.value(1)
return

def displayBit(bit, num):
global ADDR_DIS
if(num > 9 and bit > 4):
return
start()
writeByte(ADDR_DIS)
ack()
writeByte(DisplayCommand)
ack()
stop()
start()
writeByte(DIG[bit-1])
ack()
if(DOT[bit-1] == 1):
writeByte(NUM[num] | 0x80)
else:
writeByte(NUM[num])
ack()
stop()
return

def clearBit(bit):
if(bit > 4):
return
start()
writeByte(ADDR_DIS)
ack()
writeByte(DisplayCommand)
ack()
stop()
start()
writeByte(DIG[bit-1])
ack()
writeByte(0x00)
ack()
stop()
return


def setBrightness(b = BRIGHT_TYPICAL):
global DisplayCommand,brightness
DisplayCommand = (DisplayCommand & 0x0f)+(b<<4)
return

def setMode(segment = 0):
global DisplayCommand
DisplayCommand = (DisplayCommand & 0xf7)+(segment<<3)
return

def displayOnOFF(OnOff = 1):
global DisplayCommand
DisplayCommand = (DisplayCommand & 0xfe)+OnOff
return

def displayDot(bit, OnOff):
if(bit > 4):
return
if(OnOff == 1):
DOT[bit-1] = 1;
else:
DOT[bit-1] = 0;
return

def InitDigitalTube():
setBrightness(2)
setMode(0)
displayOnOFF(1)
for _ in range(4):
clearBit(_)
return

def ShowNum(num): #0~9999
displayBit(1,num%10)
if(num < 10):
clearBit(2)
clearBit(3)
clearBit(4)
if(num > 9 and num < 100):
displayBit(2,num//10%10)
clearBit(3)
clearBit(4)
if(num > 99 and num < 1000):
displayBit(2,num//10%10)
displayBit(3,num//100%10)
clearBit(4)
if(num > 999 and num < 10000):
displayBit(2,num//10%10)
displayBit(3,num//100%10)
displayBit(4,num//1000)

InitDigitalTube()

while True:
#displayDot(1,on) # 开或关, DigitalTube.Display(bit,number); bit=1---4 number=0---9
for i in range(0,9999):
ShowNum(i)
time.sleep(0.01)

实验结果

按照接线图正确接好模块,用USB线连接到计算机上电,单击 运行按钮 来执行程序代码。代码开始执行,能看到4位数码管显示数字,从0开始,每10毫秒加1,直至加到9999后又从0开始循环。

TM1650实验现象

代码说明

代码说明
clearBit(bit)清除bit(1~4)位显示。
setBrightness(b = BRIGHT_TYPICAL)亮度设置。
DigitalTube.clearBit(b)清除位显示。
displayOnOFF(OnOff = 1)显示小数点,0为关,1为开。
ShowNum(num)显示整数num,范围为0~9999 。