Skip to Content

Interfaz de entrada en paralelo y salida en serie del registro de desplazamiento 74HC165 con Arduino

Interfaz de entrada en paralelo y salida en serie del registro de desplazamiento 74HC165 con Arduino

En este artículo, presentaré todos los detalles necesarios para entender el funcionamiento del registro de desplazamiento Parallel In Serial Out (PISO).

Usando el registro de desplazamiento PISO, puedes leer las entradas de múltiples interruptores con menos pines de Arduino. 

Al final de este artículo, tendrás todos los detalles necesarios para construir tus sistemas paralelo a serie.

Las aplicaciones en las que se utiliza el PISO 74HC165 son el recuento, el desplazamiento, los interruptores múltiples y la matriz del teclado. 

La siguiente sección revisa el funcionamiento, las entradas y las descripciones de los pines del registro de desplazamiento.

Más adelante, veremos algunos ejemplos de trabajo de Arduino donde se puede aprender rápidamente a codificar Arduino para interactuar con los registros de desplazamiento. 

En las últimas secciones, traeré las preguntas más frecuentes sobre el registro 74HC165 Parallel In Serial Out. 

Comencemos.

Componentes necesarios para construir un proyecto con un registro de desplazamiento

Componentes de hardware 

Software

Consejo rápido: Compra los CI de registro de desplazamiento que vienen en DIP. Es más fácil conectarlos a la protoboard.

Makerguides.com participa en el Programa de Asociados de Amazon Services LLC, un programa de publicidad de afiliados diseñado para proporcionar un medio para que los sitios ganen honorarios de publicidad mediante la publicidad y los enlaces a productos en Amazon.com.

¿Qué es un registro de desplazamiento de entrada y salida en paralelo - 74HC165?

El 74HC165 es un registro de desplazamiento de 8 bits Parallel In Serial Out(PISO). Puede utilizar PISO para leer el estado de 8 pines utilizando sólo tres pines en el Arduino UNO.

El registro de desplazamiento 74HC165 se utiliza para aumentar el número de pines de entrada para Arduino. El CI se puede conectar en cascada para escalar el número de entradas sin un mayor aumento de los pines de control utilizados por el Arduino.

El CI 74HC165 tiene ocho pines de entrada en paralelo. El CI muestrea todos los pines de entrada simultáneamente y proporciona los datos muestreados en serie al Arduino.

Veamos rápidamente los componentes clave y los modos de funcionamiento de un registro de desplazamiento de 8 bits de TI.

El IC 74HC165 tiene dos modos:

Modo de muestreo: Los ocho pines muestrean los datos de entrada en este modo. También se denomina modo de carga. Tendrá un pin de entrada dedicado para el CI, que tiene que controlar. 

El nivel de tensión en el pin define si el CI funciona en modo de desplazamiento o en modo de muestreo. En la mayoría de los CI, se requiere un nivel lógico bajo en el pin para poner el registro de desplazamiento en modo de muestreo. 

Modo de desplazamiento: En este modo, los datos de 8 bits enclavados se enviarán por cada impulso de reloj en el pin de entrada de reloj del registro de desplazamiento. 

El bit MSB vendrá primero. Los datos de DATA7 llegan primero al pin DOUT. Para el segundo pulso, los datos de DATA6 llegan al pin DOUT.

Finalmente, obtendrá la información en el pin DATA0 para el pulso de ocho relojes. 

En la mayoría de los circuitos integrados, se requiere un nivel lógico alto en la clavija para poner el registro de desplazamiento en el modo de desplazamiento.

Un punto crucial es que cuando está en modo de cambio, los cambios que se producen en los ocho pines de entrada no se cargan en el CI.

Los datos cambiantes en los pines de entrada no tienen efecto cuando el CI está en modo de cambio.

Detalles de los pines de un registro de desplazamiento PISO de 8 bits

Los registros de desplazamiento tendrán diferentes etiquetas de pines dependiendo de los fabricantes. Veamos una de estas hojas de datos de TI.

Etiqueta de la clavijaDescripción de la clavija
ADatos de entrada en paralelo bit 0
BDatos de entrada en paralelo bit 1
CDatos de entrada en paralelo bit 2
DDatos de entrada en paralelo bit 3
EDatos de entrada en paralelo bit 4
FDatos de entrada en paralelo bit 5
GDatos de entrada en paralelo bit 6
HDatos de entrada en paralelo bit 7
RelojClavija de reloj - Cada pulso en esta clavija desplaza los datos enclavados en la clavija de datos
Inhibición del relojPin de inhibición de reloj - cuando este pin está activo, el pin de reloj está deshabilitado. Cualquier pulso en el pin de reloj será ignorado. 
QPin de salida de datos en serie
Q#Pin de salida de datos en serie (invertido)
SEREntrada en serie
SH/LD#Entrada de desplazamiento o de carga - Cuando usted conduce este pin a un nivel alto, el IC estará en modo de desplazamiento. Cuando se pone bajo, los datos se cargan en los pines de entrada paralela.
VCCPin de alimentación (5 V)
GNDConexiones a tierra

¿Qué pines del 74HC165 se necesitan para conectar con Arduino?

Como mínimo, sólo necesitas tres pines en el Arduino para conectar con el registro de desplazamiento. Los tres pines son el pin de datos en serie, el pin de reloj y el pin de enganche.

Here is a snippet from a project where you read the status of 8 switches using only three Arduino UNO pins.

8 pulsadores utilizando sólo tres pines de Arduino UNO

Siéntase libre de reasignar los pines en base a sus necesidades. El esquema de Arduino le permite cambiar fácilmente el mapeo de pines.

const int dataPin = 2; /* Q7 */
const int clockPin = 3; /* CP */
const int latchPin = 4; /* PL */

En la siguiente tabla, he resumido la asignación de pines.

Pin de ArduinoClavija de registro de desplazamientoDescripción
2QPin de entrada de datos en serie. Este es el pin de salida para el registro de desplazamiento y el pin de entrada para el Arduino
3CLKEntrada de reloj del registro de desplazamiento. Este es el pin de salida para el Arduino y la entrada para el registro de desplazamiento
4SH/LD#Pin de control de desplazamiento o carga - Pin de salida del Arduino

Instrucciones paso a paso para conectar el registro de desplazamiento PISO a un Arduino

Esta sección proporcionará conexiones paso a paso para completar un proyecto Arduino de 8 entradas utilizando el registro de desplazamiento 74HC165. Comencemos

Proyecto 1: Registro de desplazamiento de 8 bits y Arduino para leer 8 interruptores

A continuación se muestra el diagrama de conexión final necesario para completar el proyecto.

El diagrama de conexión final

Paso 1: Empezar con el Arduino UNO

Empieza con el Arduino. Necesitaremos un Arduino UNO, un registro de desplazamiento PISO, 8 interruptores deslizantes y cables.

Empieza con el Arduino UNO

Paso 2: Conectar los pines GND

El indicador del PIN 1 se muestra en la siguiente imagen. Empiece por el PIN 1 y cuente en el sentido contrario a las agujas del reloj hasta encontrar el pin 8.

El pin GND es el octavo pin del registro de desplazamiento.

There are several GND pins available on the Arduino UNO. Choose the first one.

Conectar los pines GND
Pines GND disponibles en el Arduino UNO

Paso 3: Conectar la clavija de desplazamiento/carga

Conecta el pin SH/LD# (a veces llamado pin latch) del registro de desplazamiento al PIN 4 del Arduino.

Conectar el cambiador

Paso 4: Conectar la línea de Reloj Serial

Conecta el pin CLK del registro de desplazamiento al PIN 3 del Arduino.

Conecte la línea de Reloj Serial

Paso 5: Conectar la línea de salida de datos en serie

Conecta el pin Q (salida de datos) del registro de desplazamiento al PIN 2 del Arduino.

Conecte la línea de salida de datos en serie

Paso 6: Conectar el primer interruptor deslizante

Conecta el interruptor deslizante al registro de desplazamiento. Uno de los pines del interruptor deslizante va a VCC, y el otro va al pin GND.

Por lo tanto, dependiendo de la posición del deslizador, la señal digital será uno o 0 lógico.

Conecte la línea de salida de datos en serie

Paso 7: Completar las conexiones restantes de la corredera

Al final de este paso, habrás conectado los 8 pines de entrada del registro de desplazamiento a los 8 deslizadores.

Completa el resto de las conexiones del deslizador

Paso 8: El código Arduino

Aquí está el enlace para el sketch de Arduino. El código de abajo es todo lo que necesitas para leer las 8 entradas de los deslizadores.

const int dataPin = 2;   /* Q7 */
const int clockPin = 3;  /* CP */
const int latchPin = 4;  /* PL */
 
const int numBits = 8;   /* Set to 8 * number of shift registers */
 
void setup() {
  Serial.begin(115200);
  pinMode(dataPin, INPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(latchPin, OUTPUT);
}
 
void loop() {
  // Step 1: Sample
  digitalWrite(latchPin, LOW);
  digitalWrite(latchPin, HIGH);
 
  // Step 2: Shift
  Serial.print("Bits: ");
  for (int i = 0; i < numBits; i++) {
    int bit = digitalRead(dataPin);
    if (bit == HIGH) {
      Serial.print("1");
    } else {
      Serial.print("0");
    }
    digitalWrite(clockPin, HIGH); // Shift out the next bit
    digitalWrite(clockPin, LOW);
  }
 
  Serial.println();
  delay(1000);
}

Proyecto 2: Leer 32 interruptores usando 3 pines de Arduino

En este proyecto, leerás el estado de los 32 interruptores deslizantes utilizando sólo tres pines de Arduino. Esto es un poco exagerado pero prácticamente es un proyecto que funciona. Este ejemplo muestra dos cosas.

  1. Cómo poner en cascada dos o más registros de desplazamiento
  2. Cómo leer múltiples entradas de diapositivas utilizando registros de desplazamiento
Leer 32 interruptores usando 3 pines de Arduino

Paso 1: El diagrama de conexión

Puedes seguir pasos similares a los del proyecto 1 para completar la conexión. Puede consultar el enlace aquí para acceder al diagrama de cableado en una mejor resolución. 

Paso 2: El código de Arduino para leer 32 entradas de interruptores deslizantes

const byte latchPin = 9;        // to latch the inputs into the registers
const byte clockPin = 13;       // I choose the SCK pin
const byte dataPin = 12;        // I choose the MISO pin
uint32_t oldOptionSwitch = 0;   // previous state of all the inputs

const int pulseWidth = 10;      // pulse width in microseconds

void setup ()
{
  Serial.begin( 115200);
  Serial.println( "Turn on and off the switches");
  Serial.println( "Top row is switch 0 (right) to switch 7 (left)");
  Serial.println( "Second row is 8 to 15, and so on");

  pinMode( clockPin, OUTPUT);   // clock signal, idle LOW
  pinMode( latchPin, OUTPUT);   // latch (copy input into registers), idle HIGH
  digitalWrite( latchPin, HIGH);
}

void loop ()
{
  // Give a pulse to the parallel load latch of all 74HC165
  digitalWrite( latchPin, LOW);    
  delayMicroseconds( pulseWidth);
  digitalWrite( latchPin, HIGH);

  // Reading one 74HC165 at a time and combining them into a 32 bit variable
  // The last 74HC165 is at the bottom, but the switches start numbering
  // at the top. So the first byte has to be shifted into the highest place.
  uint32_t optionSwitch = 0;
  for( int i=24; i>=0; i-=8)
  {
    optionSwitch |= ((uint32_t) ReadOne165()) << i;
  }

  for( int i = 0; i<32; i++)
  {
    if( bitRead( optionSwitch, i) != bitRead( oldOptionSwitch,i))
    {
      Serial.print( "Switch ");
      if( i < 10)
        Serial.print( " ");
      Serial.print( i);
      Serial.print( " is now ");
      Serial.println( bitRead( optionSwitch, i) == 0 ? "down ↓" : "up   ↑");
    }
  }
 
  oldOptionSwitch = optionSwitch;
  delay( 25);      // slow down the sketch to avoid switch bounce
}

// The ReadOne165() function reads only 8 bits,
// because of the similar functions shiftIn() and SPI.transfer()
// which both use 8 bits.
//
// The shiftIn() can not be used here, because the clock is set idle low
// and the shiftIn() makes the clock high to read a bit.
// The 74HC165 require to read the bit first and then give a clock pulse.
//
byte ReadOne165()
{
  byte ret = 0x00;

  // The first one that is read is the highest bit (input D7 of the 74HC165).
  for( int i=7; i>=0; i--)
  {
    if( digitalRead( dataPin) == HIGH)
      bitSet( ret, i);

    digitalWrite( clockPin, HIGH);
    delayMicroseconds( pulseWidth);
    digitalWrite( clockPin, LOW);
  }

  return( ret);
}

Preguntas frecuentes sobre el registro de desplazamiento de entrada en serie y salida en paralelo y Arduino

En esta sección, he respondido a las preguntas más frecuentes sobre el registro de desplazamiento PISO (Parallel In Serial Out) y Arduino. Si tienes más preguntas, por favor publícalas en los comentarios.  

1) ¿Es el 74HC165 un microcontrolador?

No. El 74HC165 es un registro de desplazamiento Parallel In Serial Out utilizado para leer múltiples entradas utilizando muy pocos pines de Arduino/MCU.

2) ¿Qué puedo hacer con un 74HC165?

Puedes hacer muchas cosas con el CI de registro de desplazamiento 74HC165. 

  • Entrada de propósito general
  • Conversión de datos en paralelo a serie
  • Capturar datos y mantenerlos (latching) durante largos intervalos
  • Control industrial, automatización, etc.

3) ¿Cómo funcionan los 74HC165 múltiples en cascada?

Una conexión en cascada es aquella en la que se utilizan varios registros de desplazamiento con un solo Arduino. Tienes que hacer las conexiones de la siguiente manera.

Conecte el pin MSB (D7/H) al pin de entrada de serie del siguiente registro de desplazamiento. Conecte el pin de entrada de datos D7/H de la última unidad al microcontrolador.

El pin de latch/hold y el pin de reloj se comparten con todos los registros de desplazamiento. Por lo tanto, sólo necesitas tres pines para controlar más de 8 entradas cuando utilizas registros de desplazamiento.

Conclusión

Espero que el artículo te haya sido útil para conocer los registros de desplazamiento PISO.

Espero que sigas construyendo más proyectos útiles de Arduino y de registro de turnos en el futuro. 

Este artículo cubre el principio básico de funcionamiento, las definiciones de los pines y la información crítica sobre el reloj del CI, el cambio y el estado de muestreo.

También vimos diferentes proyectos de distinta complejidad.

Me encantará conocer los proyectos basados en los registros de cambio que construyas. Por favor, hágamelo saber en la sección de comentarios.

Además, sería estupendo si pudieras sugerir cualquier mejora al artículo, estaré encantado de aceptar todos los comentarios constructivos. 

¿Qué tema sería más interesante de leer? Hágamelo saber en los comentarios.

Por favor, comparte este artículo con otros entusiastas de Arduino.

Andrew

Wednesday 14th of February 2024

Worked it out by using pull-down resistors. It would be worth mentioning this.

Stefan Maetschke

Wednesday 14th of February 2024

Good point. Will add that. Thanks!

Andrew

Wednesday 14th of February 2024

I tried this with momentary push-buttons instead of slider switches, but the results were inaccurate. Is there anything special required to change this for push-buttons ?

Ezra

Saturday 15th of July 2023

I'm trying to use a single shift register for reading keypad inputs is it possible?