完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
2个回答
|
|
驱动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就大致讲解到这里,如有疑问可在后方留言。 |
|
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
imx6ull 和 lan8742 工作起来不正常, ping 老是丢包
2493 浏览 0 评论
3341 浏览 9 评论
3022 浏览 16 评论
3514 浏览 1 评论
9119 浏览 16 评论
1243浏览 3评论
636浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
627浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2375浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1938浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-25 04:00 , Processed in 0.939656 second(s), Total 49, Slave 40 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号