单片机学习小组
登录
直播中
张桂英
8年用户
1604经验值
私信
关注
如何驱动TM1640?
开启该帖子的消息推送
单片机
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就大致讲解到这里,如有疑问可在后方留言。
驱动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
是接SPI吗? SCLK DIN
举报
更多回帖
rotate(-90deg);
回复
相关问答
单片机
TM1640
如何使用BitBanging
驱动
TM1640
?
2023-04-27
555
TM1640
驱动
数码管不显示该怎么办?
2019-10-20
6105
TM1640
驱动
1.2寸数码管微亮
2017-04-14
10566
请问I2C从机单片机接收程序怎么写?
2019-10-21
3362
使用FPGA对光栅传感器的输出信号进行20细分可以吗?
2013-06-04
2156
天微电子原厂 笔段
驱动
2016-04-11
2830
关于
TM
1638
驱动
程序问题。
2012-08-03
53020
stm8的I2C问题,有几块板子接收数据不正常,求哪位大侠帮忙指点指点
2016-10-10
4899
将文本输入到通过I2C与ESP8266-1连接的LCD屏幕,收到报错怎么解决?
2023-06-12
366
TM
1616
驱动
2013-05-05
4920
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
首页
论坛版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分