神坛,TM1638死活不显示任何东西,是什么原因呢?
数码管用的是共阴数码管,单片机STC11F04E,数码管一直没有任何显示,调试了一天,没进展,求神坛指点。现在要求不高,只要数码管有一点显示就行啊{:3_60:}
#include <intrins.h>
#include <STC11F04E.H>
#include <stdio.h>
#define SYSTEM_CLK 11520000
void uart_init(unsigned int baud) {
SCON= 0x50;
TMOD |= 0x20;
TH1 = 256 - SYSTEM_CLK / baud / 384;
TR1 = 1;
TI = 1;
}
void Delay500ms() //@11.0592MHz
{
unsigned char i, j, k;
i = 22;
j = 3;
k = 227;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void _delay_us(unsigned char i) //@11.0592MHz
{
while(i--)
{
_nop_();
}
}
sbit STB = P3^3;
sbit CLK = P3^4;
sbit DIO = P3^5;
sbit led1 = P1^6;
sbit led2 = P1^7;
#define DIO_high do{DIO=1;}while(0)
#define DIO_low do{DIO=0;}while(0)
#define CLK_high do{CLK=1;}while(0)
#define CLK_low do{CLK=0;}while(0)
#define STB_high do{STB=1;}while(0)
#define STB_low do{STB=0;}while(0)
unsigned char tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
void TM1638_Write(unsigned char DATA) //写数据函数
{
unsigned char i;
for(i=0;i<8;i++)
{
CLK_low;
if(DATA&0X01)
DIO_high;
else
DIO_low;
DATA>>=1;
CLK_high;
_delay_us(1);
}
}
void Write_COM(unsigned char cmd) //发送命令字
{
STB_low;
TM1638_Write(cmd);
STB_high;
_delay_us(1);
}
void init_TM1638(void)
{
unsigned char i;
Write_COM(0x8F);//亮度
Write_COM(0x40);
STB_low;
TM1638_Write(0xc0);
for(i=0;i<16;i++)
TM1638_Write(0x00);
STB_high;
}
int main(void)
{
unsigned int i=0,j=0;
unsigned char flag=0;
init_TM1638();
uart_init(9600);
Delay500ms();
while(1)
{
for(i=0; i<8; i++)
{
printf("i=%2d; this is a test.\n",i);
Write_COM(0x8F);//亮度
Write_COM(0x40);
STB_low;
TM1638_Write(0xc0);
for(j=0;j<16;j++)
{
TM1638_Write(i);
}
STB_high;
Delay500ms();
}
}
} 使用51串口的串口的同步方式,加入STB试试 io口没初始化吧
会不会把共 阴极数码管弄成共阳了 marshallemon 发表于 2013-2-7 19:51 static/image/common/back.gif
使用51串口的串口的同步方式,加入STB试试
我这里的串口仅仅用来打印输出的。
控制端口用的是这几个:
sbit STB = P3^3;
sbit CLK = P3^4;
sbit DIO = P3^5;
#define DIO_high do{DIO=1;}while(0)
#define DIO_low do{DIO=0;}while(0)
#define CLK_high do{CLK=1;}while(0)
#define CLK_low do{CLK=0;}while(0)
#define STB_high do{STB=1;}while(0)
#define STB_low do{STB=0;}while(0)
honami520 发表于 2013-2-7 20:21 static/image/common/back.gif
会不会把共 阴极数码管弄成共阳了
应该不会,数码管用的是AH的,并且,使用前用万用表测量过。
beyond870215 发表于 2013-2-7 20:08 static/image/common/back.gif
io口没初始化吧
初始化用的是:
76.void init_TM1638(void)
77. {
78. unsigned char i;
79. Write_COM(0x8F);//亮度
80. Write_COM(0x40);
81. STB_low;
82. TM1638_Write(0xc0);
83. for(i=0;i<16;i++)
84. TM1638_Write(0x00);
85. STB_high;
86.}
这个可以吗? i/o 接口那3顆 0.1uF 電容太大啦 那些Data 都去充電了 superAFE 发表于 2013-2-7 20:34 static/image/common/back.gif
你在写0x8f之前没有拉低stb信号吧?
写0x8f用的是Write_COM(0x8F);//亮度
void Write_COM(unsigned char cmd) //发送命令字
{
STB_low;
TM1638_Write(cmd);
STB_high;
_delay_us(1);
}
还有刚才把每个信号前后都加了100us的延时,也没效果,
#define DIO_high do{_delay_us(100);DIO=1;_delay_us(100);}while(0)
#define DIO_low do{_delay_us(100);DIO=0;_delay_us(100);}while(0)
#define CLK_high do{_delay_us(100);CLK=1;_delay_us(100);}while(0)
#define CLK_low do{_delay_us(100);CLK=0;_delay_us(100);}while(0)
#define STB_high do{_delay_us(100);STB=1;_delay_us(100);}while(0)
#define STB_low do{_delay_us(100);STB=0;_delay_us(100);}while(0)
{:3_60:} wthzack 发表于 2013-2-7 20:36 static/image/common/back.gif
i/o 接口那3顆 0.1uF 電容太大啦 那些Data 都去充電了
刚才看了一下数据手册,有个例子中用的是104
进口小开关 发表于 2013-2-7 20:48 static/image/common/back.gif
刚才看了一下数据手册,有个例子中用的是104
把 104 拆掉 or 換 100P 電容 試試 E文数据手册,例子中用的是101,即 100pF。{:lol:}
我用 TM1635用103電容Data就亂了 eblc1388 发表于 2013-2-7 20:59 static/image/common/back.gif
E文数据手册,例子中用的是101,即 100pF。
中文datasheet伤不起啊,一会想想办法怎么把电容弄下来。
放假了,工具都在公司那里,连个电烙铁都木有了……
一小时内回复超了,得等会。 我觉得肯定不是电容的问题!这个只是影响信号的变化速度而已!肯定还是程序的问题。我写TM1640一次性成功。 晕,问题可能不仅仅是由于104电容引起的,但是104绝对能引起此问题。 lz 可以用51的IO口模拟spi总线写数据看看 你需要一台示波器 先把104电容去掉,如果真要用,也只能用101,用104肯定不行;这芯片很好用,完全按手册上电路,用官方程序,肯定OK 发自内心,感谢神坛各位坛友,果然是电容的问题。
中文数据手册伤不起啊。
用钳子暴力把104电容弄碎了,数码管立马出字了。
wthzack 发表于 2013-2-7 20:36 static/image/common/back.gif
i/o 接口那3顆 0.1uF 電容太大啦 那些Data 都去充電了
谢谢您,一眼看出了问题之所在。{:handshake:} stb
data
clk
不能加104.。。。。。{:titter:}你非得加,那么程序必须延时足够 正如楼上所说,加上的话,CLK的时间必须足够,加上对抗干扰有一定帮助。 104电容是可以用,不过你的MCU得推挽……
建议别那么大…… 进口小开关 发表于 2013-2-7 22:28 static/image/common/back.gif
谢谢您,一眼看出了问题之所在。
記得 成品要加100P ~200P電容電容越大延遲時間要加大 穩定度較好但浪費時間{:titter:} eblc1388 发表于 2013-2-7 20:59 static/image/common/back.gif
E文数据手册,例子中用的是101,即 100pF。
果然是0.1uf的问题。看来天微得改善datasheet啊! 进口小开关 发表于 2013-2-7 22:26 static/image/common/back.gif
发自内心,感谢神坛各位坛友,果然是电容的问题。
中文数据手册伤不起啊。
用钳子暴力把104电容弄碎了,数 ...
哪要这么暴力?用小刀划断PCB上的铜丝不就行了?将来如果要104的电容可以刮开导线再焊上. honami520 发表于 2013-2-7 21:32 static/image/common/back.gif
我觉得肯定不是电容的问题!这个只是影响信号的变化速度而已!肯定还是程序的问题。我写TM1640一次性成功。 ...
honami520 发表于 2013-2-7 21:32 static/image/common/back.gif
我觉得肯定不是电容的问题!这个只是影响信号的变化速度而已!肯定还是程序的问题。我写TM1640一次性成功。 ...
请教一下:TM1640驱动led数码管,是不是不用串限流电阻?
官方的例图没用
104电容太大了,数据都给滤波滤掉了,以前刚工作时我用595也碰到这种问题 104有时候会救人,但有时候就会害人的 那个电容应该是100PF呀,104太大了。 TM1629 还要转换数据,不知道这个IC是不是也是这样。 哈哈……104的王道!!你这是书看太多了!! 不需要串电阻,电路照手册来肯定行 以前用过CH452,和这个差不多,SPI 之类的数据线上不应该加电容,大的电容肯定破坏掉了信号。 honami520 发表于 2013-7-18 11:41 static/image/common/back.gif
不需要串电阻,电路照手册来肯定行
多谢指导 我前天也遇到了楼主的问题,TM1638驱动数码管死活不显示。我用的是0.56寸的共阴数码管。刚开始还以为是数码管是共阳极的,后来测试加上看数码管数据手册,发现数码管没有问题,是共阴极的。接着又怀疑PCB做错了,对着原理图查了2遍,也发现没有问题。最后怀疑程序,可是这个程序是以前用在TM1620上没有问题,现在完全移植过来也不应该出问题啊,郁闷了2天,今天看到这个帖子里有人说是104电容的问题,恍然大悟,回过头查看我原来TM1620电路上用的也是101,而且厂家的数据手册上给出的也是101,果断去掉104,上电OK,显示全出来了。感谢楼上的提示。另外,楼主说中文手册有误是不对的,TM1638数据手册里是有个电路给出的电容是104,不过是用在驱动共阳极数码管上的,驱动共阴极电路人家给还是101.我用104是完全想当然了,认为不就是个滤波电容嘛,刚好手头没有101,都是104,就顺手焊接上去了,失误啊,以后还是得按照数据手册电路走。 我都没接电容。。。失误啊。。。。不过我弄那个装在一个80W紫外线灯内部,灯架挖的洞,4位数码管,用来给紫外线灯定时用的,感觉那干扰也不小。。。用了半年多了,没有出过问题。。呵呵,单片机用的跟楼主的是一样的。 像这种时序问题,买个逻辑分析仪很方便 像这种时序问题,买个逻辑分析仪很方便 用的是固定地址还是自动增加,估计是时序没写对吧 LZ后面有继续做吗? pengtaoABC 发表于 2014-7-20 22:05
LZ后面有继续做吗?
恩,当时现场的电磁环境很恶劣,后续又完善了几个版本,优化了PCB现场电磁干扰的问题、程序的稳定性等。说起来快一年半了,时间过的真快。 pengtaoABC 发表于 2014-7-20 22:05
LZ后面有继续做吗?
优化针对的是模拟量采集部分。显示部分很容易,把电容去掉之后就OK了。
页:
[1]