TM1640数码管驱动芯片示例代码

TM1640数码管驱动芯片示例代码

1.  数码管基本知识

1.1 数码管分类

按显示段数分类,常用数码管分为七段和八段,如下图所示,八段比七段多一个小数点:

按内部发光二极管单元的连接方式分类:分为共阳极共阴极

共阳极数码管是指将所有发光二极管的阳极接到一起形成公共阳极的数码管,共阳级数码管在应用时将公共极接到+5V(驱动方式:低电平亮,高电平不亮)。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极的数码管,共阴数码管在应用时应将公共极接到地线GND上(驱动方式:高电平亮,低电平不亮)。

1.2 数码管内部构造

下图(a)中的com引脚代表数码管公共级

1.3 数码管显示原理

从上面内容可以得知数码管其实就是由多个LED组成的,它们分别叫a,b,c,d,e,f,g,dp,只要点亮这8个LED中的其中几个,就能达到显示数字的目的。

下图是数码管显示0-F对应的编码:

2. TM1640数码管驱动时序+示例代码

TM1604有两种驱动时序,一种是地址自动加一,一种是固定地址模式,这里以地址自动加一模式为例:(具体时序参看TM1640官方手册,这里不做赘述)

下图中,GRID1-GRID16代表16个数码管,C0H-CFH代表16个数码管对应的地址,B0-B7代表数码管对应想要亮起的LED(a,b,c,d,e,f,g,第八位代表小数点)

共阴级驱动电路,显示数据表如下(七段和八段数码管)

//底层管脚驱动---主控为CMS8S6990
void hal_tm1640Init(void)
{
	GPIO_SET_MUX_MODE(P04CFG, GPIO_MUX_GPIO);		    /*SCL*/
	GPIO_ENABLE_OUTPUT(P0TRIS, GPIO_PIN_4);	
	P04 = 0;
	
	GPIO_SET_MUX_MODE(P05CFG, GPIO_MUX_GPIO);		    /*SDA*/	 
	GPIO_ENABLE_OD(P0TRIS, GPIO_PIN_5);	
	P05 = 0;
}

void hal_tm1640Delay(void)
{ 
	u8 i;
	for(i=0; i<10; i++);
	_nop_();
}

void hal_tm1640I2cStart()
{
	IIC_SCL=1;
	hal_tm1640Delay();
	IIC_SDA=1;
	hal_tm1640Delay();
	IIC_SDA=0;
	hal_tm1640Delay();	
}


void hal_tm1640I2cStop()
{
	IIC_SCL=0;
	hal_tm1640Delay();
	IIC_SDA=0;
	hal_tm1640Delay();
	IIC_SCL=1;
	hal_tm1640Delay();
	IIC_SDA=1;
	hal_tm1640Delay();		
}

void hal_tm1640I2cSendByte(unsigned char dat)
{
	u8 i,aa;
	
	aa=dat;
	for(i=0;i<8;i++)
	{
		IIC_SCL=0;
		hal_tm1640Delay();
		if(aa&0x01)
		{
			IIC_SDA=1;
		}
		else
		{
			IIC_SDA=0;
		}
        hal_tm1640Delay();
		IIC_SCL=1;				
		aa>>=1;
	}
}




//TM1640初始化,保证上电所有数码管LED为关闭状态(先清屏再写入)
void ajl_tm1640_init_test(void)
{
	uint8_t  i = 0;

	hal_tm1640I2cStart();
	hal_tm1640I2cSendByte(0x40);  //地址自动加 1     
	hal_tm1640I2cStop();
	hal_tm1640I2cStart();
	hal_tm1640I2cSendByte(0xC0);	 
	
	for(i = 0; i < 16; i++)
	{
		
		hal_tm1640I2cSendByte(0x00);
	}
	hal_tm1640I2cStop();
	hal_tm1640I2cStart();	
	
	hal_tm1640I2cSendByte(0x80);  //显示关:0X80
	hal_tm1640I2cStop();
}

//在3个7段数码管上分别显示1 6 8
void ajl_tm1640_test(void)
{

	hal_tm1640I2cStart();
	hal_tm1640I2cSendByte(0x40);  //地址自动加 1     
	hal_tm1640I2cStop();
	hal_tm1640I2cStart();
	hal_tm1640I2cSendByte(0xC0);	//数码管写入起始地址 
	
    //连续写入3个数据		
	hal_tm1640I2cSendByte(0x06);// 1
	hal_tm1640I2cSendByte(0x7D);// 6
	hal_tm1640I2cSendByte(0x7F);// 8
	
	hal_tm1640I2cStop();
	hal_tm1640I2cStart();	
	hal_tm1640I2cSendByte(0x88);  // 显示开:0X88   显示关:0X80
	hal_tm1640I2cStop();
}

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值