当前位置:网站首页>TM1640的驱动及代码

TM1640的驱动及代码

2020-12-08 12:33:57 osc_7wfxe2gv

TM1640的驱动及代码

  驱动TM 1640 其实并不困难,我们只需注意1640通讯时的电平变化,及数据传输规律首先我们可以看到1640的数据手册,(完整代码点击文章末分享链接,自行查找)

在这里插入图片描述

注意数据的输入条件和结束条件,输入条件是CLK 为高电平时,DIN由低变高,我们以传统51单片机为例,写出TM1640的输入开始函数;

void TM1640_start ()
{

CLK = 0;			//CLK=0,DIN= 0增加代码可靠性
DIN = 1;
CLK = 1;
delay_ms(5);       	//5毫秒延时
DIN = 0;
delay_ms (5);
CLK = 0;
delay_ms (5);

}
同样的结束条件是CLK 为高时DIN电平由低变高,写出它的结束函数;
void TM1640_stop ()
{


CLK = 0;             //CLK=0,DIN=0防止传输的最后以为数据于结束指令冲突
DIN = 0;
CLK = 1;
delay_ms (5);
DIN = 1;
delay_ms (5);

}
我们可以看见TM1640其实并不是真正意义上的总线通讯,它只是通过两个IO口的电平变化来实现控制;TM1640是将一个八位数据拆分为单个数据进行单个传输进行传输8次,完成一个数据的传输,注意传输时的电平变化;写出其数据传输函数;
void send_byte (uint num)
{
uint q;



for (q= 8;q>0;q--)
{
	CLK = 0;
	if (num&0x01)
	{
			DIN = 1;
			delay_ms (5);
	}
	else 
	{
			DIN = 0;
			delay_ms(5);
	}
CLK = 1;
num = num>>1;
}
delay_um (5);

}
对于传输函数我们还有很多种写法,就不在这里过多赘述了。
在此以下的代码都以自动加地址为例,TM1640默认地址自加模式,
在这里插入图片描述


因其默认为自加模式,所以可不写模式选择函数,但为了大家更好的理解,就写在下方;
可以从第一张图中发现,要TM1640正常显示数码管,数据传输是有顺序要求的,
1,设置数据(我们一般只用 自加模式0x40,固定地址模式0x44)
其函数为;


void model (uint k)
{

if (k)
{
	TM1640_start ();
	send_byte (0x40);//自动加一
	TM640_stop ();
}
else 
{
	TM1640_start ();
	send_byte (0x44);//固定地址
	TM1640_stop ();

}

2,设置地址,地址有16位,分别对应16位数码管,从上图可以看见地址位从0xc0~0xcf;地址传输并不需要特定函数进行,可用 send_byte ( ) 进行,
例如;

TM1640_start();
send_byte (0xc0);

3,设置传输数据,有十六位,每个数据是相互连续的,中间不需要使用 stop()函数打断;要知道的是16位数码管是循环显示的,就像单片机数据的左移,右移一样

void wite_date () //地址自动加一模式
{

TM1640_start ();
send_byte (0xc0);            //输入首地址
send_byte (num_display[0]);  //输入个数码管的显示数据1~16;
send_byte (num_display[1]);
send_byte (num_display[2]);
send_byte (num_display[3]);
send_byte (num_display[4]);
send_byte (num_display[5]);
send_byte (num_display[6]);
send_byte (num_display[7]);
send_byte (num_display[8]);
send_byte (num_display[9]);
send_byte (num_display[10]);
send_byte (num_display[11]);
send_byte (num_display[12]);
send_byte (num_display[13]);
send_byte (num_display[14]);
send_byte (num_display[15]);
TM1640_stop ();

}
写这么长是为了后期便以更改每一数码管的数值,读者可以进行简练,

4,显示控制,其实就是数码管亮度调节,脉冲宽度越小亮度越高
在这里插入图片描述
void led_display (uint f)
{


start ();
send_byte (f);
stop ();

}

对于固定地址模式于地址自动加一模式大致相差不大,但要注意的是固定地址模式同时发生完地址和数据后要用 stop () 函数停止 ,star ()函数开始后在进行下一位地址和数据的传输。

对于TM1640就大致讲解到这里,如有疑问可在后方留言。

链接:https://pan.baidu.com/s/1ru7SMuWvpc9qvbdrxXw5zg
提取码:1640

版权声明
本文为[osc_7wfxe2gv]所创,转载请带上原文链接,感谢
https://my.oschina.net/u/4383937/blog/4780879