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防反接口 |
模块原理图
通讯时序格式
指令集说明
实验组件
ESP32 Plus主板 x1
Keyes TM1650四位数码管模块 x1
XH2.54-4P 转杜邦线母单线 x1
USB线 x1
模块接线图
代码
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开始循环。
代码说明
代码 | 说明 |
clearBit(bit) | 清除bit(1~4)位显示。 |
setBrightness(b = BRIGHT_TYPICAL) | 亮度设置。 |
DigitalTube.clearBit(b) | 清除位显示。 |
displayOnOFF(OnOff = 1) | 显示小数点,0为关,1为开。 |
ShowNum(num) | 显示整数num,范围为0~9999 。 |