Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Prácticas de Laboratorio
Experiencia Nº 11
FIGURA 11-1: Arduino MEGA 2560, matrices de LED’s de 8x8 y registros de desplazamiento
74HC595.
11.1 OBJETIVOS
• Conocer y comprender que es la transmisión/recepción serial de datos.
• Conocer y comprender el funcionamiento del registro de desplazamiento de 8 bits, el 74HC595.
• Realizar aplicaciones con el 74HC595.
Herramientas Descripción
(2) Protoboard
162Experiencia Nº 11
Materiales Descripción
(3) 74HC595
o:
pinMode(A1, INPUT);
Por lo tanto, en realidad, disponemos de 20 pines digitales para nuestros propósitos. Pero en la vida
de toda persona, siempre hay un momento en que esto no es suficiente.
Para estos casos, podemos utilizar un Arduino MEGA, Arduino MEGA ADK o Arduino DUE que con
54 pines digitales más 16 entradas analógicas hacen el impresionante número de 70 pines disponibles.
Pero, siempre hay alguien que en un determinado momento ése cantidad de pines disponibles en estos
Arduinos muy grandes, sea insuficiente.
Afortunadamente, existe una forma sencilla de aumentar el número de salidas digitales de nuestros
Arduinos sin demasiada complicación. Para esto, se utilizan unos circuitos integrados llamados Registros de
Desplazamientos (Shift Registers) como el 74HC595.
Programación del registro de desplazamiento de 8 bits 74HC595163
El 74HC595 es un Shift Register que solo sirve para escribir señales digitales y no para leerlas. Pero
si necesitas aumentar entradas, puedes hacer lo siguiente:
• Si lo que necesitas es aumentar los pines digitales de entrada, puedes utilizar el circuito
integrado 74HC165 que es un Shift Register de entrada. Este circuito integrado puede ampliar
hasta 8 entradas digitales.
• Si lo que necesitas es aumentar las entradas analógicas, puedes utilizar un
multiplexor/demultiplexor como el 74HC4051. Este circuito integrado puede ampliar hasta 8
entradas analógicas.
Son muy sencillos de controlar una vez que entiendes cómo funcionan y, son sorprendentemente
útiles en muchas situaciones.
El diagrama de pines (pinout) del circuito integrado 74HC595 se muestra en la figura 11-3. Así
mismo, los pines marcados como Q0 a Q7 son salidas y reflejan el estado interno de cada bit cuando pasa
de estado bajo a alto el pin 12 (ST-CP), los datos ingresan de forma serial por el pin 14 (DS) cada vez que
el pin 11 (SH-CP) pasa de estado bajo a alto (de 0v a 5v, o lo que es lo mismo, un flanco de subida).
Ent. Entradas
Sal. Ser. de Reloj Sal. Ser.
Q0 DS OE STCP SHCP MR
Q1 74HC595 Q7S
Q2 Q3 Q4 Q5 Q6 Q7
1 2 3 4 5 6 7 8
Q1 Q2 Q3 Q4 Q5 Q6 Q7 GND
Salidas
El CI (circuito integrado) 74CH595 es un chip con 8 salidas digitales las cuales vamos a poder
controlar de una manera muy sencilla con solo tres pines de nuestro Arduino, además, se pueden conectar
164Experiencia Nº 11
en cascada varios de ellos, eso sí, la velocidad con la que queramos actuar en una salida determinada, será
más baja, cuantos más integrados usemos.
Q2 2 15 Q0
PIN 8 GND Tierra (Vss).
Etapas:
Entrada Serial 14 DS Q0S Q0 Q0 15
de Datos Q1S Q1 Q1 1
Q2S Q2 Q2 2
Se debe conectar un condensador de 0.1uF (100nF) si se detecta parpadeos cuando se activa el ST-
CP. Se puede cambiar este valor hasta corregirlo el parpadeo.
11.4.2 Programación
Para realizar la programación del registro de desplazamiento se tiene que tener en cuenta lo
siguiente:
• El diagrama de tiempos y,
• La tabla lógica.
Entrada Serial 14 15
DS Q0
de Datos 1
Entrada de reloj del Q1
11 2
registro de SH-CP Q2
desplazamiento 10 3 Salida paralela de
MR Q3 datos del registro de
4 almacenamiento.
Entrada de reloj del +Vcc Q4
12 5 Bit 0 a Bit 7
registro de ST-CP Q5
almacenamiento 6
Q6
7
Q7
13 9
OE Q7S
74HC595 - 1
14 15
DS Q0
1
Q1
11 2
SH-CP Q2
10 3 Salida paralela de
MR Q3 datos del registro de
4 almacenamiento.
+Vcc Q4
12 5 Bit 8 a Bit 15
ST-CP Q5
6
Q6
7
Q7
13 9 Salida Serial
OE Q7S de Datos
74HC595 - 2
11.5.1 ShiftOut()
Envía un byte bit a bit por el pin indicado (dataPin). Este byte se puede enviar empezando por el bit
de mayor peso (MSB, el primero por la izquierda) o el bit de menor peso (LSB, el primero por la derecha).
Una vez que el bit está disponible en el pin, se envía un flanco de subida (transición de un estado BAJO a
ALTO, para el 74HC595) al pin de reloj (clockPin) para capturar el bit y guardarlo en el registro de
desplazamiento.
Se recomienda asegurarse de que el pin de reloj (clockPin) esté en BAJO antes de ejecutar la función
shiftOut(), realizando una llamada a la función digitalWrite(clockPin, LOW).
Sintaxis:
shiftOut(dataPin, clockPin, bitOrder, valor)
Parámetros:
• dataPin: Es el pin que será usado para enviar cada bit de forma serial. Tipo: int.
Programación del registro de desplazamiento de 8 bits 74HC595167
• clockPin: Es el pin usado para enviar los pulsos de reloj para capturar los bits. Tipo: int.
• bitOrder: El orden en que los bits serán emitidos; sea MSBFIRST (Se inicia por el bit de mayor
peso y siguiendo hacia la derecha) o LSBFIRST (Se inicia por el bit de menor peso y siguiendo
hacia la izquierda).
• valor: el octeto que será emitido. Tipo: byte
11.5.2 ShiftIn()
Esta es la función inversa de la anterior (shiftOut()). La función shiftIn() lee un byte bit a bit del pin
de entrada especificado (dataPin). Como en la función anterior (shiftOut()), en esta también podemos
especificar el sentido de lectura (de izquierda a derecha o viceversa). La operación de lectura se realiza de
la siguiente manera: primero se procede a leer el bit y luego se envía un pulso de reloj por el pin
correspondiente (clockPin) para leer el siguiente bit. Recordar que antes se debe cargar los datos en el
registro.
Si estamos comunicando con un dispositivo que funciona con flancos de subida en el reloj (de BAJO
a ALTO), necesitarás asegurarte que el pin de reloj está en baja antes de ejecutar la función shiftIn()
con una llamada a la función digitalWrite(clockPin, LOW).
Sintaxis:
byte leido = shiftIn(dataPin, clockPin, bitOrder)
Parámetros:
• dataPin: Es el pin que será usado para leer cada bit en forma serial. Tipo: int.
• clockPin: Es el pin usado para enviar el pulso de reloj una vez que el dataPin ha leido el bit
correcto. Tipo: int.
• bitOrder: El orden en que los bits serán emitidos; sea MSBFIRST (Se inicia por el bit de mayor
peso y siguiendo hacia la derecha) o LSBFIRST (Se inicia por el bit de menor peso y siguiendo
hacia la izquierda).
14 15
RX0 0 DS Q0
1
TX0 1 Q1
11 2
2 SH-CP Q2
10 3
3 MR Q3
Arduino 4
MEGA 4 +5V Q4
12 5
5 ST-CP Q5
6
6 Q6
7
7 Q7
D8 D7 D6 D5 D4 D3 D2 D1 R
13 9
OE Q7S
R8 = 150 Ω
R7 = 150 Ω
R6 = 150 Ω
R5 = 150 Ω
R4 = 150 Ω
R3 = 150 Ω
R2 = 150 Ω
R1 = 150 Ω
74HC595
Color de los LEDs:
R: Color rojo.
G: Color verde.
B: Color azul.
W: Color blanco.
14 15
RX0 0 DS Q0
1
TX0 1 Q1
11 2
2 SH-CP Q2
10 3
3 MR Q3
Arduino 4
MEGA 4 +5V Q4
12 5
5 ST-CP Q5
6
6 Q6
7
7 Q7
D8 D7 D6 D5 D4 D3 D2 D1 R
13 9
OE Q7S
R8 = 150 Ω
R7 = 150 Ω
R6 = 150 Ω
R5 = 150 Ω
R4 = 150 Ω
R3 = 150 Ω
R2 = 150 Ω
R1 = 150 Ω
74HC595 – 1
Color de los LEDs:
R: Color rojo.
G: Color verde.
B: Color azul.
W: Color blanco.
14 15
DS Q0
1
Q1
11 2
SH-CP Q2
10 3
MR Q3
4
+5V Q4
12 5
ST-CP Q5
6
Q6
7
Q7
D16 D15 D14 D13 D12 D11 D10 D9 B
13 9
OE Q7S
R16 = 100 Ω
R15 = 100 Ω
R14 = 100 Ω
R13 = 100 Ω
R12 = 100 Ω
R11 = 100 Ω
R10 = 100 Ω
R9 = 100 Ω
74HC595 – 2
R2 = 150
14 15 a 7
RX0 0 DS Q0 R3 = 150
1 b 6
TX0 1 Q1
11 2 c 4
2 SH-CP Q2 R4 = 150
10 3 d 2
3 MR Q3
Arduino 4 e 1
MEGA 4 +5V Q4 R5 = 150
12 5 f 9
5 ST-CP Q5
6 g 10
6 Q6 R6 = 150
7 Pd 5
7 Q7
13 9 R7 = 150
3/8
OE Q7S Á
R8 = 150 Display de
74HC595 Cátodo Común
(ROJO)
R8 = 150
H
G
F
E
D
C
B
RX0 0 14 15 A
DS Q0
1
TX0 1 Q1 R1 = 150
11 2 1 2 3 4 5 6 7 8 9 1 1 1 1 1 1 1
2 SH-CP Q2 0 1 2 3 4 5 6
10 3
3 MR Q3
Arduino 4
MEGA 4 +5V Q4
12 5
5 ST-CP Q5
6
6 Q6
7
7 Q7
13 9
OE Q7S
74HC595 – 1
14 15
DS Q0
1
Q1
11 2
SH-CP Q2
10 3
MR Q3
4
+5V Q4
12 5
ST-CP Q5
6
Q6
7
Q7
13 9
OE Q7S
74HC595 – 2
14 15
DS Q0
1
Q1
11 2
SH-CP Q2
10 3
MR Q3
4
+5V Q4
12 5
ST-CP Q5
6
Q6
7
Q7
13 9
OE Q7S
74HC595 – 3
11.6.3 Programando
Primera experiencia:
En esta primera experiencia, vamos a implementar un contador binario de 8 bits utilizando el circuito
integrado 74HC595. Para esto, se tiene que transmitir los datos en forma serial.
255
D8 D7 D6 D5 D4 D3 D2 D1
/*
* EXPERIENCIA 11.1
* Contador binario de ocho bits, de 0 a 255.
*/
void setup()
{
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(latchPin, OUTPUT);
void loop()
{
for(int contador=0; contador<256; contador++)
{
shiftOut(dataPin, clockPin, MSBFIRST, contador); // Se llama a la función shiftOut().
digitalWrite(latchPin, HIGH); // latchPin en ALTO, captura y almacenar los datos.
digitalWrite(latchPin, LOW); // latchPin en BAJO, en espera para almacenar los datos.
delay(500);
}
}
Programación del registro de desplazamiento de 8 bits 74HC595171
Segunda experiencia:
Haciendo uso del “monitor serie”, se va a ingresar por teclado de un número comprendido entre 0 y
255 (8 bits) y lo visualizaremos en binario en un 74HC595.
Por ejemplo:
Se ingresa el número
8 por teclado y luego
se presiona la tecla
ENTER, .
/*
* EXPERIENCIA 11.2
* Ingreso por teclado de un número decimal entre 0 y 255.
*/
void setup()
{
Serial.begin(9600);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(latchPin, OUTPUT);
digitalWrite(latchPin, LOW); // latchPin en BAJO, en espera para almacenar los datos.
shiftOut(dataPin, clockPin, MSBFIRST, 0); // Se limpia el registro, se carga con CEROS.
digitalWrite(latchPin, HIGH); // latchPin en ALTO, captura y almacenar los datos.
digitalWrite(latchPin, LOW); // latchPin en BAJO, en espera para almacenar los datos.
}
void loop()
{
if(Serial.available()>0) // Se pregunta si existen caracteres.
{
delay(5); // Tiempo para cargar los caracteres.
dato = "0";
while(Serial.available()>0)
{
char c = Serial.read();
if((c!='\r') && (c!='\n')) dato += c; // Filtramos CR y LF. Concatenamos los caracteres.
delay(10);
}
numero = dato.toInt(); // Convertimos la cadena de caracteres en un entero.
shiftOut(dataPin, clockPin, MSBFIRST, numero); // Se llama a la función shiftOut().
digitalWrite(latchPin, HIGH); // latchPin en ALTO, captura y almacenar los datos.
digitalWrite(latchPin, LOW); // latchPin en BAJO, en espera para almacenar los datos.
}
}
Tercera experiencia:
Desplazamiento binario de 8 bits utilizando un 74HC595 y visualizado en 8 LEDs.
/*
* EXPERIENCIA 11.3
* Desplazamiento binario de 8 bits con el 74HC595.
*/
void setup()
{
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(latchPin, OUTPUT);
digitalWrite(latchPin, LOW); // latchPin en BAJO, en espera para almacenar los datos.
shiftOut(dataPin, clockPin, MSBFIRST, 0); // Se limpia el registro, se carga con CEROS.
digitalWrite(latchPin, HIGH); // latchPin en ALTO, captura y almacenar los datos.
digitalWrite(latchPin, LOW); // latchPin en BAJO, en espera para almacenar los datos.
}
void loop()
{
for(int columna=0; columna<=7; columna++)
{
if (columna==0) digitalWrite(dataPin,HIGH);
else digitalWrite(dataPin,LOW);
digitalWrite(clockPin,HIGH); // clockPin en ALTO, desplaza el bit al siguiente estado.
digitalWrite(clockPin,LOW); // clockPin en BAJO, en espera para desplazar el bit.
digitalWrite(latchPin, HIGH); // latchPin en ALTO, captura y almacenar los datos.
digitalWrite(latchPin, LOW); // latchPin en BAJO, en espera para almacenar los datos.
delay(500);
}
}
D8 D7 D6 D5 D4 D3 D2 D1
10
15
20
25
30
35
40
45
50
55
60
1
5
F G H I J
F G H I J
8 G E
1 R8 R7 R6 R5 R4 R3 R2 R1 7 1
8 G E
7 1 6
74HC595
A B C D E
A B C D E
2 4 6 8
3 5 7 8 7 6 5 4 3 2 1
10
15
20
25
30
35
40
45
50
55
60
1
10
15
20
25
30
35
40
45
50
55
60
1
5
F G H I J
F G H I J
A B C D E
A B C D E
10
15
20
25
30
35
40
45
50
55
60
1
Cuarta experiencia:
Desplazamiento binario de 16 bits utilizando dos 74HC595 (conexión en cascada).
/*
* EXPERIENCIA 11.4
* Desplazamiento binario de 16 bits con conexión en cascada de dos 74HC595.
*/
const int dataPin = 2; // dataPin se conecta al pin 14 (DS) del 74HC595.
const int clockPin = 3; // clockPin se conecta al pin 11 (SH-CP) del 74HC595.
const int latchPin = 4; // latchPin se conecta al pin 12 (ST-CP) del 74HC595.
void setup()
{
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(latchPin, OUTPUT);
digitalWrite(latchPin, LOW); // latchPin en BAJO, en espera para almacenar los datos.
shiftOut(dataPin, clockPin, MSBFIRST, 0); // Se limpia el registro 1, se carga con CEROS.
shiftOut(dataPin, clockPin, MSBFIRST, 0); // Se limpia el registro 2, se carga con CEROS.
digitalWrite(latchPin, HIGH); // latchPin en ALTO, captura y almacenar los datos.
digitalWrite(latchPin, LOW); // latchPin en BAJO, en espera para almacenar los datos.
}
void loop()
{
for(int columna=0; columna<=15; columna++)
{
if (columna==0) digitalWrite(dataPin,HIGH);
else digitalWrite(dataPin,LOW);
digitalWrite(clockPin,HIGH); // clockPin en ALTO, desplaza el bit al siguiente estado.
digitalWrite(clockPin,LOW); // clockPin en BAJO, en espera para desplazar el bit.
digitalWrite(latchPin, HIGH); // latchPin en ALTO, captura y almacenar los datos.
digitalWrite(latchPin, LOW); // latchPin en BAJO, en espera para almacenar los datos.
delay(500);
}
}
15
20
25
30
35
40
45
50
55
60
1
1 1 a c
F G H I J
F G H I J
b 8 G E
R8 R7 R6 R5 R4 R3 R2 R1 7 1
8 G E
7 1 6
74HC595 - 2 R16 R9 74HC595 - 1
A B C D E
A B C D E
2 4 6 8 2 4 6 8
3 5 7 8 7 6 5 4 3 2 1 3 5 7 8 7 6 5 4 3 2 1
10
15
20
25
30
35
40
45
50
55
60
1
cb a
10
15
20
25
30
35
40
45
50
55
60
1
5
F G H I J
F G H I J
A B C D E
A B C D E
10
15
20
25
30
35
40
45
50
55
60
1
Quinta experiencia:
Se mostraran los números hexadecimales en un visualizador de 7 segmentos con el 74HC595.
f b
g
e c
d
P.d.
P.d.
/*
* EXPERIENCIA 11.5
* Visualizador de 7 segmentos con el 74HC595.
*/
void setup()
{
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(latchPin, OUTPUT);
void loop()
{
for(int i=0; i<=16; i++)
{
shiftOut(dataPin, clockPin, LSBFIRST, numeros[i]);
digitalWrite(latchPin, HIGH); // latchPin en ALTO, captura y almacenar los datos.
digitalWrite(latchPin, LOW); // latchPin en BAJO, en espera para almacenar los datos.
delay(1000);
}
}
El montaje para esta aplicación es el que corresponde al circuito de la figura 11-9 y, se presenta a
continuación:
10
15
20
25
30
35
40
45
50
55
60
1
f b
F G H I J
F G H I J
2 4 6 8 g a
1 1 3 5 7
74HC595 R1 R8
A B C D E
A B C D E
2 4 6 8 a g
3 5 7 b f
10
15
20
25
30
35
40
45
50
55
60
1
Pd
e
d
10
15
20
25
30
35
40
45
50
55
60
1
c
F G H I J
F G H I J
A B C D E
A B C D E
10
15
20
25
30
35
40
45
50
55
60
1
Sexta experiencia:
Visualizar un mensaje en una matriz de 8x16 utilizando circuitos integrados 74HC595.
El código es el siguiente:
/*
* EXPERIENCIA 11.6
* Visualización de mensajes en una matriz de 8x16 con CIs 74HC595.
*/
const int dataPin1 = 2; // dataPin1 se conecta al pin 14 (DS) del primer 74HC595.
const int clockPin1 = 3; // clockPin1 se conecta al pin 11 (SH-CP) del primer 74HC595.
const int latchPin1 = 4; // latchPin1 se conecta al pin 12 (ST-CP) del primer 74HC595.
const int dataPin2 = 5; // dataPin2 se conecta al pin 14 (DS) del segundo 74HC595.
const int clockPin2 = 6; // clockPin2 se conecta al pin 11 (SH-CP) del segundo 74HC595.
const int latchPin2 = 7; // latchPin2 se conecta al pin 12 (ST-CP) del segundo 74HC595.
void construyeMatriz()
{
for(int c=0; c<=15; c++)
{
caracter[cant] = 0;
cant++;
}
for(int cc=0; cc<mensaje.length(); cc++) // "cc" contador de caracteres.
{
switch(mensaje[cc])
{
case '0': {for(int c=1; c<=cero[0]; c++){caracter[cant]=cero[c]; cant++;} break;}
case '1': {for(int c=1; // Continuar con los demás.
}
}
fin = cant-1;
for(int c=0; c<=14; c++)
{
caracter[cant] = 0;
cant++;
}
}
void desplazaPantalla()
{
for(int d=0; d<=fin; d++)
{
for(int r=0; r<=9; r++)
{
for(int columna=(0+d); columna<=(15+d); columna++)
{
shiftOut(dataPin1, clockPin1, MSBFIRST, 0);
digitalWrite(latchPin1, HIGH);
digitalWrite(latchPin1, LOW);
if((columna-d)==0) digitalWrite(dataPin2,LOW);
else digitalWrite(dataPin2,HIGH);
digitalWrite(clockPin2,HIGH);
digitalWrite(clockPin2,LOW);
digitalWrite(latchPin2,HIGH);
digitalWrite(latchPin2,LOW);
shiftOut(dataPin1, clockPin1, MSBFIRST, caracter[columna]);
digitalWrite(latchPin1, HIGH);
digitalWrite(latchPin1, LOW);
delayMicroseconds(200);
}
}
}
}
Programación del registro de desplazamiento de 8 bits 74HC595177
void setup()
{
pinMode(dataPin1, OUTPUT);
pinMode(clockPin1, OUTPUT);
pinMode(latchPin1, OUTPUT);
pinMode(dataPin2, OUTPUT);
pinMode(clockPin2, OUTPUT);
pinMode(latchPin2, OUTPUT);
digitalWrite(latchPin1, LOW); // latchPin en BAJO, en espera para almacenar los datos.
shiftOut(dataPin1, clockPin1, MSBFIRST, 0); // Se limpia el registro, se carga con CEROS.
digitalWrite(latchPin1, HIGH); // latchPin en ALTO, captura y almacenar los datos.
digitalWrite(latchPin1, LOW); // latchPin en BAJO, en espera para almacenar los datos.
construyeMatriz();
}
void loop()
{
desplazaPantalla();
}
El montaje para esta aplicación es el que corresponde al circuito de la figura 11-10 y, se presenta a
continuación:
10
15
20
25
30
35
40
45
50
55
60
1
8 G E 4 8 G E 4
F G H I J
F G H I J
G E C A 7 1 6 H 7 1 6 H
H F D B
R8 R1
A B C D E
A B C D E
7 5 3 1
8 6 4 2
10
15
20
25
30
35
40
45
50
55
60
1
10
15
20
25
30
35
40
45
50
55
60
1
5
F G H I J
F G H I J
1 c
a b
74HC595 – 1
A B C D E
A B C D E
B 3 5 F B 3 5 F
2 4 6 8 D 2 A C D 2 A C
3 5 7
10
15
20
25
30
35
40
45
50
55
60
1
f e dcb a
10
15
20
25
30
35
40
45
50
55
60
1
1
F G H I J
F G H I J
1 f
d e
74HC595 – 2 74HC595 – 3
A B C D E
A B C D E
2 4 6 8 2 4 6 8
3 5 7 3 5 7
10
15
20
25
30
35
40
45
50
55
60
1
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
Experiencia N ° 11