glinfei 发表于 2021-6-22 20:30 你好,谢谢回答,可是这个板子也是按着这个电路打的,硬件这方面我没办法去改 |
#include<STC_NEW_8051.H> #include"TM1628.H" /*写入单字节函数*/ void TM_w_BYTE(unsigned char TM_w_data){ unsigned char i,temp1; unsigned char x; temp1=TM_w_data;//赋值 for(i=0;i<8;i++)//循环写入每一位 { if(temp1&0x01) //写入第一位 {TM_DIO_high;} else {TM_DIO_low;} TM_CLK_low; for(x=8;x>0;x--); TM_CLK_high; temp1>>=1;//右循环一位 } } /*写入命令*/ void TM_w_command(unsigned char TM_w_data) { TM_STB_low; //片选拉低 TM_w_BYTE(TM_w_data); //写命令 TM_STB_high; //拉高写入 } /*固定地址写入数据函数*/ void TM_w_data(unsigned char TM_w_addr,unsigned char TM_w_data) { TM_STB_low; TM_w_BYTE(TM_ADD_command + TM_w_addr); //地址写入BYTE TM_w_BYTE(TM_w_data); //数据写入BYTE TM_STB_high; //忽略CLK } void TM_init(void) { TM_STB_high; TM_CLK_high; } TM1638H #ifndef __TM1628_H__ #define __TM1628_H__ sbit DIO =P1^7; sbit CLK =P1^6; sbit STB =P1^5; #define TM_CLK_high CLK=1 #define TM_CLK_low CLK=0 #define TM_DIO_high DIO=1 #define TM_DIO_low DIO=0 #define TM_STB_high STB=1 #define TM_STB_low STB=0 #define TM_DAT_command 0x40 #define TM_DIS_control 0x70 #define TM_ADD_command 0xc0 #define TM_SGM_LUM 0x8e void TM_w_BYTE(unsigned char TM_w_data); void TM_w_command(unsigned char TM_w_data); void TM_w_data(unsigned char TM_w_addr,unsigned char TM_w_data); unsigned int TM_r_BYTE(void); unsigned int TM_r_key(void); void TM_init(void); #endif 实物调通的,stc10F08 |
我觉得是P3上拉的电阻太小,试试直接连了吗? |
wwh2382 发表于 2021-6-22 10:59 那个我也试了, |
既然是抄来的也就不用太较真,不行就再抄别的。论坛里玩过1637的还是有的,你没好好找。自己还好意思说找了好几天!707794433的“基于单片机+TM1637的数码管显示程序”看着不错,起码程序的书写格式比你那个强。具体网址我就不发了,麻烦你动手找一下 |
Y_G_G 发表于 2021-6-22 10:08 额,第一次接触这个,谢谢你提醒 |
51c_yang 发表于 2021-6-22 08:49 怎么就想着复制别人的代码直接就能亮灯了呢?如果这样的话,单片机工程师都找不到工作了 这个驱动IC的数据手册我看过了,就几个页面的PDF而已,有编程基础10个小时之内就能亮灯了 学习总是要的嘛,不是说坐在那等着,网友说一个你改一下 |
看了你电路,想问你P3口为啥还要拉高呢,它内部集成了,而且你用的是1K的,也太小了,直接接试试。 另外,我查了一下,看来它的应答要求不高,两种写法应该都行。 |
Y_G_G 发表于 2021-6-21 23:56 这个写入函数是tm1637芯片手册给的, |
51c_yang 发表于 2021-6-21 21:29 这驱动IC并不是用IIC通讯的 你要先看数据手册,然后自己先写一个写入的函数,就是简单的启动然后写入,其它的什么都不要 就看应答有没有应答,有应答就搞一个指示,一个IO接一个LED看一下 首先要做的是写入,然后要正确的应答, 这个过程就是用来验证你写入字节函数是否正确而已,只有写入函数正确了,才能进行下一步 直接就能找到代码然后亮灯的,这种好事并不多 这个IC的数据手册中是有例程的,你可以去参考一下 |
Y_G_G 发表于 2021-6-21 21:20 我改成你说的,试了也不行,应该不是这个问题 |
void ack_IIC() { P32=0; P33=1; IIC_delay(5); while(P33); P32=1; IIC_delay(2); P32=0; IIC_delay(2); } 数据线在读取前要先置位为才能正确的读取P33引脚的电平状态 |
glinfei 发表于 2021-6-21 16:54 你好,我按你说的改了,但是数码管还是不亮 |
看到两个问题:一是,你的void WriteByte(unsigned char WriteData)已经包含了ack_IIC(),后边I2C()又读一次,当然就读不到了。二是,你对应答理解不对啊,所以void ack_IIC()可能写错了。我简单写了一个,你看看行不? P32=0; IIC_delay(5); P33=1; IIC_delay(5); P32=1; IIC_delay(5); while(P33==1); //获得应答位 |
zsyzdx 发表于 2021-6-21 11:38 把延时改成了100ms,还是没有反应 ![]() |
yzwzfyz 发表于 2021-6-21 13:54 这个tm1637驱动芯片我从网上找的芯片手册看的,具体的原理我不太清楚 |
wwh2382 发表于 2021-6-21 15:28 卖家只负责卖,他不给提供程序 ![]() |
先用卖家提供的例程测试能否正常显示,然后再上自己的程序 |
DIG1、DIG2、DG1、DG2、DG3又是什么呢? |
能先说说tm1637的工作原理吗? |
数码管频率修改一下试试 |
这个芯片对时序要求比较高,建议把延时加大试试。 |
在线等,不知道现在玩单片机的还多不多,这个问题找了好几天都没有解决,这个芯片的引脚用万用表量后都有电;不知道 |