单片机学习小组
直播中

张桂英

8年用户 1604经验值
私信 关注

如何驱动TM1640?

如何驱动TM1640?

回帖(2)

曾盼丽

2022-2-28 11:46:48
  驱动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就大致讲解到这里,如有疑问可在后方留言。
举报

披肩人

2023-3-2 08:55:37
是接SPI吗?  SCLK DIN
举报

更多回帖

发帖
×
20
完善资料,
赚取积分