74HC164 SHIFT REGISTER FUNCIONAMIENTO Y APLICACIONES

Que tal amigos, en este nuevo post llamado “74HC164 SHIFT REGISTER FUNCIONAMIENTO Y APLICACIONES” trataremos de explicar de una manera muy practica como opera este pequeño, pero muy útil y versátil componente.

Existe información de sobra en internet acerca de las características técnicas de este pequeño amiguito y no es nuestra intención entrar en detalles en este aspecto. Solo vamos a mencionar una lista de sus principales características:

74HC164 principales características técnicas:

A continuación una lista de sus principales características:

  • Registro de desplazamiento de 8 bits, cada bit almacenado en un flip-flop tipo D maestro/esclavo
  • Entrada serial, salida paralela
  • Fan out: 10 cargas LS-TTL
  • Dos entradas de datos con función AND. Un nivel bajo en cualquiera inhibe la entrada de nuevos datos y resetea a nivel bajo el primer flip-flop en el próximo pulso de reloj. Un nivel alto en cualquier entrada habilita la otra entrada, lo que determina el estado del primer flip-flop
  • Entrada de reloj con activación por flanco de subida
  • Entrada de clear asincrónica
  • Entradas de datos y de reloj con buffer
  • Tecnología: High Speed CMOS (HC)
  • Muy bajo consumo de potencia, similar a los C.I. CMOS estándar
  • Consumo de corriente bajo: 80 μA max.
  • Velocidades similares a la familia LS-TTL
  • Tiempo de propagación: 20 ns típico
  • Voltaje de alimentación: 2 V a 6 V

Modo de operación del 74HC164.

El modo de operación del registro 74hc164 es muy sencillo recibe datos en serie, es decir uno detrás de otro (INPUT) y luego los muestra en paralelo, es decir todos al mismo tiempo (OUTPUT).

Esta característica lo convierte en un dispositivo muy versátil especialmente para aplicaciones de multiplexado.

Para poder hacer funcionar este registro de 8 bits necesitamos tener pleno control de las siguientes patas:

RESET PIN 9, Para que nuestro registro se encuentre listo para operar debemos colocar este pin en estado ALTO 1 y si queremos que toda la salida de datos se borre deberemos colocar el pin estado BAJO 0.

DATA : PIN 1 Y PIN 2, Estos 2 pines son una entrada AND de datos, por aquí se recibe la cadena de BITS que se desea mostraran en la salida. Ambos pines pueden unirse.

CLOCK : PIN 8, El pin de CLOCK del registro, al recibir un pulso ALTO libera el BIT que se encuentra haciendo cola en el pin de DATA. luego debe colocarse en estado bajo nuevamente para estar listo para liberar un siguiente BIT.

A continuación veremos como opera este registro en 3 distintas aplicaciones empezando desde una muy básica hasta una que opera un efecto de movimiento y desplazamiento (SCROLLING).

Para lograr operar con éxito nuestro registro 74HC164 utilizaremos nuestro viejo aliado, el PIC 16f628.

74HC164 Y PIC 16F628 APLICACION BASICA EFECTO LED.

Para calentar, con la ayuda de un PIC 16F628 y nuestro simulador PROTEUS vamos a crear una pequeña aplicación, que consiste en un efecto LED de posición intercalada.

La idea de esta sencilla aplicación es que te puedas dar cuenta lo fácil que puede ser controlar este pequeño pero versátil amiguito.

Veamos el código de nuestro programa:

#include "16f628.h"
#FUSES NOWDT      // Es un fuse que resetea el pic si este se cuelga.
#FUSES NOPROTECT  // Permite o bloque lectura del pic con un  programador
#FUSES NOLVP      // Anula pin de programación RB4 y lo deja como I/O
#FUSES NOMCLR     // NOMCLR = PIN RA5 Input. MCLR=PIN RA5 como reset   
#FUSES INTRC_IO   // HABILITA el OSCILADOR INTERNO 
#USE DELAY(clock = 4000000, INTERNAL) // COMPLEMENTA EL FUSE INTRC_IO

// La función PULSO controla la salida de BITs de Datos con un flanco de subida.
void pulso(void)
{
RA1=1; //CON EL FLANCO DE SUBIDA DEL PULSO SE LIBERA EL DATO
RA1=0; //CON EL FLANCO DE BAJADA SE RECIBE EL SIGUIENTE DATO 
}

void main()
{ 
TRISA=0;              // se configura toto el Puerto A como salida  
TRISB=0;              // se configura toto el Puerto B como salida
PORTA=0x00;           // Se limpia todo el puerto A
PORTB=0X00;           // Se limpia todo el puerto B         
delay_us(5);          // Esperamos un ratito que el PIC se estabilice

RA0=1;                // Primero que nada colocar en alto al PIN de reset del 74HC164 si no nada funciona

while (1){

         RA1=0;             // Se inicializa el pin del CLOCK   
         RA2=1;             // Se coloca BIT 1 en los pines de DATA
         pulso ();          // La función PULSO libera el BIT de DATA
         DELAY_MS(200);     // Se hace un delay de 200 milisegundos
         RA2=0;             // Se coloca BIT 0 en los pines de DATA
         pulso ();          // La función Pulso libera el BIT de DATA
         DELAY_MS(200);     // Se Se hace un delay de 200 milisegundos
          
}}

Este seria el resultado:

74HC164 Y PIC 16F628 CONTROLANDO DISPLAY DE 7 SEGMENTOS

A continuación veremos como nuestro registro de desplazamiento es capaz de controlar sin problemas un display de 7 segmentos en una aplicación que muestra el mensaje HOLA.

Nuevamente utilizamos nuestro PIC16f628 para manejar nuestro registro.

Para mostrar el mensaje HOLA hacemos uso de un arreglo tipo CHAR de nombre “Mensaje”

Si te fijas nuevamente utilizamos nuestra función PULSO la cual nos ayuda a desplazar el BIT que activa cada uno de los segmentos de DISPLAY.

Veamos el código de nuestro programa:

#include "16f628.h"
#FUSES NOWDT      // Es un fuse que resetea el pic si este se cuelga.
#FUSES NOPROTECT  // Permite o bloque lectura del pic con un  programador
#FUSES NOLVP      // Anula pin de programacion RB4 y lo deja como I/O
#FUSES NOMCLR     // NOMCLR = PIN RA5 Input. MCLR=PIN RA5 como reset   
#FUSES INTRC_IO   // HABILITA el OSCILADOR INTERNO 
#USE DELAY(clock = 4000000, INTERNAL) // COMPLEMENTA EL FUSE INTRC_IO

// Arreglo que almacena el mensaje HOLA un numeros binarios
CHAR Mensaje [4]= 0B00001001,0B01000000,0B01000111,0B00001000;

// variable entere del ciclo FOR
int i;

// La funcion PULSO controla la salida de BITs de Datos con un flanco de subida.
void pulso(void)
{
RA1=1; //CON EL FLANCO DE SUBIDA DEL PULSO SE LIBERA EL DATO
RA1=0; //CON EL FLANCO DE BAJADA SE RECIBE EL SIGUIENTE DATO 
}

void main()
{ 
TRISA=0;              // se configura toto el Puerto A como salida  
TRISB=0;              // se configura toto el Puerto B como salida
PORTA=0x00;           // Se limpia todo el puerto A
PORTB=0X00;           // Se limpia todo el puerto B         
delay_us(5);          // Esperamos un ratito que el PIC se estabilice

RA0=1;                // Primero que nada colocar en alto al PIN de reset del 74HC164 si no nada funciona

 
while (1){
         
         RA1=0;             // Se inicializa el pin del CLOCK
         RA2=1;             // Se coloca BIT 1 en los pines de DATA
         pulso ();          // La funcion PULSO libera el BIT de DATA ACTIVA COL1
         RA2=0;             // Se coloca BIT 0 en el pin DATA
       
       // ciclo FOR que activa cada uno de los 4 elementos del DISPLAY 
       FOR (i=0;i<4;i++)
       {
       portb=Mensaje[i];    // Muestra la letra correspondiente del arreglo
       delay_us(400);       // Pequeño retardo
       pulso();             // Con el Pulso se activa la siguiente columna
       }
                
}}

Esta es la simulación en PROTEUS.

Este ademas es un ejemplo claro del uso de la técnica de multiplexado.

74HC164 Y PIC 16F628 CONTROLANDO MATRIZ DE LED EFECTO BICHO EN MOVIMIENTO.

Ahora vamos a ver un caso en donde con la ayuda de un PIC16f628 nuestro registro de desplazamiento controla una matriz de led de 8×8 bits.

El código no es para nada complejo, se basa también en mostrar una secuencia de bits que conforman un arreglo dinámico que muestra una BICHO en movimiento.

Fíjate que al igual que en los códigos anteriores hacemos uso de la función PULSO ().

Para inspirarnos en la época de los antiguos videojuegos miremos esta nostálgica plantilla :

Habiendo escogido nuestro bicho vamos a descomponerlo en BITS con la ayuda del programita llamado CODEGRAPHIC dibujamos el primer aspecto y copiamos su arreglo hexadecimal.

De la misma manera dibujamos el segundo detalle:

Muy bien y con esos datos ya podemos armar el código de nuestro programa.

#include "16f628.h"
#FUSES NOWDT      // Es un fuse que resetea el pic si este se cuelga.
#FUSES NOPROTECT  // Permite o bloque lectura del pic con un  programador
#FUSES NOLVP      // Anula pin de programación RB4 y lo deja como I/O
#FUSES NOMCLR     // NOMCLR = PIN RA5 Input. MCLR=PIN RA5 como reset   
#FUSES INTRC_IO   // HABILITA el OSCILADOR INTERNO 
#USE DELAY(clock = 4000000, INTERNAL) // COMPLEMENTA EL FUSE INTRC_IO

// -------------------------- DECLARCION DE VARIABLES GLOBALES --------------------------//
int bf=0;                       //Indice del for del desplazamiento
int i;                          //variable que recorre todo el arreglo pf
int k;                          //variable del for de retardo

//---------------------------- ESTE ES EL BUFER QUE CONTIENE EL EFECTO DE LA ESTRELLA -----------------//

char BICHO[16]=    0x27, 0xc2, 0x89, 0xe1, 0xe1, 0x89, 0xc2, 0x27,         // BICHO 1
                   0xe7, 0xa3, 0x48, 0xe1, 0xe1, 0x48, 0xa3, 0xe7;         // BICHO 2
                      
               
void renglones(void);           // Enciende los leds correspondientes a cada columna del caracter
void pulso(void);               // Función de rutina no retorna ningún valor por ser void


// RECUERDA QUE EL 74HC164 LIBERA LOS DATOS CON LOS FLANCOS DE SUBIDA DEL PULSO DE RELOJ.

void pulso(void)
{
RA1=1; //CON EL FLANCO DE SUBIDA DEL PULSO SE LIBERA EL DATO
RA1=0; //CON EL FLANCO DE BAJADA SE RECIBE EL SIGUIENTE DATO 
}

void main()
{ 
TRISA=0;              // se configura toto el Puerto A como salida  
TRISB=0;              // se configura toto el Puerto B como salida
PORTA=0x00;           // Se limpia todo el puerto A
PORTB=0X00;           // Se limpia todo el puerto B         
delay_us(5);          // Esperamos un ratito que el PIC se estabilice            
RA0=1;                // Primero que nada colocar en alto al PIN de reset del 74HC164 si no nada funciona

while (1){
     
            FOR (BF=0;BF<=8;BF=BF+8)
  {
                   
                   FOR (K=0;K<=30;K++)   // RETARDA LA IMAGEN UNO PARA QUE NO SE MONTE CON LA IMAGEN 2, LO HACE REPITIENDO EL PROCESO K VECES.
                   {
                   RA1=0;              // Se coloca 0 (flanco de bajada al clok del 74hc164 para que reciba el dato desde el PIN RA2)
                   RA2=1;              // EL PIN RA2 COLOCA EL DATO EN EL 74HC164
                   pulso();            // EL pulso con su flanco de subida libera el dato y con el flanco de bajada queda listo para recibir el siguiente dato
                   RA2=0;              // Se coloca el siguiente Dato en el 74hc164
                    
                    for (i=0;i<8;i++) // Recorremos las 8 columnas del bufer msg
                      {
                        PORTB=BICHO[BF+i];     // SE MUESTRA LA COLUMNA BF+I DEL ARREGLO BICHO
                        delay_US(800);         //Retardo _delay
                        pulso();               //Activa la SIGUIENTE COLUMNA
                      }
                      }
                                 
  }           
           
}}

El circuito para este proyecto es el siguiente:

Cuando ejecutes la simulación veras el gracioso movimiento que realiza nuestro bicho de 8 BITS.

Todo gracias a nuestro registro de desplazamiento, la técnica de multiplexado y por su puesto nuestro fiel aliado el PIC16F628.

74HC164 Descarga de los 3 proyectos.

Si deseas descargar los 3 proyectos junto con su simulación este es el LINK:

74HC164 DESCARGA 3 PROYECTOS

Hay muchas mas aplicaciones en donde podemos hacer trabajar este pequeño pero muy útil registro de desplazamiento y aquí hemos tratado de mostrarte solo algunas muy interesantes.

Eso ha sido todo amigos en este post ” 74HC164 SHIFT REGISTER FUNCIONAMIENTO Y APLICACIONES” esperamos que nuestro pequeño aporte en algún momento te sea de utilidad.

Recuerda que una manera de ayudarnos o agradecer nuestro trabajo es visitando la publicidad que aparecen a lo largo del post. Gracias!
Recuerda también que puedes visitar todo el contenido de nuestro blog de informática en :

TODOS LOS POSTS DE ELECTRONICA.

Tambien puedes visitar nuestro canal de youtube en :

CANAL DE YOUTUBE TECNOCIENCIA

Agregue un comentario

Su dirección de correo no se hará público. Los campos requeridos están marcados *