【TM3130数码管驱动测试】

TM3130数码管驱动测试

为实现多个数码管的控制这里以TM3130芯片进行demo测试,TM3130只需接一个数据IO口即可控制多个数码管,在使用上大大节省IO,并且可以进行芯片之间的级联控制,非常方便高效。

本例使用的是STC15F2K60S2型号单片机进行测试

一、TM3130介绍

3130是8×4显示扫描模式单线通讯LED恒流驱动电路,内部集成有MCU数字接口、数据锁存器、扫描输出、恒流驱动等电路。通过MCU单根通讯线发送数据到芯片显存,节约MCU端口资源,操作简便。适用于显示屏驱动或数码管驱动。本产品性能优良,质量可靠。

在这里插入图片描述

管脚功能
在这里插入图片描述

时序特性

在这里插入图片描述
在这里插入图片描述

注意

1、发送 0 码或 1 码的周期时间为 1.25μs(频率 800KHz),字节之间的低电平时间不要超过 45μs,否则芯片可能复位,复位后又重新接收数据,无法实现数据正确传送;
2、0 码控制相应驱动端口关断,1 码控制相应驱动端口开通

数据传送格式

在这里插入图片描述
在这里插入图片描述

该表格中的32位数据可以看出GR0表示的是数码管的位,简单来说bit0-bit7控制第一位数码管,bit8-bit15控制第二位数码管,bit16-bit23控制第三位数码管,bit24-bit31控制第四位数码管,我们向控制哪位数码管的时候只需将相应数码管的bit位的数据传入即可。

TM3130级联连接
在这里插入图片描述
在这里插入图片描述

芯片级联时数据接收和转发过程如下:控制器发送数据包D1,芯片1接收第一组32bit,此时芯片1无转发;然后控制器发送数据包D2,芯片1接收第二组32bit,由于芯片1已经存有第一组32bit,因此,芯片1通过DO把第二组32bit转发给芯片2,芯片2接收芯片1转发来的数据包D2,此时芯片2无转发;然后控制器发送数据包D3,芯片1又把接收到的第三组32bit转发给芯片2,由于芯片2已经存有第二组32bit,因此,芯片2又把第三组32bit转发给芯片3,芯片3接收到第三组32bit;依此类推,级联的所有芯片将得到各自的显示数据。此时如果控制器发送一个Reset信号,所有芯片将会复位并把各自接收到的32bit数据解码后控制驱动端口输出,完成一个数据刷新周期,芯片又回到接收准备状态。

在这里插入图片描述

二、工程源码
时钟频率我选择的是22.1184Mhz,在进行时序图程序编写时 不同的频率
高低电平的延时可能有些不同,根据自己的来调整就好了
#include <STC15F2K60S2.H>
#include <intrins.h>

#define nop  _nop_();    
//共阴 0-F段码表 不带小数点
//--------------------------------------------------------------
unsigned char  smg_duan[16] = {0x3f,0x06,0x5b,0x4f,0x66,
														   0x6d,0x7d,0x07,0x7f,0x6f,
												  	   0x77,0x7c,0x39,0x5e,0x79,0x71};
//---------------------------------------------------------------
//共阴 0.-F.段码表 带小数点
//---------------------------------------------------------------
unsigned char smg_duan2[16] = {0xbf,0x86,0xdb,0xcf,0xe6,
															 0xed,0xfd,0x87,0xff,0xef,
															 0xf7,0xfc,0xb9,0xde,0xf9,0xf1};
//---------------------------------------------------------------

//共阳 0-F段码表 不带小数点
//---------------------------------------------------------------
unsigned char  smg_duan3[16] = {0xc0,0xf9,0xa4,0xb0,0x99,
														    0x92,0x82,0xf8,0x80,0x90,
														    0x88,0x83,0xc6,0xa1,0x86,0x8e};
//---------------------------------------------------------------
//共阳 0-F段码表
//---------------------------------------------------------------
unsigned char  smg_duan4[16] = {0x40,0x79,0x24,0x30,0x19,
																0x12,0x02,0x78,0x00,0x10,
																0x08,0x03,0x46,0x21,0x06,0x0e};
//---------------------------------------------------------------

sbit DO=P1^0;				    //定义信号输出DO

void Delay20us()		//@22.1184MHz
{
	unsigned char i;

	i = 108;
	while (--i);
}


//根据时序图进行软件编程时,不同频率下可能进行的延时不同 我这里选择的是22.1184MHz
void Send_One_Byte(unsigned char dat)
{
	unsigned char j = 0;
	//	DO = 0;
		for(j = 0;j<8;j++)
		{
			if(dat & 0x80)  //从高位开始   
			{
				 //发送“1”码
				DO = 1;				
				//高电平 持续800ns 这里根据芯片手册来进行延时
				_nop_();
				_nop_();
				_nop_();
				_nop_();
				_nop_();
				_nop_();
				_nop_();
				_nop_();
				_nop_();
				_nop_();
				_nop_();
				_nop_();
				_nop_();
				_nop_();
				_nop_();
				_nop_();		
				DO = 0;  
				//低电平 持续时间400ns
				_nop_();
				_nop_();
				_nop_();
				_nop_();
				_nop_();
				_nop_();						
			}else{
				//发送"0"码	
				DO = 1;
				//高电平持续时间 450us			
				_nop_();
				_nop_();
				_nop_();
				_nop_();
				_nop_();
				_nop_();		
				DO = 0;
				//低电平持续时间 900ns
				_nop_();
				_nop_();
				_nop_();
				_nop_();
				_nop_();
				_nop_();
				_nop_();
				_nop_();
				_nop_();
				_nop_();
				_nop_();
				_nop_();
				_nop_();
				_nop_();
				_nop_();
				_nop_();
			}
			dat = (dat << 1);  //次低位
		}
		Delay20us()	;
}


//发送一帧数据32位
void Send_SMG_Byte(unsigned char dat1,unsigned char dat2,unsigned char dat3,unsigned char dat4)
{
	Send_One_Byte(dat1);
	Send_One_Byte(dat2);
	Send_One_Byte(dat3);
	Send_One_Byte(dat4);
}


void ResetDataFlow(void)	//@22.1184MHz
{
	unsigned char i, j;

	i = 5;
	j = 74;
	do
	{
		while (--j);
	} while (--i);
}



void Delay500ms()		//@22.1184MHz
{
	unsigned char i, j, k;

	_nop_();
	_nop_();
	i = 43;
	j = 6;
	k = 203;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}


/*===============================主函数=======================================*/
void main()
{
	unsigned char i = 0,j = 1;
	while(1)
	{
			ResetDataFlow();
			//传入数据根据实际进行改变
			Send_SMG_Byte(0x00,0x06,0x00,0x00); //发送第一帧数据32bit			
			Send_SMG_Byte(0x00,0x7d,0x00,0x00); //发送第二帧数据32bit			
			ResetDataFlow();
			Delay500ms();
	}
	
}
/*================================结束==========================================*/
三、测试结果

1.1块TM3130芯片
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2.TM3130两块级联

在这里插入图片描述
在这里插入图片描述

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小殷学长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值