Este proyecto implementa un visualizador binario–decimal–hexadecimal utilizando Arduino UNO, dos registros de desplazamiento 74HC595 en cascada y dos displays de 7 segmentos. El valor de entrada se define mediante un DIP-switch de 4 bits y puede visualizarse dinámicamente en decimal (00–15) o hexadecimal (00–0F).
🔍 ¿Qué hace este circuito?
- Lee un valor binario de 4 bits (0–15) desde un DIP-switch usando
INPUT_PULLUP. - Refleja cada bit en LEDs individuales para depuración visual.
- Muestra el valor en dos displays de 7 segmentos controlados por registros 74HC595.
- Permite cambiar en tiempo real entre modo DEC y modo HEX usando un DIP adicional.
🔧 Arquitectura del sistema
El sistema utiliza dos 74HC595 en cascada, lo que permite controlar 16 salidas digitales usando únicamente 3 pines del Arduino (DATA, CLOCK y LATCH). Cada registro controla un display completo de 7 segmentos.
Un detalle importante es que el display derecho es de ánodo común, por lo que sus segmentos deben activarse en nivel bajo. Esto se resuelve mediante una inversión lógica por software.
🧠 Lectura del DIP-switch (4 bits)
Cada switch está configurado como INPUT_PULLUP, por lo que ON = LOW = 1 lógico. El valor final se construye manualmente usando operaciones bit a bit.
byte readDip4() {
byte b3 = (digitalRead(A0) == LOW) ? 1 : 0; // MSB
byte b2 = (digitalRead(A1) == LOW) ? 1 : 0;
byte b1 = (digitalRead(A2) == LOW) ? 1 : 0;
byte b0 = (digitalRead(A3) == LOW) ? 1 : 0; // LSB
return (b3<<3) | (b2<<2) | (b1<<1) | b0;
}
🔢 Conversión DEC / HEX
El modo de visualización se selecciona con un DIP adicional. Cuando está activo, el sistema muestra el valor en hexadecimal; de lo contrario, lo presenta en decimal con dos dígitos.
if (isHexMode()) {
// HEX: 00..0F
show2digits(SEG_HEX[0], SEG_HEX[v]);
} else {
// DEC: 00..15
byte tens = v / 10;
byte units = v % 10;
show2digits(SEG_DEC[tens], SEG_DEC[units]);
}
⚡ Control de displays con 74HC595
La función show2digits() envía los datos seriales a los registros. El segundo display requiere inversión lógica debido a su tipo de conexión, lo que ilustra un caso real de hardware mixto.
void show2digits(byte left, byte right) {
digitalWrite(latchDisplay, LOW);
byte right_CA = right ^ 0x7F; // inversión para ánodo común
shiftOut(dataDisplay, clockDisplay, MSBFIRST, right_CA);
shiftOut(dataDisplay, clockDisplay, MSBFIRST, left);
digitalWrite(latchDisplay, HIGH);
}
🎓 ¿Qué se aprende con este proyecto?
- Uso práctico de registros de desplazamiento.
- Conversión entre binario, decimal y hexadecimal.
- Control eficiente de E/S con pocos pines.
- Diferencias reales entre cátodo común y ánodo común.
- Depuración visual mediante LEDs.
🚀 Ideas para extenderlo
- Eliminar Arduino y reemplazar la lógica con compuertas 74HC.
- Agregar multiplexado para más displays.
- Mostrar valores firmados o BCD.
- Convertirlo en un módulo educativo plug-and-play.
Código fuente: Link del proyecto en Tinkercad
No hay comentarios en este artículo.