74HC595扩展IO,数据错位怎么办

我的ARM板子有一些IO口焊死了,现在我需要一些IO口,所以只能利用现有的几个IO口扩展IO了
我用74HC595,大致程序如下,
/*HC595的驱动,发送数据*/
void HC595_senddata(uchar dat)
{
uchar i,x=0;
SCLKL;
for(i=0;i<8;i++)//发送一个八位数据
{
if(((dat<<x)&0x80)==0)
SIL; //第i位 为0,则SI发送0
else
SIH;
SCLKH;//上升沿,发送数据,因为for外面有个sclkl
SCLKL;
x+=1;
}
RCLKL;
RCLKH;
}
void main()
{
...//这里省略了初始化
void HC595_senddata(0x0F);
while(1);//运行到这,程序停在这
}

问题是:程序运行到while(1)停住了,刚开始一会 8位并行口为00001111,一会可能就变成00011111,或00111111,等等别的什么,数据一直在错误。这是为什么?谢谢大家
随着时间推移,数据一直在错位!

错位? 不像。 像是干扰。
那么,你刚刚写入时,显示的数据正确否?
看程序,只是写入了一次,以后,程序就停住了。
以后,595就会自动的变化,这应该是干扰引起的。追问

谢谢,怎么能消除干扰呢?确实,刚刚写入的时候数据正确,过一会 就不对了,慢慢变化。

追答

抗干扰,主要是应该在电路设计中解决。
比如,把595的四条信号线,分别都接上一个上拉电阻。
程序写完595后,就在程序中,把这四条信号线,都置为高电平。
这样,从硬件到软件,就都把它们置一了。
这时,如果干扰的强度不大,它就改变不了这种状态,也就不能影响595的内部数据。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-03-07
注意595的电源干扰 在595电源输入脚加104 还有在ARM输出到595间加一级缓冲比如245 573 373之类的追问

ARM与595直接什么都没加。我在595之后加一个74HC245可以吗,提供带负载能力。这样道理一样吗谢谢

追答

245驱动能力没有595强哦 573还行
你要驱动什么呢?电流多大?大电流最好用2003之类的

第2个回答  2012-03-20
现在我需要一些IO口,所以只
相似回答