You are on page 1of 13

TAREA 2

En este ejemplo, agregará un segundo registro de desplazamiento, duplicando la cantidad de pines


de salida que tiene mientras sigue usando la misma cantidad de pines del Arduino.

El circuito

1. Agregue un segundo registro de desplazamiento.

A partir del ejemplo anterior, debe colocar un segundo registro de desplazamiento en la placa. Debe
tener los mismos cables de alimentación y tierra.

//Pin connected to ST_CP of 74HC595

int latchPin = 8;

//Pin connected to SH_CP of 74HC595


int clockPin = 12;

////Pin connected to DS of 74HC595

int dataPin = 11;

void setup() {

//Start Serial for debuging purposes

Serial.begin(9600);

//set pins to output because they are addressed in the main loop

pinMode(latchPin, OUTPUT);

void loop() {

//count up routine

for (int j = 0; j < 256; j++) {

//ground latchPin and hold low for as long as you are transmitting

digitalWrite(latchPin, 0);

//count up on GREEN LEDs

shiftOut(dataPin, clockPin, j);

//count down on RED LEDs

shiftOut(dataPin, clockPin, 255-j);

//return the latch pin high to signal chip that it

//no longer needs to listen for information

digitalWrite(latchPin, 1);

delay(1000);

void shiftOut(int myDataPin, int myClockPin, byte myDataOut) {

// This shifts 8 bits out MSB first,

//on the rising edge of the clock,

//clock idles low

..//internal function setup

int i=0;

int pinState;

pinMode(myClockPin, OUTPUT);
pinMode(myDataPin, OUTPUT);

. //clear everything out just in case to

. //prepare shift register for bit shifting

digitalWrite(myDataPin, 0);

digitalWrite(myClockPin, 0);

//for each bit in the byte myDataOut&#xFFFD;

//NOTICE THAT WE ARE COUNTING DOWN in our for loop

//This means that %00000001 or "1" will go through such

//that it will be pin Q0 that lights.

for (i=7; i>=0; i--) {

digitalWrite(myClockPin, 0);

//if the value passed to myDataOut and a bitmask result

// true then... so if we are at i=6 and our value is

// %11010100 it would the code compares it to %01000000

// and proceeds to set pinState to 1.

if ( myDataOut & (1<<i) ) {

pinState= 1;

else {

pinState= 0;

//Sets the pin to HIGH or LOW depending on pinState

digitalWrite(myDataPin, pinState);

//register shifts bits on upstroke of clock pin

digitalWrite(myClockPin, 1);

//zero the data pin after shift to prevent bleed through

digitalWrite(myDataPin, 0);

//stop shifting

digitalWrite(myClockPin, 0);

}
2. Conecte los 2 registros.

Dos de estas conexiones simplemente extienden la misma señal de reloj y pestillo desde el Arduino al
segundo registro de desplazamiento (cables amarillo y verde). El cable azul va desde el pin de salida
en serie (pin 9) del primer registro de desplazamiento a la entrada de datos en serie (pin 14) del
segundo registro.

//Pin connected to ST_CP of 74HC595

int latchPin = 8;

//Pin connected to SH_CP of 74HC595

int clockPin = 12;

////Pin connected to DS of 74HC595

int dataPin = 11;

//holder for infromation you're going to pass to shifting function


byte data = 0;

void setup() {

//set pins to output because they are addressed in the main loop

pinMode(latchPin, OUTPUT);

void loop() {

//function that blinks all the LEDs

//gets passed the number of blinks and the pause time

blinkAll_2Bytes(1,500);

// light each pin one by one using a function A

for (int j = 0; j < 8; j++) {

//ground latchPin and hold low for as long as you are transmitting

digitalWrite(latchPin, 0);

//red LEDs

lightShiftPinA(7-j);

//green LEDs

lightShiftPinA(j);

//return the latch pin high to signal chip that it

//no longer needs to listen for information

digitalWrite(latchPin, 1);

delay(1000);

// light each pin one by one using a function A

for (int j = 0; j < 8; j++) {

//ground latchPin and hold low for as long as you are transmitting

digitalWrite(latchPin, 0);

//red LEDs

lightShiftPinB(j);

//green LEDs

lightShiftPinB(7-j);

//return the latch pin high to signal chip that it

//no longer needs to listen for information


digitalWrite(latchPin, 1);

delay(1000);

//This function uses bitwise math to move the pins up

void lightShiftPinA(int p) {

//defines a local variable

int pin;

//this is line uses a bitwise operator

//shifting a bit left using << is the same

//as multiplying the decimal number by two.

pin = 1<< p;

//move 'em out

shiftOut(dataPin, clockPin, pin);

//This function uses that fact that each bit in a byte

//is 2 times greater than the one before it to

//shift the bits higher

void lightShiftPinB(int p) {

//defines a local variable

int pin;

//start with the pin = 1 so that if 0 is passed to this

//function pin 0 will light.

pin = 1;

for (int x = 0; x < p; x++) {

pin = pin * 2;

//move 'em out

shiftOut(dataPin, clockPin, pin);

// the heart of the program

void shiftOut(int myDataPin, int myClockPin, byte myDataOut) {


// This shifts 8 bits out MSB first,

//on the rising edge of the clock,

//clock idles low

//internal function setup

int i=0;

int pinState;

pinMode(myClockPin, OUTPUT);

pinMode(myDataPin, OUTPUT);

//clear everything out just in case to

//prepare shift register for bit shifting

digitalWrite(myDataPin, 0);

digitalWrite(myClockPin, 0);

//for each bit in the byte myDataOut&#xFFFD;

//NOTICE THAT WE ARE COUNTING DOWN in our for loop

//This means that %00000001 or "1" will go through such

//that it will be pin Q0 that lights.

for (i=7; i>=0; i--) {

digitalWrite(myClockPin, 0);

//if the value passed to myDataOut and a bitmask result

// true then... so if we are at i=6 and our value is

// %11010100 it would the code compares it to %01000000

// and proceeds to set pinState to 1.

if ( myDataOut & (1<<i) ) {

pinState= 1;

else {

pinState= 0;

//Sets the pin to HIGH or LOW depending on pinState

digitalWrite(myDataPin, pinState);

//register shifts bits on upstroke of clock pin

digitalWrite(myClockPin, 1);
//zero the data pin after shift to prevent bleed through

digitalWrite(myDataPin, 0);

//stop shifting

digitalWrite(myClockPin, 0);

//blinks both registers based on the number of times you want to

//blink "n" and the pause between them "d"

//starts with a moment of darkness to make sure the first blink

//has its full visual effect.

void blinkAll_2Bytes(int n, int d) {

digitalWrite(latchPin, 0);

shiftOut(dataPin, clockPin, 0);

shiftOut(dataPin, clockPin, 0);

digitalWrite(latchPin, 1);

delay(200);

for (int x = 0; x < n; x++) {

digitalWrite(latchPin, 0);

shiftOut(dataPin, clockPin, 255);

shiftOut(dataPin, clockPin, 255);

digitalWrite(latchPin, 1);

delay(d);

digitalWrite(latchPin, 0);

shiftOut(dataPin, clockPin, 0);

shiftOut(dataPin, clockPin, 0);

digitalWrite(latchPin, 1);

delay(d);

}
3. Agregue un segundo conjunto de LED.

En este caso, agregué los verdes para que al leer el código, quede claro qué byte va a qué conjunto
de LED

//Pin connected to ST_CP of 74HC595

int latchPin = 8;

//Pin connected to SH_CP of 74HC595

int clockPin = 12;

////Pin connected to DS of 74HC595

int dataPin = 11;

//holders for infromation you're going to pass to shifting function

byte dataRED;
byte dataGREEN;

byte dataArrayRED[10];

byte dataArrayGREEN[10];

void setup() {

//set pins to output because they are addressed in the main loop

pinMode(latchPin, OUTPUT);

Serial.begin(9600);

//Arduino doesn't seem to have a way to write binary straight into the code

//so these values are in HEX. Decimal would have been fine, too.

dataArrayRED[0] = 0xFF; //11111111

dataArrayRED[1] = 0xFE; //11111110

dataArrayRED[2] = 0xFC; //11111100

dataArrayRED[3] = 0xF8; //11111000

dataArrayRED[4] = 0xF0; //11110000

dataArrayRED[5] = 0xE0; //11100000

dataArrayRED[6] = 0xC0; //11000000

dataArrayRED[7] = 0x80; //10000000

dataArrayRED[8] = 0x00; //00000000

dataArrayRED[9] = 0xE0; //11100000

//Arduino doesn't seem to have a way to write binary straight into the code

//so these values are in HEX. Decimal would have been fine, too.

dataArrayGREEN[0] = 0xFF; //11111111

dataArrayGREEN[1] = 0x7F; //01111111

dataArrayGREEN[2] = 0x3F; //00111111

dataArrayGREEN[3] = 0x1F; //00011111

dataArrayGREEN[4] = 0x0F; //00001111

dataArrayGREEN[5] = 0x07; //00000111

dataArrayGREEN[6] = 0x03; //00000011

dataArrayGREEN[7] = 0x01; //00000001

dataArrayGREEN[8] = 0x00; //00000000

dataArrayGREEN[9] = 0x07; //00000111

//function that blinks all the LEDs


//gets passed the number of blinks and the pause time

blinkAll_2Bytes(2,500);

void loop() {

for (int j = 0; j < 10; j++) {

//load the light sequence you want from array

dataRED = dataArrayRED[j];

dataGREEN = dataArrayGREEN[j];

//ground latchPin and hold low for as long as you are transmitting

digitalWrite(latchPin, 0);

//move 'em out

shiftOut(dataPin, clockPin, dataGREEN);

shiftOut(dataPin, clockPin, dataRED);

//return the latch pin high to signal chip that it

//no longer needs to listen for information

digitalWrite(latchPin, 1);

delay(300);

// the heart of the program

void shiftOut(int myDataPin, int myClockPin, byte myDataOut) {

// This shifts 8 bits out MSB first,

//on the rising edge of the clock,

//clock idles low

//internal function setup

int i=0;

int pinState;

pinMode(myClockPin, OUTPUT);

pinMode(myDataPin, OUTPUT);

//clear everything out just in case to

//prepare shift register for bit shifting

digitalWrite(myDataPin, 0);
digitalWrite(myClockPin, 0);

//for each bit in the byte myDataOut&#xFFFD;

//NOTICE THAT WE ARE COUNTING DOWN in our for loop

//This means that %00000001 or "1" will go through such

//that it will be pin Q0 that lights.

for (i=7; i>=0; i--) {

digitalWrite(myClockPin, 0);

//if the value passed to myDataOut and a bitmask result

// true then... so if we are at i=6 and our value is

// %11010100 it would the code compares it to %01000000

// and proceeds to set pinState to 1.

if ( myDataOut & (1<<i) ) {

pinState= 1;

else {

pinState= 0;

//Sets the pin to HIGH or LOW depending on pinState

digitalWrite(myDataPin, pinState);

//register shifts bits on upstroke of clock pin

digitalWrite(myClockPin, 1);

//zero the data pin after shift to prevent bleed through

digitalWrite(myDataPin, 0);

//stop shifting

digitalWrite(myClockPin, 0);

//blinks the whole register based on the number of times you want to

//blink "n" and the pause between them "d"

//starts with a moment of darkness to make sure the first blink

//has its full visual effect.

void blinkAll_2Bytes(int n, int d) {


digitalWrite(latchPin, 0);

shiftOut(dataPin, clockPin, 0);

shiftOut(dataPin, clockPin, 0);

digitalWrite(latchPin, 1);

delay(200);

for (int x = 0; x < n; x++) {

digitalWrite(latchPin, 0);

shiftOut(dataPin, clockPin, 255);

shiftOut(dataPin, clockPin, 255);

digitalWrite(latchPin, 1);

delay(d);

digitalWrite(latchPin, 0);

shiftOut(dataPin, clockPin, 0);

shiftOut(dataPin, clockPin, 0);

digitalWrite(latchPin, 1);

delay(d);

You might also like