laofuz1024 发表于 2015-2-12 21:05:51

问一个74HC595的问题

首先把图晒出来先

这是原理图:



这是面包板的




这是程序:

/**
定义芯片接口
*/
#define DS 9
#define OE 8
#define ST_CP 7
#define SH_CP 6
#define MR 5

void setup(){
Serial.begin(9600);
pinMode(DS,OUTPUT);
pinMode(OE,OUTPUT);
pinMode(ST_CP,OUTPUT);
pinMode(SH_CP,OUTPUT);
pinMode(MR,OUTPUT);
digitalWrite(OE,LOW);//允许芯片输出
}

void loop(){
delay(50);
digitalWrite(MR,LOW);//清空移位寄存器
delay(30);
digitalWrite(MR,HIGH);//使移位寄存器有效
delay(3000);

int x=255;//把这个数字转换成二进制后当作输出显示,255转换成二进制就是8个1
for(int i=0;i<8;i++){
    //i<8是只转换8位二进制,最大就是255
    if(x%2==1){
      //转换后如果该位是1就放入高电平芯片DS口
      digitalWrite(DS,HIGH);
    }else{
      //转换后如果该位是0就放入低电平芯片DS口
      digitalWrite(DS,LOW);
    }
    Serial.println(x);
    x=x/2;//这个是转换二进制的逻辑
    delay(50);
    digitalWrite(SH_CP,HIGH);
    delay(50);
    digitalWrite(SH_CP,LOW);
    /**
    把SH_CP移位寄存器口,置高50微秒后置低,移位寄存器里的数据移动
    */
    delay(50);
    digitalWrite(ST_CP,HIGH);
    delay(50);
    digitalWrite(ST_CP,LOW);
    /**
    把存储寄存器置高50微秒,移位寄存器的数据放到存储寄存器显示
    */
    delay(1000);
}
for(int i=0;i<5;i++){
    digitalWrite(OE,HIGH);
    delay(1000);
    digitalWrite(OE,LOW);
    /**
    把允许输出改变,使所有口闪烁
    */
    delay(1000);
}
}



各位大神,我发现一个问题,不知道是怎么回事,求教一下:


1、重启模块的时候,芯片 Q0口,也就是15口的这个灯,总是亮的,等到数据移动的时候才能正常亮或者灭

2、在位移过程中,发现只要芯片Q7 口 的数据为1的话,Q7S的接口也亮,而且Q7S的口灯先亮,这个Q7S的灯先亮了过0.1秒这样Q7口才亮

问一下,这个到底怎么回事呢,还有我理解这个74HC595芯片有没有错误???


谢谢,谢谢

林定祥 发表于 2015-2-12 22:12:21

在setup()中先对595“清零”吧。

laofuz1024 发表于 2015-2-17 02:33:05

林定祥 发表于 2015-2-12 22:12 static/image/common/back.gif
在setup()中先对595“清零”吧。

嗯,把位移寄存器清零之后,还要写一次存储寄存器!这要才是真正的清零

现在就是奇怪,为什么Q7s的接口,似乎是Q7的接口先接到数据一样,只要Q7的接口的数据为1,灯要亮的话,Q7s的接口都会在之前先亮,就算我发送的数据只有8位,正好是Q0-Q7有数据而已

smching 发表于 2015-2-27 09:43:50

请参考这里http://ediy.com.my/index.php/2012-10-21-15-15-03/2013-04-14-05-06-50/item/89-arduino通过74hc595扩展io
使用Arduino IDE自带的shiftOut()函数
页: [1]
查看完整版本: 问一个74HC595的问题