SHIFT REGISTER ¿que son y cómo se usan?

Un registro de desplazamiento (shift register en inglés), es un integrado capaz de almacenar bits y presentarlos en sus pines.

Hay varios tipos pero los que aquí nos interesan son los del tipo Serial-Paralelo y Paralelo-Serial, esto significa que en el primer caso los bits "entran" en forma serial (uno a uno) y "salen" de forma paralela, en el segundo caso entrar en paralelo (todos juntos) y salen en serie.

Unos de los integrados que hacen esto, entre muchos otros, son el 74HC595 y el 74HC165, que son Serial/Paralelo y Paralelo/Serial respectivamente.

El pinout del 74HC595 es el siguiente:

Los pines marcados como Q0-Q7 son salidas y reflejan el estado interno de cada bit cuando es activado poniendo a nivel alto el pin 12 (STCP), los datos ingresan de forma serial por el pin 14(DS) cada vez que el pin SHCP pasa de estado bajo a alto ( de 0v a 5v).

También se pueden enlazar varios integrados iguales de modo que ampliamos la cantidad de bits. para ello agregamos un segundo integrado y conectamos la patilla DS a la patilla Q7' del primero.

La secuencia seria la siguiente:
1.Se pone el pin DS en el estado del bit que se quiera ingresar
2.Pin SHCP en bajo
3.Pin SHCP en alto
4.Se repite el proceso hasta enviar los 8 bits
5.Se coloca el pin STCP en bajo
6.Se coloca el pin STCP en alto

y de esa forma aparece el byte en las salidas.

Pinout del 74HC165:

De manera similar funciona el 74HC165 solo que a los bit los "lee" todos juntos.

Aquí las entradas son D0 a D7 y la salida es Q7, PL es el Load y cuando pasa a estado bajo carga los valores de las patas D0-D7 en "memoria" y dandole pulsos altos y bajos a CP los datos van saliendo bit a bit.

Para encadenar varios basta con conectar Q7 de un integrado con DS del siguiente y leer la pata Q7 del último.

Este es el diagrama de conexión para leer 16 bits (2bytes) con dos integrados enlazados:

La forma de proceder sería asi:
Se pone en bajo el Load para tomar el estado de todas las entradas (b0 a b15) luego se envia la señal de reloj poniendo en bajo y luego en alto Clk y se lee el estado de DI (Data-In). Recordar que en DI aparecerá primero el bit mas significativo (MSB).

Esta técnica es válida para controlar un display LCD, o multiplexar cualquier dato.

Aquí esta el código en CSS C:
#include <16f84a.h> 

#define  Clk    Pin_A0 
#define  Load   Pin_A1 
#define  DI     Pin_A2 

#use     fast_io(a) 
#use     fast_io(b) 
 
int Leer_Shift (void); 
 
void main(void){

   set_tris_A(0b10100);
   set_tris_B(0b00000000);

   do{
      if (input(pin_a4)==true) output_b(leer_shift());
   }while(true);

}
int Leer_Shift (void){
   int t;
   int Lectura=0;
   output_low (Load);      // Pongo a low Load para "cargar" el estado de las
   output_high(Load);      // entradas y paso a high para poder leerlas.     

   for(t=0;t<=7;++t){      // Hago un ciclo de 8 pasos (0 - 7) 

      Lectura<<=1;         // Roto los bits de la variable temporal
      Lectura+=input(Di);  // y le sumo el valor del ultimo bit leido      

      output_low(Clk);     // La transicion low-to-high hace que la      
      output_high(Clk);    // memoria interna del integrado rote.
   }
   return Lectura;
}

En el ejemplo, Clock se conectaría al pin 0, Load al pin 1 y DI al pin 2 del Puerto A. Pero este programa solo leerá de b8 a b15, para leer b0 a b15 se deberá usar Int de 16 bits para guardar los datos o dos de 8 bits y guardarlos en variables diferentes. Aparte de todo esto se deberá hacer un bucle de 16 ciclos en lugar de los 8 para leer 1 byte.

Con este circuito el único pin exclusivo para el funcionamiento del registro es el pin A2 (Data in) ya que los otros se pueden conectar a otros circuitos sin que afecten a este.

SiLMuP (todavía en construcción) utiliza un 74HC595 para controlar el display LCD y por el mismo bus controlar las teclas de función y un 74HC165 para leer el estado de los sensores de líneas.

De esta forma controla un display LCD, 4 teclas de función, 8 sensores siguelineas, y proximamente mas sensores y bumpers para obstaculos con 6 pines del pic y solo 3 son exclusivos.

8 comentarios:

  1. Brutalmente bueno. Me ha sido super-útil.

    A pesar de todo pero, hay una cosa que creo que no la dejas clara. Mira:

    STCP, se pone activo para INGRESAR los datos en serie o... se pone activo para PONER los datos en las salidas del los pin?

    Un saludo =)

    ResponderEliminar
  2. Me alegra saber que es útil, al menos como guía.

    Cuando se activa STCP el estado de los bits internos (Q0'-Q7')pasan a las salidas (Q0-Q7).

    Saludos.

    ResponderEliminar
  3. Hola amigo exelente aporte para los que no conosemos tanto de electronica creo entender que los datos entran por el pin 14 (SD) se guardan en memoria cuando pasa de bajo a alto el pin 11 (SHCP)y el dato se livera al puerto cuando se pone en nivel alto el pin 12 (SHTP)esto es asi?

    De nuevo felisitaciones tratare de colgar el codigo en .asm para el Pic 16F84A

    ResponderEliminar
  4. Gracias y si, es así.
    En realidad lo que hace el nivel alto en el pin 12 (STCP) es "copiar" el estado de Q0'-Q7' a Q0-Q7. Q0'-Q6' no tienen conexión al exterior mientras si lo tienen Q0-Q7 y Q7'

    Saludos.

    ResponderEliminar
  5. Anónimo26/2/13

    Thanks a bunch for sharing this with all of us you really recognize
    what you're speaking approximately! Bookmarked. Kindly additionally consult with my site =). We can have a link change agreement among us

    My weblog - healthy diet plans
    my webpage :: http://safedietplans.com

    ResponderEliminar
  6. buenas tardes chicos, ante todo soy nuevo en este sitio, quisiera saber como realizar con el 74hc595 una salida que represente el numero binario correspondiente para un 7 segmento, lo estoy intentando realizar pero aún no tuve suerte, me conformo que sea un simple contado de 0 a 9, espero que me puedan ayudar o brindar información, mis cordiales saludos Cristian Jara. email cristian_electrico.jara@hotmail.com

    ResponderEliminar
  7. Anónimo3/2/15

    Bro me gustaria saber si existe algún integrado de características similares al 74HC595?

    ResponderEliminar
  8. Anónimo14/9/15

    Genial aporte, aunque no consigo visualizar bien las aplicaciones que tienen y cómo funcionan para su objetivo. Por ejemplo, estoy construyendo un cubo led 8x8x8 y usa 74HC595 y 74HCT595

    ResponderEliminar

Tal vez le interese: