本帖最后由 lanxix 于 2012-9-17 03:31 编辑
首先,先把单个74HC595连好,并且能正常工作,关于单个连接请参考这个 http://www.geek-workshop.com/thread-203-1-1.html
然后级联 把第一块的Q7'连接到第二块的DS,然后第一块的Pin_ST_CP并联到第二块的Pin_ST_CP,第一块的Pin_SH_CP并联到第二块的Pin_SH_CP
借别人的图
以下是我的arduino的程序部分
const byte Pin_ST_CP=8;
const byte Pin_DS=9;
const byte Pin_SH_CP=10;
void setup()
{
Serial.begin(9600);
pinMode(Pin_ST_CP,OUTPUT);//ST_CP
pinMode(Pin_DS,OUTPUT);//DS
pinMode(Pin_SH_CP,OUTPUT);//SH_CP
digitalWrite(Pin_ST_CP,LOW);
}
void loop()
{
if(Serial.available())
{
char Buff[2];
Serial.readBytes(Buff,sizeof(Buff));
//Buff[0]=Serial.read();
//Buff[1]=Serial.read();
Serial.print((byte) Buff[0]);
Serial.print(",");
Serial.print((byte) Buff[1]);
Serial.println();
digitalWrite(Pin_ST_CP,LOW);
//MSBFIRST,从高到底传输二进制位,74HC595会从第一块开始,从Q0一直位移数据到Q7,如果还有数据,则继续把压到第二块的Q0到Q7
//这里发的是第二块的数据
shiftOut(Pin_DS, Pin_SH_CP, MSBFIRST ,(byte) Buff[0]) ;
//MSBFIRST的方式,这里才是第一块的数据
shiftOut(Pin_DS, Pin_SH_CP, MSBFIRST ,(byte) Buff[1]) ;
digitalWrite(Pin_ST_CP,HIGH);
}
}
为了方便测试,我的程序使用sscom32的十六进制的输入,如图
所以,如果你使用自带的串口编辑器,它发送的不是十六进制,而是字符串,产生的结果可能会与你设想的不一样
这里有必要说明一下程序,特别是发送时高低位的区别MSBFIRST 和 LSBFIRST 的区别
74HC595的接收:当SH_CP上升沿时移位寄存器中的数据依次移动一位,即Q0中的数据移到Q1中,Q1中的数据移到Q2中,依次类推;下降沿时移位寄存器中的数据保持不变
就如下表,我们发送十进制的2,二进制是00000010
MSBFIRST
00000010
01000000
12345678 -->对应595的Q0~Q7
高位先发送,对应Q0~Q7是倒序关系
LSBFIRST
00000010
00000010
12345678 -->对应595的Q0~Q7
低位先发送,对应Q0~Q7是顺序关系
74HC595的级联,数据也是先从第一块开始,一直迁移到第二块,就像往杯子倒水一样,最前面的水向下倒
OK,就到这里,可能写得不太好,希望大家能看懂 |