Está en la página 1de 18

ARQUITECTURA DE COMPUTADORAS

Prácticas de Laboratorio

Experiencia Nº 11

11 PROGRAMACIÓN DEL REGISTRO DE


DESPLAZAMIENTO DE 8 BITS 74HC595

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.

11.2 LISTA DE HERRAMIENTAS Y MATERIALES

Herramientas y Materiales para el desarrollo de la experiencia

Herramientas Descripción

(1) Multímetro FLUKE 28 II

(1) Arduino Mega 2560

(2) Protoboard
162Experiencia Nº 11

Materiales Descripción

Cables con terminales Macho – Macho en sus extremos (Jumpers)

(8) Resistencia de 150 Ω. (si la Matriz de LED’s de 8x8 es de iluminación ROJO)


(8) Resistencia de 100 Ω. (si la Matriz de LED’s de 8x8 es de iluminación VERDE
o AZUL)

(8) LED de color Rojo brillante de 5mm.


(8) LED de color Azul brillante de 5mm.

(3) 74HC595

TABLA 11-1: Lista de Herramientas y Materiales.

11.3 EL PROBLEMA DEL NÚMERO DE PINES DE SALIDA


Sabemos que la mayoría de Arduinos como: Arduino DUEMILANOVE, Arduino UNO, Arduino NANO,
Arduino ZERO, entre otros, disponen de sólo 14 pines digitales que podríamos usar como entradas o
salidas y que además disponemos de 6 pines de entrada analógicas de A0 hasta A5 (y de A0 hasta A7, en
otros, como el Arduino NANO). Lo que no suele ser muy conocido es que las entradas analógicas también
se pueden usar como pines digitales (entrada o salida) en caso sea necesario. Podemos leer y escribir
valores digitales exactamente como lo hacemos con los pines digitales normales. Por ejemplo:
pinMode(A1, OUTPUT);

Y después escribir tranquilamente:


digitalWrite(A1, HIGH);

o:
pinMode(A1, INPUT);

Y después leer tranquilamente:


int X = digitalRead(A1);

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 74HC595163

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.

11.4 EL REGISTRO DE DESPLAZAMIENTO 74HC595


El circuito integrado 74HC595 es un registro de desplazamiento (Shift Register en inglés) de 8 bits
de entrada serial y salida paralela. Además, cuenta con una salida serial para realizar la interconexión con
más registros de desplazamiento, en el caso que deseemos implementar un registro mayor de 8 bits.

FIGURA 11-2: Registro de desplazamiento 74HC595.

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.

Vcc Q0 DS OE ST-CP SH-CP MR Q7S


16 15 14 13 12 11 10 9

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

FIGURA 11-3: Diagrama de pines del registro de desplazamiento de 8 bits, 74HC595.

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
164Experiencia 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.

CIRCUITO INTEGRADO PINES NOMBRE DETALLE

PINS 1 – 7 y 15 Q0, Q1, Q2, …Q7 Pines de salida paralela de 8 bits.


Q1 1 16 Vcc

Q2 2 15 Q0
PIN 8 GND Tierra (Vss).

PIN 9 Q7S Salida Serial de datos.


Q3 3 14 DS

PIN 10 MR Master Reset, activo en LOW


Q4 4 13 OE
Entrada de reloj del registro de
PIN 11 SH-CP
Q5 5 12 ST-CP desplazamiento (Shift).
Entrada de reloj del registro de
PIN 12 ST-CP
Q6 6 11 SH-CP almacenamiento (Storage).
PIN 13 OE Habilitación de CI, activo en LOW
Q7 7 10 MR
PIN 14 DS Entrada Serial de datos.
GND 8 9 Q7S
PIN 16 Vcc Voltaje de alimentación eléctrica.

TABLA 11-2: Descripción de los pines del CI 74HC595.

El circuito integrado 74HC595, utiliza tres registros en su interior, el primero es un registro de


desplazamiento (como el registro 74HC164), luego, para capturar los bit ingresados en el registro de
desplazamiento, se utiliza un registro de almacenamiento (como el registro 74HC374 o 74HC574) y,
finalmente, para entregar los datos capturados hacia el exterior, se utiliza un registro buffer (como el registro
74HC245).

Etapas:
Entrada Serial 14 DS Q0S Q0 Q0 15
de Datos Q1S Q1 Q1 1
Q2S Q2 Q2 2

Registro de Q3S Registro de Q3 Registro Q3 3 Salida


desplazamiento Q4S almacenamiento Q4 triestado de Q4 4 paralela
Entrada de reloj del de 8 bits de 8 bits 8bits de datos
11 SH-CP Q5S Q5 Q5 5
registro de
desplazamiento Q6S Q6 Q6 6
10 MR Q7S Q7 Q7 7
Restaurar

Entrada de reloj del


12 ST-CP
registro de
almacenamiento
Habilitación de 13 OE
salidas Q7S 9 Salida Serial
de Datos

FIGURA 11-4: Diagrama funcional del registro de desplazamiento 74HC595.

11.4.1 Configuración básica del 74HC595


Para configurar y tener un buen funcionamiento del CI 74HC595 y una buena conexión con el Arduino
se deben realizar las siguientes conexiones:
• Conectar GND (pin 8) a tierra (0V)
• Conectar Vcc (pin 16) a +5V.
• Conectar OE (pin 13) a tierra (0V)
• Conectar MR (pin 10) a +5V
• Conectar DS (pin 14) a uno de los pines digitales de Arduino (dataPin)
• Conectar SH-CP (pin 11) a uno de los pines digitales de Arduino (shiftPin)
• Conectar ST-CP (pin 12) a uno de los pines digitales de Arduino (storagePin)
Programación del registro de desplazamiento de 8 bits 74HC595165

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.

FIGURA 11-5: Diagrama de tiempos del CI 74HC595.

CONTROLES ENT. SALIDAS


FUNCIÓN
SH-CP ST-CP ̅̅̅̅̅
OE ̅̅̅̅̅
MR DS Q7S Qn
Un nivel BAJO en la entrada ̅̅̅̅̅
MR solo afecta al registro de
X X L L X L NC
desplazamiento.
Registro de desplazamiento vacío cargado en el registro de
X ↑ L L X L L
almacenamiento.
Registro de desplazamiento borrado; salidas paralelas en
X X H L X L Z
alta impedancia OFF-state.
Nivel lógico ALTO desplazado hacia la etapa 0 del registro
desplazamiento. El contenido de todas las etapas de
registro de desplazamiento se desplazan a la siguiente
↑ X L H H Q6S NC
etapa. Por ejemplo, el estado de la etapa 6 (Q6 interno)
ahora aparece en la
salida serial (Q7S)
El contenido de las etapas de registro de desplazamiento
X ↑ L H X NC QnS (Qn interno) es transferido al registro de almacenamiento y
a las etapas de salida en paralelas.
El contenido del registro de desplazamiento desplazan a
través del mismo; el contenido previo del registro de
↑ ↑ L H X Q6S QnS desplazamiento se transfiere al registro de almacenamiento
y las etapas de salida paralelas. Ambos registros se activan
a la vez.
H = Nivel de voltaje ALTO. X = No importa.
L = Nivel de voltaje BAJO. NC = Sin cambios.
↑ = Transición BAJO a ALTO (Flanco de subida). Z = ALTA impedancia OFF-state.
↓ = Transición ALTO a BAJO (Flanco de bajada).
TABLA 11-3: Descripción funcional del CI 74HC595.
166Experiencia Nº 11

11.4.3 Conexión en cascada de dos o más CI 74HC595


También se puede enlazar un segundo (o más) circuito integrado 74HC595 de modo que ampliamos
la cantidad de bits de salida. Para ello, debemos conectar la salida Q7S del primer 74HC595 a la entrada
DS del segundo 74HC595. Así como también, las entradas DS, SH-CP y ST-CP de cada 74HC595 se unen
entre sí, respectivamente, quedando únicamente tres únicas entradas para realizar la programación, y de
esta manera, tendremos un registro de desplazamiento de 16 bits.

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

FIGURA 11-6: conexión correcta entre dos registros de desplazamiento 74HC595.

11.5 LAS FUNCIONES SHIFTOUT() Y SHIFTIN()


Estas funciones se utilizan para realizar envíos y recepción de datos de forma serial. A continuación
se describe cada uno de ellas:

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 74HC595167

• 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

Esta función no devuelve nada.


Los pines dataPin y clockPin deben de ser configurados como salidas antes de ejecutar la función
shiftOut().
La función shiftOut() puede emitir solamente un byte (octeto = 8 bits) cada vez que es ejecutada,
por lo tanto se necesitan dos iteraciones para emitir valores mayores que 255.

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).

Esta función no devuelve nada.

11.6 PRÁCTICA DE LABORATORIO


Para desarrollar esta novena práctica de laboratorio, realizaremos los siguientes pasos:
• ¿Qué se va a hacer?
• Diseñando el circuito para nuestro laboratorio.
• Programando.

11.6.1 ¿Qué se va a hacer?


En éste práctica de laboratorio, se realizará las siguientes aplicaciones:
• Contador binario de 8 bits con el 74HC595.
• Ingreso por teclado de un número comprendido entre 0 y 255 (8 bits) y visualizado en binario
en un 74HC595.
168Experiencia Nº 11

• Desplazamiento binario de 8 bits con el 74HC595.


• Desplazamiento binario de 16 bits con dos 74HC595 (conexión en cascada).
• Se mostraran los números hexadecimales en un visualizador de 7 segmentos con el 74HC595.
• Visualizar un mensaje en una matriz de 8x16 con el 74HC595.

11.6.2 Diseñando el circuito para nuestro laboratorio.


Para realizar las tres primeras experiencias, se ha diseñado el siguiente circuito:

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.

FIGURA 11-7: Circuito para las tres primeras experiencias.

La cuarta experiencia utiliza dos 74HC595 conectados en cascada

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

FIGURA 11-8: Circuito para la cuarta experiencia.


Programación del registro de desplazamiento de 8 bits 74HC595169

En la quinta experiencia, mostraremos en un visualizador de 7 segmentos los números


hexadecimales, del 0 al F y el punto. Para esto, se ha diseñado el siguiente circuito:
R1 = 150 

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)

FIGURA 11-9: Circuito para la quinta experiencia.

Finalmente, en la sexta experiencia, realizaremos la visualización de mensajes en un panel de 8x16


LEDs utilizando circuitos integrados 74HC595.

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

FIGURA 11-10: Circuito para la sexta experiencia.


170Experiencia Nº 11

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

Continúa la cuenta hasta 255.

D8 D7 D6 D5 D4 D3 D2 D1

FIGURA 11-11: contador binario de 8 bits.

El código para realizar esto, es el siguiente:

/*
* EXPERIENCIA 11.1
* Contador binario de ocho bits, de 0 a 255.
*/

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, 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 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 74HC595171

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, .

FIGURA 11-12: Ingreso por teclado del número 8.

/*
* EXPERIENCIA 11.2
* Ingreso por teclado de un número decimal entre 0 y 255.
*/

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.
String dato;
int numero;

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.
}
}

En informática, CRLF se refiere a la combinación de dos códigos de control: CR (retorno de carro) y


LF (salto de línea), uno detrás del otro; normalmente con el objetivo de crear una nueva línea.
CRLF tiene la siguiente codificación en hexadecimal 0D 0A, o 13 10 en decimal.
172Experiencia Nº 11

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.
*/

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, 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

FIGURA 11-13: Montaje para las tres primeras experiencias.


Programación del registro de desplazamiento de 8 bits 74HC595173

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);
}
}

D16 D15 D14 D13 D12 D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1


10

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

FIGURA 11-14: Montaje para la cuarta experiencia.


174Experiencia Nº 11

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.

FIGURA 11-15: Los números hexadecimales.

El código para esta aplicación se muestra a continuación:

/*
* EXPERIENCIA 11.5
* Visualizador de 7 segmentos con el 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.
int i =0;
const byte numeros[17] = {
0b11111100, // Código binario para el número 0.
0b01100000, // Código binario para el número 1.
0b11011010, // Código binario para el número 2.
0b11110010, // Código binario para el número 3.
0b01100110, // Código binario para el número 4.
0b10110110, // Código binario para el número 5.
0b10111110, // Código binario para el número 6.
0b11100000, // Código binario para el número 7.
0b11111110, // Código binario para el número 8.
0b11110110, // Código binario para el número 9.
0b11101110, // Código binario para la A.
0b00111110, // Código binario para la B.
0b10011100, // Código binario para la C.
0b01111010, // Código binario para la D.
0b10011110, // Código binario para la E.
0b10001110, // Código binario para la F.
0b00000001 // Código binario para el Pd.
};

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.
}
Programación del registro de desplazamiento de 8 bits 74HC595175

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

FIGURA 11-16: Montaje para la quinta experiencia.


176Experiencia Nº 11

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.

String mensaje = "BCD University";


byte caracter[1000]; // Se declara el arreglo "caracter" de tamaño 1000.
int cant = 0; // "cant" es el contador de columnas.
int fin;

// Se construyen los BitMaps para todos los caracteres: Números y Abecedario.


int cero[]={6,126,129,129,129,126,0}; // BitMap para el 0.
int z[]={6,51,37,41,49,35,0}; // BitMap para la “z”. Continuar con los demás.

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 74HC595177

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

FIGURA 11-17: Montaje para la sexta experiencia.


178Experiencia Nº 11

11.7 ANOTACIONES IMPORTANTES

_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________

Experiencia N ° 11

PROGRAMACIÓN DEL REGISTRO DE DESPLAZAMIENTO DE 8 BITS 74HC595

También podría gustarte