Componentes · 19 min de lectura

74HC595 con Arduino: registro de desplazamiento para 8+ LEDs

74HC595 con Arduino: pines, shiftOut() y orden de bits, cascada, secuencia de LEDs y 7 segmentos, SPI rápido, código para ESP32 y Pico y límites de corriente.

El 74HC595 es un circuito integrado de 16 pines, un registro de desplazamiento (shift register) muy barato que te permite controlar 8 salidas independientes usando solo 3 pines digitales de tu Arduino. Un Arduino Uno tiene 20 pines utilizables y se agotan enseguida cuando intentas montar un coche fantástico de 16 LEDs, un marcador de dos dígitos o una placa de 8 relés. El 74HC595 lo resuelve recibiendo los datos bit a bit por una sola línea: el chip va guardando los bits que llegan y, cuando le indicas que estás listo, los copia a la vez en sus ocho salidas. Si conectas varios chips en cascada, los mismos 3 pines controlan 16, 24 o incluso 80 salidas.

En esta guía aprenderás el patillaje del 74HC595 (DS, SH_CP, ST_CP, OE, MR y Q7'), la estructura interna que convierte datos en serie en salidas en paralelo, la función shiftOut() de Arduino y la diferencia entre el orden de bits MSBFIRST y LSBFIRST. Después montarás un contador binario, una secuencia de LEDs, una cadena de 16 LEDs y un display de 7 segmentos, y controlarás el mismo circuito decenas de veces más rápido con SPI por hardware. Las últimas secciones incluyen código para ESP32 y Raspberry Pi Pico (MicroPython), los límites de corriente del chip y la solución a los errores de latch más comunes.

¿Qué es el 74HC595 y cómo funciona?

Dentro del chip hay dos registros de 8 bits conectados uno tras otro. El primero es el registro de desplazamiento: en cada flanco de subida del pin SH_CP (reloj), el 0 o el 1 presente en el pin DS entra en la primera celda y los bits que ya estaban dentro avanzan una posición. Tras ocho pulsos de reloj, los ocho bits que enviaste están dentro. El segundo es el registro de almacenamiento (latch): con un flanco de subida en el pin ST_CP, los ocho bits del registro de desplazamiento se copian de golpe a este registro y aparecen en las salidas Q0–Q7. Gracias a esta estructura en dos etapas, los LEDs no parpadean mientras los bits se desplazan; las salidas solo cambian cuando activas el pin de latch.

Puedes compararlo con una estación de tren: los vagones (bits) llegan al andén uno tras otro por una sola vía, pero las puertas solo se abren cuando el tren está completamente parado, y todos los pasajeros bajan a la vez. Abrir las puertas es tarea del pin de latch. Como los datos entran en serie y salen en paralelo, al 74HC595 también se le llama registro SIPO (serial-in, parallel-out). Su hermano, que hace lo contrario y te permite leer 8 botones por una sola línea, es el 74HC165 (PISO). Ambos pertenecen a la familia lógica de la serie 74; puedes consultar las puertas y los números de chip de esta familia en la herramienta Puertas lógicas.

CaracterísticaValor
TipoRegistro de desplazamiento de 8 bits con entrada serie y salida paralela (SIPO) + registro de almacenamiento de 8 bits
Tensión de alimentación (VCC)2–6 V (74HCT595: 4,5–5,5 V)
EncapsuladoDIP-16 (encaja en la protoboard), SOIC-16, TSSOP-16
Corriente de salidaUnos 6 mA por salida (valor de prueba de la hoja de datos a 4,5 V)
Límites absolutos±35 mA por salida; ±70 mA en total por el pin VCC o GND
Frecuencia de reloj máximaGarantizada hasta 25 MHz a 4,5 V, 5 MHz a 2 V
Umbral de entrada HIGH (VIH)Al menos 3,15 V con 4,5 V de alimentación (aprox. 0,7 × VCC)
Tipo de salidaTriestado; con OE en HIGH, Q0–Q7 quedan en alta impedancia

Patillaje del 74HC595 (pinout)

La muesca en forma de media luna o el pequeño punto del chip marca el pin 1. Con la muesca arriba y mirando el chip desde arriba, los pines 1–8 bajan por el lado izquierdo y los pines 9–16 suben por el lado derecho. Cada fabricante nombra los pines a su manera: NXP y la mayoría de recursos de Arduino usan DS, SH_CP y ST_CP, mientras que Texas Instruments usa SER, SRCLK y RCLK. En la tabla de abajo tienes ambos. OE y MR son entradas activas a nivel bajo, es decir, actúan cuando están en LOW, y en las hojas de datos aparecen con una barra sobre el nombre.

PinNombre NXPNombre TIFunciónSe conecta a
15, 1–7Q0, Q1–Q7QA, QB–QHSalidas en paralelo (Q0 en el pin 15, Q1–Q7 en los pines 1–7)LEDs a través de resistencias
8GNDGNDTierraGND
9Q7'QH'Salida serie: el último bit del registro de desplazamientoPin DS del siguiente 74HC595 (cascada)
10MRSRCLRBorra el registro de desplazamiento (activo en LOW)VCC
11SH_CPSRCLKReloj de desplazamiento; toma 1 bit en el flanco de subidaArduino D13 (SCK)
12ST_CPRCLKLatch; pasa los datos a las salidas en el flanco de subidaArduino D10
13OEOEHabilita las salidas (activo en LOW)GND (o un pin PWM para el brillo)
14DSSEREntrada de datos en serieArduino D11 (MOSI)
16VCCVCCAlimentación5V (3,3 V en ESP32 y Pico)
La salida Q0 no está junto a las demás, sino en el lado opuesto, en el pin 15; Q1–Q7 están en los pines 1–7. El error más habitual de quien empieza es colocar los LEDs en orden a partir del pin 1 y olvidarse de Q0, o poner el LED del pin 15 al final de la fila. La secuencia salta entonces en un punto y te pones a buscar el fallo en el código, cuando en realidad está en el cableado.

Conexión con Arduino Uno, ESP32 y Pico

Todos los ejemplos de Arduino de esta guía usan el mismo circuito. Elegir desde el principio los pines de SPI por hardware (D11 y D13) para las líneas de datos y reloj hace que, cuando pases el código a SPI, no tengas que mover ni un solo cable. La pata larga (ánodo) de cada LED va a una salida y la pata corta (cátodo) va a GND a través de una resistencia. No olvides un condensador cerámico de 100 nF entre los pines VCC y GND del chip, lo más cerca posible de él; suaviza las pequeñas caídas de tensión cuando muchos LEDs conmutan a la vez y evita fallos aleatorios. También puedes comprobar los pines SPI de tu placa en la herramienta Pinout.

Pin del 74HC595Arduino UnoESP32Raspberry Pi Pico
DS (14)D11GPIO 23GP19
SH_CP (11)D13GPIO 18GP18
ST_CP (12)D10GPIO 5GP17
OE (13)GNDGNDGND
MR (10)5V3V33V3(OUT)
VCC (16)5V3V33V3(OUT)
GND (8)GNDGNDGND
Q0–Q7LED + 470 ΩLED + 220 ΩLED + 220 Ω
El 74HC595 no es un driver potente. Según la hoja de datos, una sola salida admite como máximo 35 mA y por el pin VCC o GND no pueden circular más de 70 mA en total. Con las resistencias de 220 Ω habituales en los tutoriales, cada LED consume 10–13 mA a 5 V; con los ocho encendidos el total llega a 80–100 mA, el chip se calienta, la tensión de salida cae y con el tiempo puede estropearse. Con 470 Ω a 5 V tendrás unos 6 mA por LED y alrededor de 50 mA con los ocho encendidos, y los LEDs actuales se ven perfectamente con esa corriente. Para calcular el valor tú mismo, usa la herramienta Resistencia para LED.

La función shiftOut() y el orden de bits (MSBFIRST / LSBFIRST)

La forma más sencilla de enviar datos al 74HC595 desde Arduino es la función integrada shiftOut(dataPin, clockPin, bitOrder, value). Escribe los ocho bits del byte value uno tras otro en el pin de datos y, después de cada bit, pone el pin de reloj en HIGH y luego en LOW; el 74HC595 toma el bit justo en ese flanco de subida. shiftOut() no toca el pin de latch, así que tienes que poner ST_CP en LOW antes de enviar y en HIGH después. Como la función trabaja con flancos de subida, el pin de reloj también debe estar en LOW antes de la llamada; si no, el primer bit se puede perder.

El parámetro bitOrder indica desde qué extremo se envían los bits. El primer bit enviado acaba en el otro extremo, Q7, tras ocho desplazamientos, y el último bit enviado se queda en Q0. Con MSBFIRST sale primero el bit más significativo (bit 7), así que cada bit del byte cae en la salida con el mismo número: el bit 0 en Q0 y el bit 7 en Q7. Con LSBFIRST el orden se invierte y el bit 0 aparece en Q7 y el bit 7 en Q0. Todos los ejemplos de esta guía usan MSBFIRST, de modo que los bits del número en el código coinciden uno a uno con los números de los LEDs. Si quieres repasar los números binarios y la notación 0b, lee la guía sobre sistemas de numeración y operaciones con bits.

Valor enviadoSalidas encendidas con MSBFIRSTSalidas encendidas con LSBFIRST
0b00000001 (1)Q0Q7
0b10000000 (128)Q7Q0
0b00001111 (15)Q0, Q1, Q2, Q3Q4, Q5, Q6, Q7
0b10100101 (165)Q0, Q2, Q5, Q7Q0, Q2, Q5, Q7 (patrón simétrico)

Paso a paso: contador binario con 8 LEDs

  1. Coloca el 74HC595 sobre el canal central de la protoboard, de forma que las dos filas de patas queden a lados distintos. Si no conoces las conexiones internas de una protoboard, lee primero ¿Qué es una protoboard?.
  2. Conecta VCC (pin 16) y MR (pin 10) a 5V, y GND (pin 8) y OE (pin 13) a GND. Pon el condensador de 100 nF entre VCC y GND.
  3. Conecta DS (14) a D11, SH_CP (11) a D13 y ST_CP (12) a D10.
  4. Conecta las patas largas de ocho LEDs a las salidas Q0–Q7 y las patas cortas a GND mediante resistencias de 470 Ω. Recuerda que Q0 es el pin 15.
  5. Sube el código de abajo. Los LEDs deben contar en binario de 0 a 255; el LED de Q0 parpadea más rápido y el de Q7 más despacio.
Arduino (C++)
1// 74HC595 ile 8 LED'de ikilik sayaç / Binary counter on 8 LEDs with a 74HC595
2const int DATA_PIN = 11;   // DS (14)
3const int CLOCK_PIN = 13;  // SH_CP (11)
4const int LATCH_PIN = 10;  // ST_CP (12)
5
6void write595(byte value) {
7  digitalWrite(LATCH_PIN, LOW);                    // latch'i indir / pull the latch low
8  shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, value);  // 8 biti kaydır / shift the 8 bits in
9  digitalWrite(LATCH_PIN, HIGH);                   // yükselen kenar: çıkışlara aktar / rising edge: copy to the outputs
10}
11
12void setup() {
13  pinMode(DATA_PIN, OUTPUT);
14  pinMode(CLOCK_PIN, OUTPUT);
15  pinMode(LATCH_PIN, OUTPUT);
16  digitalWrite(CLOCK_PIN, LOW);                    // saat LOW başlamalı / the clock must start low
17  write595(0);                                     // açılışta hepsi sönük / all off at startup
18}
19
20void loop() {
21  for (int n = 0; n < 256; n++) {
22    write595(n);                                   // n'in bitleri Q0–Q7'de / the bits of n on Q0–Q7
23    delay(200);
24  }
25}

El corazón del código es la función write595(): pone el latch en LOW, envía ocho bits con shiftOut() y pone el latch en HIGH para pasarlos todos a la vez a las salidas. Aquí está también la respuesta a por qué los LEDs no parpadean: mientras se desplazan los bits, las salidas mantienen su valor anterior. Cuando n vale 5 (0b00000101) se encienden los LEDs de Q0 y Q2; con 200 (0b11001000) se encienden los de Q3, Q6 y Q7. En el Uno puede que veas el LED integrado L de D13 titilar levemente con la señal de reloj; es normal y no afecta al circuito.

Secuencia de LEDs y efecto coche fantástico

LEDs para proyectos con Arduino
Cada salida del 74HC595 lleva un LED con su propia resistencia: la pata larga (ánodo) a la salida y la corta a GND a través de la resistencia.

Para una secuencia de luces basta con poner un único bit a 1 en cada paso. La macro bit(i) de Arduino genera un número en el que solo el bit i vale 1: bit(0) es 1, bit(3) es 8 y bit(7) es 128. El código de abajo reproduce tres efectos seguidos: un LED que corre de Q0 a Q7, un barrido de ida y vuelta al estilo coche fantástico y una barra que se va llenando. Si quieres compararlo con la versión clásica conectada directamente a los pines, mira Coche fantástico y secuencia de LEDs con Arduino; allí cada LED gasta un pin propio, aquí bastan 3 pines en total.

Arduino (C++)
1// Yürüyen LED, karaşimşek ve dolan çubuk / Running light, Knight Rider and filling bar
2const int DATA_PIN = 11;   // DS
3const int CLOCK_PIN = 13;  // SH_CP
4const int LATCH_PIN = 10;  // ST_CP
5const int STEP_MS = 80;    // adım süresi (ms) / step time (ms)
6
7void write595(byte value) {
8  digitalWrite(LATCH_PIN, LOW);
9  shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, value);
10  digitalWrite(LATCH_PIN, HIGH);
11}
12
13void setup() {
14  pinMode(DATA_PIN, OUTPUT);
15  pinMode(CLOCK_PIN, OUTPUT);
16  pinMode(LATCH_PIN, OUTPUT);
17  digitalWrite(CLOCK_PIN, LOW);
18  write595(0);
19}
20
21void loop() {
22  // 1) Yürüyen LED: Q0'dan Q7'ye / running light: Q0 to Q7
23  for (int i = 0; i < 8; i++) {
24    write595(bit(i));               // yalnızca i. bit 1 / only bit i is 1
25    delay(STEP_MS);
26  }
27
28  // 2) Karaşimşek: git-gel, 3 tur / Knight Rider: back and forth, 3 rounds
29  for (int r = 0; r < 3; r++) {
30    for (int i = 0; i < 7; i++) { write595(bit(i)); delay(STEP_MS); }
31    for (int i = 7; i > 0; i--) { write595(bit(i)); delay(STEP_MS); }
32  }
33
34  // 3) Dolan çubuk / filling bar
35  byte bar = 0;
36  for (int i = 0; i < 8; i++) {
37    bar |= bit(i);                  // bir LED daha ekle / add one more LED
38    write595(bar);
39    delay(STEP_MS * 2);
40  }
41  write595(0);
42  delay(300);
43}

En la parte del coche fantástico, el bucle de ida va de 0 a 6 y el de vuelta de 7 a 1; así los LEDs de los extremos no se encienden dos veces seguidas y el movimiento se ve fluido. En la barra, la operación |= (OR bit a bit) añade un LED nuevo y deja encendidos los anteriores; es la base de un vúmetro o indicador de barra que muestra el valor de un potenciómetro o un sensor. Como el código usa delay(), el Arduino no puede hacer nada más mientras dura el efecto. Si quieres leer un botón o cambiar la velocidad en directo durante el efecto, controla los tiempos con millis(); encontrarás el método en la guía millis() y delay().

Conectar varios 74HC595 en cascada (Q7')

El pin 9 del chip, Q7' (QH'), saca el bit que desborda del registro de desplazamiento. Si lo conectas a la entrada DS de un segundo 74HC595, los dos chips se comportan como un único registro de 16 bits. Las líneas SH_CP y ST_CP son comunes a todos los chips; tanto si la cadena tiene tres como diez, del Arduino siguen saliendo solo 3 cables. Cada byte nuevo empuja al anterior hacia el siguiente chip. Por eso el primer byte que envías acaba en el último chip de la cadena, mientras que el último byte se queda en el primer chip, el que está conectado al Arduino. Al activar el latch, las salidas de todos los chips se actualizan a la vez.

ConexiónChip 1Chip 2
DS (14)Arduino D11Q7' (pin 9) del chip 1
SH_CP (11)Arduino D13Arduino D13 (común)
ST_CP (12)Arduino D10Arduino D10 (común)
Q7' (9)Al pin DS del chip 2Libre o al pin DS del chip 3
OE (13) / MR (10)GND / 5VGND / 5V
SalidasLEDs 0–7LEDs 8–15
Arduino (C++)
1// İki zincirli 74HC595 ile 16 LED / 16 LEDs on two daisy-chained 74HC595s
2const int DATA_PIN = 11;   // 1. entegrenin DS'si / DS of chip 1
3const int CLOCK_PIN = 13;  // iki entegrede ortak SH_CP / shared SH_CP
4const int LATCH_PIN = 10;  // iki entegrede ortak ST_CP / shared ST_CP
5
6void write16(uint16_t value) {
7  digitalWrite(LATCH_PIN, LOW);
8  shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, highByte(value));  // önce uzaktaki entegre (LED 8–15) / far chip first (LEDs 8–15)
9  shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, lowByte(value));   // sonra yakındaki (LED 0–7) / then the near chip (LEDs 0–7)
10  digitalWrite(LATCH_PIN, HIGH);                             // 16 çıkış aynı anda değişir / all 16 outputs change at once
11}
12
13void setup() {
14  pinMode(DATA_PIN, OUTPUT);
15  pinMode(CLOCK_PIN, OUTPUT);
16  pinMode(LATCH_PIN, OUTPUT);
17  digitalWrite(CLOCK_PIN, LOW);
18  write16(0);
19}
20
21void loop() {
22  for (int i = 0; i < 16; i++) {    // ileri / forward
23    write16(bit(i));
24    delay(50);
25  }
26  for (int i = 14; i > 0; i--) {    // geri / backward
27    write16(bit(i));
28    delay(50);
29  }
30}

highByte() y lowByte() dividen el número de 16 bits en dos bytes. El byte alto se envía primero, así que viaja hasta el último chip de la cadena y controla los LEDs 8–15; el byte bajo se queda en el primer chip. Para añadir un tercer chip basta con enviar un byte más, empezando de nuevo por el chip más lejano; con muchos chips es más ordenado guardar los bytes en un array y enviarlos con un bucle. La cadena no tiene un límite teórico, pero cada chip alarga la actualización y carga más la línea de reloj común. En cadenas largas, pon a cada chip su propio condensador de 100 nF, mantén cortos los cables de reloj y latch y, si la línea crece mucho, refuerza el reloj con un buffer como el 74HC244.

Controlar un display de 7 segmentos con el 74HC595

Display de 7 segmentos de un dígito
Display de 7 segmentos de un dígito: los segmentos a–g y el punto (dp) suman exactamente 8 LEDs, justo las 8 salidas de un 74HC595.

Un display de 7 segmentos de un dígito tiene exactamente ocho LEDs: siete segmentos de la a a la g y un punto (dp). Por tanto, las ocho salidas de un 74HC595 encajan perfectamente con un dígito. Si conectas Q0 al segmento a, Q1 al b y así sucesivamente, Q6 acaba en g y Q7 en el punto; el bit 0 del byte representa entonces el segmento a y el bit 6 el segmento g. La tabla de abajo muestra el conexionado de un display habitual de 10 pines y cátodo común. Los pines comunes (3 y 8) van a GND y cada segmento lleva su propia resistencia de 470 Ω. La disposición de las letras de los segmentos y la diferencia entre ánodo común y cátodo común las tienes en detalle en la guía Display de 7 segmentos con Arduino.

Salida del 74HC595SegmentoPin del display
Q0 (15)a7
Q1 (1)b6
Q2 (2)c4
Q3 (3)d2
Q4 (4)e1
Q5 (5)f9
Q6 (6)g10
Q7 (7)dp5
Arduino (C++)
1// 74HC595 ile tek haneli 7 segment: 0–9 sayacı / Single-digit 7-segment 0–9 counter with a 74HC595
2const int DATA_PIN = 11;
3const int CLOCK_PIN = 13;
4const int LATCH_PIN = 10;
5const bool COMMON_ANODE = false;    // ortak anotsa true / true for common anode
6
7// bit 0 = a ... bit 6 = g, bit 7 = dp (1 = yanar / 1 = on)
8const byte DIGITS[10] = {
9  0b00111111, // 0
10  0b00000110, // 1
11  0b01011011, // 2
12  0b01001111, // 3
13  0b01100110, // 4
14  0b01101101, // 5
15  0b01111101, // 6
16  0b00000111, // 7
17  0b01111111, // 8
18  0b01101111  // 9
19};
20
21void write595(byte value) {
22  if (COMMON_ANODE) value = ~value;   // ortak anotta LOW yakar / LOW lights a common-anode segment
23  digitalWrite(LATCH_PIN, LOW);
24  shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, value);
25  digitalWrite(LATCH_PIN, HIGH);
26}
27
28void setup() {
29  pinMode(DATA_PIN, OUTPUT);
30  pinMode(CLOCK_PIN, OUTPUT);
31  pinMode(LATCH_PIN, OUTPUT);
32  digitalWrite(CLOCK_PIN, LOW);
33}
34
35void loop() {
36  for (int n = 0; n < 10; n++) {
37    byte pattern = DIGITS[n];
38    if (n % 2 == 1) pattern |= 0b10000000;   // tek sayılarda nokta yanar / dot on for odd numbers
39    write595(pattern);
40    delay(800);
41  }
42}

En un display de ánodo común, los pines comunes van a 5V y un segmento se enciende cuando su salida está en LOW. Si pones COMMON_ANODE en true en el código, el operador ~ invierte todos los bits y la misma tabla sigue funcionando. Para un contador de dos dígitos, añade un segundo 74HC595 a la cadena y envía primero el patrón del dígito más lejano y después el del dígito más cercano al Arduino. Con este método cada dígito tiene su propio chip, así que no hace falta multiplexar, el display nunca parpadea y usar delay() en loop() no es un problema. Para cuatro dígitos o más puedes multiplexar con dos 74HC595 o pasarte a drivers como el TM1637 o el MAX7219, que hacen el barrido por su cuenta.

Control rápido con SPI

shiftOut() es lento porque escribe cada bit por separado con digitalWrite(): en un Arduino Uno, enviar un byte tarda unos 100 µs. Con unos pocos LEDs no se nota, pero se queda corto si quieres actualizar una cadena de 10 chips miles de veces por segundo, regular el brillo de los LEDs por software o barrer un cubo de LEDs multiplexado. La buena noticia es que el protocolo del 74HC595 es en realidad SPI: DS corresponde a MOSI, SH_CP a SCK y ST_CP al pin de selección (CS). La unidad SPI por hardware del Uno envía un byte en aproximadamente 1 µs a 8 MHz; incluso sumando la sobrecarga de las llamadas, es decenas de veces más rápida que shiftOut(). Puedes ver cómo funciona SPI en la guía ¿Qué es SPI?.

Arduino (C++)
1// 74HC595'i donanım SPI ile sürmek (Arduino Uno) / Driving a 74HC595 over hardware SPI (Arduino Uno)
2#include <SPI.h>
3
4const int LATCH_PIN = 10;   // ST_CP; D11 (MOSI) = DS, D13 (SCK) = SH_CP
5
6void write595(byte value) {
7  SPI.beginTransaction(SPISettings(8000000, MSBFIRST, SPI_MODE0));  // 8 MHz, mod 0 / 8 MHz, mode 0
8  digitalWrite(LATCH_PIN, LOW);
9  SPI.transfer(value);              // 8 bit yaklaşık 1 µs'de / 8 bits in about 1 µs
10  digitalWrite(LATCH_PIN, HIGH);    // çıkışlara aktar / copy to the outputs
11  SPI.endTransaction();
12}
13
14void setup() {
15  pinMode(LATCH_PIN, OUTPUT);
16  SPI.begin();                      // D11 ve D13 SPI'ye geçer / D11 and D13 switch to SPI
17  write595(0);
18}
19
20void loop() {
21  static byte pattern = 0b00000001;
22  write595(pattern);
23  pattern = (pattern << 1) | (pattern >> 7);   // sola döndür / rotate left
24  delay(100);
25}

En SPI_MODE0 los datos se muestrean en el flanco de subida del reloj, exactamente igual que en el 74HC595. MSBFIRST vuelve a enviar el bit 7 a Q7, así que los patrones de los ejemplos anteriores funcionan sin cambios. En el Uno, D10 debe ser una salida para que el SPI por hardware se mantenga en modo maestro; SPI.begin() ya lo configura, y por eso D10 es el mejor pin para el latch. Si la cadena tiene varios chips, basta con llamar a SPI.transfer() una vez por chip entre el latch en LOW y en HIGH. MISO (D12) no se usa en este circuito y queda libre para otro dispositivo SPI.

Brillo con OE y borrado con MR

El pin OE (output enable) es un interruptor que activa o desactiva todas las salidas de una vez. Si lo conectas a uno de los pines PWM del Uno, por ejemplo D9, en lugar de a GND, puedes regular el brillo de todos los LEDs a la vez con PWM. Como OE es activo en LOW, la lógica va al revés: analogWrite(9, 0) significa brillo máximo y analogWrite(9, 255) totalmente apagado. Escribir analogWrite(9, 255 - brillo) en el código te lo pone más fácil. Este método afecta a todos los LEDs por igual; para ajustar el brillo de cada LED por separado tendrás que hacerlo por software con actualizaciones SPI rápidas o pasarte a LEDs direccionables como el WS2812B.

Cuando el pin MR (master reset) pasa a LOW, se borran todos los bits del registro de desplazamiento, pero las salidas no se apagan al momento porque el registro de almacenamiento conserva el valor anterior. Para apagar también las salidas, hay que enviar un flanco de subida al pin de latch mientras MR está en LOW. En la práctica, conectar MR directamente a VCC y borrar por software con write595(0) te ahorra un pin y un cable. Además está el tema del arranque: al dar alimentación, el registro de almacenamiento empieza con un valor aleatorio y los LEDs pueden encenderse un instante sin orden. En una placa de relés esto puede ser peligroso; para evitarlo, pon OE a VCC con una resistencia de 10 kΩ, llama primero a write595(0) en setup() y después pon el pin OE en LOW.

74HC595 con ESP32: 3,3 V y SPI

Los pines del ESP32 dan 3,3 V. Si alimentas el 74HC595 a 5 V, una entrada necesita unos 0,7 × VCC, es decir 3,5 V, para considerarse HIGH; 3,3 V se queda por debajo de ese umbral y el funcionamiento se vuelve inestable. La solución más limpia es alimentar también el chip desde el pin 3V3 del ESP32, ya que el 74HC595 funciona a partir de 2 V. Si de verdad necesitas alimentar el chip a 5 V, usa el 74HCT595, cuyas entradas ya ven como HIGH cualquier tensión por encima de 2 V, o añade un conversor de nivel lógico. A 3,3 V, 220 Ω va bien para LEDs rojos, amarillos y verdes; los azules y blancos, con una tensión directa de unos 3 V, lucen muy poco a 3,3 V.

El ejemplo de abajo usa los pines VSPI del ESP32 (SCK en GPIO 18, MOSI en GPIO 23) para reproducir el efecto coche fantástico en 16 LEDs conectados a dos 74HC595 en cascada; GPIO 5 hace de latch. La velocidad SPI se fija en 4 MHz porque el límite de velocidad del 74HC595 baja con la tensión de alimentación, y 4 MHz deja un amplio margen de seguridad a 3,3 V. shiftOut() también funciona en el ESP32 y es mucho más rápido que en el Uno gracias al procesador de 240 MHz; aun así, usar SPI libera al procesador para tareas como el Wi-Fi. Para lo básico de la placa y la elección de pines seguros, consulta ¿Qué es el ESP32?.

Arduino (C++)
1// ESP32 + iki 74HC595 (SPI) ile 16 LED karaşimşek / 16-LED Knight Rider on ESP32 with two 74HC595s (SPI)
2#include <SPI.h>
3
4const int SCK_PIN = 18;    // SH_CP
5const int MOSI_PIN = 23;   // DS
6const int LATCH_PIN = 5;   // ST_CP
7
8void write16(uint16_t value) {
9  SPI.beginTransaction(SPISettings(4000000, MSBFIRST, SPI_MODE0));  // 3,3 V için 4 MHz yeterli / 4 MHz is plenty at 3.3 V
10  digitalWrite(LATCH_PIN, LOW);
11  SPI.transfer(highByte(value));    // önce uzaktaki entegre / far chip first
12  SPI.transfer(lowByte(value));     // sonra yakındaki / then the near chip
13  digitalWrite(LATCH_PIN, HIGH);
14  SPI.endTransaction();
15}
16
17void setup() {
18  pinMode(LATCH_PIN, OUTPUT);
19  SPI.begin(SCK_PIN, -1, MOSI_PIN, -1);   // MISO ve SS kullanılmıyor / MISO and SS unused
20  write16(0);
21}
22
23void loop() {
24  for (int i = 0; i < 16; i++) { write16(bit(i)); delay(40); }   // ileri / forward
25  for (int i = 14; i > 0; i--) { write16(bit(i)); delay(40); }   // geri / backward
26}

74HC595 con Raspberry Pi Pico y MicroPython

En la Pico, alimenta también el 74HC595 desde el pin 3V3(OUT). MicroPython no tiene un equivalente directo de shiftOut() de Arduino, pero el SPI por hardware hace el trabajo de sobra: se usan los pines GP18 (SCK) y GP19 (MOSI) de la unidad SPI0, y cualquier GPIO sirve como latch; aquí se eligió GP17. MicroPython reserva también el pin MISO de SPI0 (GP16) para SPI, así que no lo conectes a otra cosa. Si pasas varios bytes a spi.write(), actualizas todos los chips de la cadena de una vez, y otra vez el primer byte va al chip más lejano. Para la instalación y los primeros pasos, consulta ¿Qué es la Raspberry Pi Pico?.

MicroPython
1# Pico + 74HC595: yürüyen LED ve ikilik sayaç (SPI) / Pico + 74HC595: running light and binary counter (SPI)
2from machine import Pin, SPI
3import time
4
5# GP18 = SCK -> SH_CP, GP19 = MOSI -> DS; GP16 (MISO) boş kalır / GP16 (MISO) stays unconnected
6spi = SPI(0, baudrate=4000000, polarity=0, phase=0, sck=Pin(18), mosi=Pin(19))
7latch = Pin(17, Pin.OUT, value=1)    # ST_CP
8
9def write595(*values):
10    # birden çok bayt = zincirdeki entegreler, ilk bayt en uzaktakine
11    # several bytes = chained chips, the first byte goes to the far chip
12    latch.value(0)
13    spi.write(bytes(values))
14    latch.value(1)                   # yükselen kenar: çıkışlara aktar / rising edge: copy to the outputs
15
16write595(0)
17while True:
18    for i in range(8):               # yürüyen LED / running light
19        write595(1 << i)
20        time.sleep_ms(80)
21    for n in range(256):             # ikilik sayaç / binary counter
22        write595(n)
23        time.sleep_ms(20)

Cargas mayores: transistor, ULN2803 y TPIC6B595

Las salidas del 74HC595 solo sirven para corrientes pequeñas de LED. No conectes directamente cargas como la bobina de un relé (70–90 mA), un motor pequeño, varios zumbadores o una tira LED de 12 V. Puedes poner un transistor NPN detrás de cada salida o usar el ULN2803, que reúne ocho transistores Darlington en un solo encapsulado: conmuta hasta 500 mA por canal en el lado de GND y lleva integrados diodos de protección para cargas inductivas; para que actúen, conecta su pin COM a la alimentación de la carga. Una solución más compacta es el TPIC6B595, que se programa igual que el 74HC595 pero tiene potentes salidas en drenador abierto: soporta 150 mA continuos por salida y puede conmutar cargas de hasta 50 V. Tiene 20 pines, así que su patillaje es distinto, y las cargas se conectan entre el positivo y la salida.

¿74HC595, MAX7219 o TM1637?

Característica74HC595MAX7219TM1637WS2812B
Pines de control3 (DS, SH_CP, ST_CP)3 (DIN, CLK, CS)2 (CLK, DIO)1 (DIN)
Salidas8 por chip, encadenables64 LEDs (8 dígitos o una matriz 8x8)7 segmentos de 4–6 dígitosCada LED con su propia dirección
Limitación de corrienteUna resistencia por LEDUna sola resistencia (RSET) para todosIncluida en el móduloDentro del LED
BrilloPWM global mediante OE16 niveles, por software8 niveles256 niveles por canal de color
Ideal paraBarras de LEDs, placas de relés, salidas de uso generalMatrices de LEDs, displays de varios dígitosRelojes, contadoresEfectos de color, tiras

Si necesitas una barra de LEDs sencilla, una placa de 8 relés o salidas digitales que hagan cada una un trabajo distinto, el 74HC595 es la opción más barata y flexible. Para matrices de LEDs de 8x8 o displays de varios dígitos, el MAX7219, que se encarga él solo del multiplexado, te facilita mucho la vida. Si quieres luces de colores controladas una a una, los LEDs WS2812B NeoPixel funcionan con un solo pin de datos.

Ideas de proyectos con el 74HC595

  • Coche fantástico de 16 LEDs: Monta el efecto de ida y vuelta con dos chips en cascada y ajusta su velocidad con un potenciómetro.
  • Indicador de nivel con barra de LEDs: Muestra el valor de un sensor o un nivel de sonido en una barra de 8–16 LEDs.
  • Sensor de aparcamiento: Enciende más LEDs, de verde a rojo, a medida que se acorta la distancia medida con un HC-SR04.
  • Marcador de dos dígitos: Haz un contador con botones y sin parpadeos usando dos displays de 7 segmentos y dos chips en cascada.
  • Reloj binario: Muestra horas, minutos y segundos como números binarios en columnas de LEDs, tomando la hora de un módulo de reloj RTC.
  • Cubo de LEDs 3x3x3: Crea animaciones en 3D controlando las capas con transistores y las columnas con 74HC595; los detalles están en la guía Cubo de LEDs con Arduino.
  • Placa de 8 relés: Controla ocho relés desde 3 pines con un ULN2803 o un TPIC6B595.

Errores comunes y cómo solucionarlos

SíntomaCausa probableSolución
No se enciende ningún LEDOE al aire o en HIGH, MR fijo en LOWConecta OE a GND y MR a VCC
Los LEDs nunca cambianEl latch (ST_CP) no se activa o está en otro pinLleva el latch de LOW a HIGH después de shiftOut() y revisa el número de pin
Los LEDs parpadean al desplazar o el patrón está corrido un bitSH_CP y ST_CP están unidos; entonces el registro de desplazamiento va siempre un pulso de reloj por delante del de almacenamientoUsa un pin propio para el latch y ponlo en HIGH solo después de enviar todos los bytes
Los LEDs se encienden en orden inversoOrden de bits cambiado o Q0 mal colocadoCambia MSBFIRST por LSBFIRST y comprueba que Q0 está en el pin 15
Los chips de la cadena están intercambiados o uno va un paso por detrásBytes enviados en orden inverso, o el DS del chip 2 conectado a Q7 (pin 7) en lugar de a Q7'Envía primero el byte del chip lejano y conecta DS al pin 9
Con muchos LEDs encendidos todos bajan de brillo y el chip se calientaLa corriente total supera el límite de 70 mAUsa resistencias de 470 Ω–1 kΩ o un ULN2803 / TPIC6B595
Los LEDs se encienden al azar y cambian al tocar los cablesFalta el condensador, cables largos o una entrada al airePon 100 nF entre VCC y GND, acorta los cables y no dejes nunca OE ni MR al aire
Funciona de forma inestable con ESP32 o PicoEl chip está alimentado a 5 V y la señal de 3,3 V no llega a HIGHAlimenta el chip desde 3V3 o usa un 74HCT595
Si el circuito no funciona, reduce el código a lo mínimo: envía write595(0b10101010) y mira qué LEDs se encienden. Si con MSBFIRST se encienden los de Q1, Q3, Q5 y Q7, el cableado y el orden de bits son correctos. Si no se enciende ninguno, mide con el multímetro la tensión de alimentación en el pin 16, 0 V en el pin 13 y de nuevo la tensión de alimentación en el pin 10; si alguna de estas tres lecturas es incorrecta, el problema está en el cableado.

El 74HC595 es la forma más barata y didáctica de resolver la falta de pines. Cuando entiendes la idea de desplazar y fijar con el latch, la reconoces en los dispositivos SPI, en los drivers de matrices de LEDs y en los módulos de display, y también al leer botones con un 74HC165. Empieza con el contador de 8 LEDs, alarga después la cadena y pásate a SPI. En la app BlueGrays encontrarás proyectos de secuencia de LEDs, coche fantástico, efectos con velocidad regulable y contadores de 7 segmentos para Arduino, ESP32 y Raspberry Pi Pico, paso a paso con esquemas y código.

Preguntas frecuentes

¿Para qué sirve el 74HC595?

El 74HC595 es un registro de desplazamiento que convierte los datos en serie de un microcontrolador en 8 salidas en paralelo. Te permite controlar 8 LEDs, un display de 7 segmentos o, mediante transistores, relés usando solo 3 pines de Arduino. Conectando varios chips en cascada obtienes 16, 24 o más salidas con esos mismos 3 pines.

¿Cuántos 74HC595 se pueden conectar en cascada?

No hay un límite teórico: la salida Q7' de cada chip va a la entrada DS del siguiente y las líneas de reloj y latch son comunes. En la práctica, el límite lo marcan el tiempo de actualización y la carga en la línea de reloj común; en el Uno, shiftOut() añade unos 100 µs por chip, mientras que con SPI son unos pocos microsegundos. En cadenas largas, pon un condensador de 100 nF en cada chip y mantén los cables cortos.

¿Cuánta corriente da una salida del 74HC595?

La hoja de datos garantiza las tensiones de salida a 6 mA por salida; el límite absoluto es de 35 mA por salida y 70 mA en total por el pin VCC o GND. Como los ocho LEDs pueden estar encendidos a la vez, apuntar a 6–8 mA por LED es lo seguro. A 5 V eso equivale a una resistencia de unos 470 Ω.

¿El 74HC595 funciona con ESP32 a 3,3 V?

Sí. El 74HC595 funciona entre 2 y 6 V, así que puede alimentarse desde el pin 3V3 de un ESP32 o una Pico y reconoce sin problemas las señales de 3,3 V. Si alimentas el chip a 5 V, las señales de 3,3 V pueden quedar por debajo del umbral de HIGH; en ese caso usa un 74HCT595 o un conversor de nivel lógico.

¿Para qué sirve el pin latch del 74HC595?

El pin de latch (ST_CP o RCLK) es el disparador que pasa a las salidas los bits que has metido en el registro de desplazamiento. Mientras los bits se desplazan, las salidas mantienen su valor anterior; cuando llega un flanco de subida al pin de latch, las ocho salidas se actualizan a la vez. Así los LEDs no parpadean durante el envío y todos los chips de una cadena cambian al mismo tiempo.

¿Se puede controlar un relé o un motor con el 74HC595?

No directamente; sus salidas solo sirven para corrientes de LED de unos pocos miliamperios. Para relés, motores o tiras LED, añade un transistor a cada salida o usa un ULN2803, que conmuta hasta 500 mA por canal. El TPIC6B595, que se programa igual, es una alternativa potente que soporta 150 mA por salida.

Ver todos los proyectos
Luz secuencial LED
#5Intermedio

Luz secuencial LED

Proyecto que crea un efecto de luz secuencial encendiendo 6 LEDs en secuencia. Enseña el uso de array y control de múltiples pines con bucle for.

4.6(83)
193
Efecto coche fantástico con LED
#6Intermedio

Efecto coche fantástico con LED

Proyecto que crea un efecto de relámpago negro al estilo de Knight Rider encendiendo 6 LEDs de un lado a otro en secuencia. Enseña lógica de bucle bidireccional.

4.8(104)
189
Luz secuencial LED con velocidad regulable
#7Intermedio

Luz secuencial LED con velocidad regulable

El proyecto que puede ajustar la velocidad de la luz secuencial LED en tiempo real con el potenciómetro. Enseña el control dinámico del tiempo de retardo mediante la lectura del valor del potenciómetr

4.6(71)
134
Efecto coche fantástico con velocidad regulable
#8Intermedio

Efecto coche fantástico con velocidad regulable

Proyecto con potenciómetro que permite ajustar en tiempo real la velocidad de la animación LED del coche fantástico. Combina entrada analógica y control de bucle bidireccional.

4.5(59)
115
LED Secuencial ESP32 (Knight Rider)
#108Principiante
Premium

LED Secuencial ESP32 (Knight Rider)

6 LEDs moviéndose secuencialmente de izquierda a derecha y de derecha a izquierda (estilo Knight Rider). Ejemplo básico del uso del bucle for y arrays. Enseña la lógica del cambio de dirección.

4.5(19)
32
Raspberry Pi Pico LED Secuencial (6 LEDs, GP14 → GP9)
#153Principiante
Premium

Raspberry Pi Pico LED Secuencial (6 LEDs, GP14 → GP9)

¡Animación clásica de LED secuencial con Pico — versión 6 LEDs! 6 LEDs se encienden de izquierda a derecha secuencialmente. Aprende lista Python, comprensión de listas ([Pin(p, Pin.OUT) for p in LED_PINS]), bucle for con control de pines y enumerate(). 6 LEDs en GP9-GP14, cada uno con resistencia 220Ω. Código muy limpio: en lugar de definir 6 LEDs uno por uno, usamos una lista — puedes añadir LED hasta agotar los GPIO libres y utilizables, cada uno con su propia resistencia. Para controlar 100 L

0.0(0)
8
Mostrar números del 0 al 9 en un display de 7 segmentos
#41Intermedio
Premium

Mostrar números del 0 al 9 en un display de 7 segmentos

Proyecto que muestra números del 0 al 9 en secuencia en display de 7 segmentos. Enseña la lógica de la creación de números mediante el control de los pines de segmento.

4.5(30)
42
Mostrar números del 0 al 99 en un display de 7 segmentos
#42Avanzado
Premium

Mostrar números del 0 al 99 en un display de 7 segmentos

Proyecto que muestra números del 0 al 99 con display de 7 segmentos de dos dígitos. Enseña operaciones con bits (bitRead) y lógica de descomposición de dígitos de una decena.

4.5(27)
35