#include <Arduino.h>
#define DIGITOS_TOTAL 16
#define PINES_TOTAL 7
// Pines para el display de 7 segmentos (ESP32)
#define PIN_A 22
#define PIN_B 23
#define PIN_C 2
#define PIN_D 4
#define PIN_E 16
#define PIN_F 19
#define PIN_G 5
#define DP_PIN 18 // Pin para el punto decimal, si lo necesitas
// Pines para los interruptores DIP
#define DIP_1 33
#define DIP_2 32
#define DIP_3 25
#define DIP_4 26
// Arreglos de pines
int pines[PINES_TOTAL] = { PIN_A, PIN_B, PIN_C, PIN_D, PIN_E, PIN_F, PIN_G };
int dipSwitches[4] = { DIP_1, DIP_2, DIP_3, DIP_4 };
// Mapa de números para cátodo común en display de 7 segmentos
int digitos[DIGITOS_TOTAL][PINES_TOTAL] = {
{HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, LOW}, // 0
{LOW , HIGH, HIGH, LOW, LOW, LOW, LOW}, // 1
{HIGH, HIGH, LOW, HIGH, HIGH, LOW, HIGH}, // 2
{HIGH, HIGH, HIGH, HIGH, LOW, LOW, HIGH}, // 3
{LOW, HIGH, HIGH, LOW, LOW, HIGH, HIGH}, // 4
{HIGH, LOW, HIGH, HIGH, LOW, HIGH, HIGH}, // 5
{HIGH, LOW, HIGH, HIGH, HIGH, HIGH, HIGH}, // 6
{HIGH, HIGH, HIGH, LOW, LOW, LOW, LOW}, // 7
{HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH}, // 8
{HIGH, HIGH, HIGH, LOW, LOW, HIGH, HIGH}, // 9
{HIGH, HIGH, HIGH, LOW, HIGH, HIGH, HIGH}, // A
{LOW, LOW, HIGH, HIGH, HIGH, HIGH, HIGH}, // B
{HIGH, LOW, LOW, HIGH, HIGH, HIGH, LOW}, // C
{LOW, HIGH, HIGH, HIGH, HIGH, LOW, HIGH}, // D
{HIGH, LOW, LOW, HIGH, HIGH, HIGH, HIGH}, // E
{HIGH, LOW, LOW, LOW, HIGH, HIGH, HIGH} // F
};
void limpiar();
int leerDIP();
void mostrarDigito(int numero);
void mostrarSerial(int numero);
void configurarPines();
void setup() {
Serial.begin(115200);
Serial.println("Programa que muestra en un display de 7 segmentos el número introducido mediante interruptores DIP");
configurarPines();
}
void loop() {
int numero = leerDIP();
// Validar el número para que esté en el rango de 0 a 15
if (numero >= 0 && numero < DIGITOS_TOTAL) {
mostrarDigito(numero);
} else {
limpiar(); // Limpia el display si el número está fuera de rango
}
mostrarSerial(numero);
// Pausa para evitar lecturas demasiado rápidas
delay(200);
}
// Función para leer el valor de los DIP switches
int leerDIP() {
int valor = 0;
for(int i = 0; i < 4; i++) {
// Si el interruptor está en LOW, lo sumamos al valor
if (digitalRead(dipSwitches[i]) == LOW) {
valor |= (1 << i); // Sumar el valor correspondiente (2^i)
}
}
return valor;
}
// Función para mostrar el número en el display de 7 segmentos
void mostrarDigito(int numero) {
// Escribir los valores de los segmentos para el número dado
for(int pin = 0; pin < PINES_TOTAL; pin++) {
digitalWrite(pines[pin], digitos[numero][pin]);
}
}
// Función para limpiar el display (apagar todos los segmentos)
void limpiar() {
for(int pin = 0; pin < PINES_TOTAL; pin++) {
digitalWrite(pines[pin], LOW);
}
}
// Función para mostrar el valor en el monitor serial
void mostrarSerial(int numero) {
Serial.print("Entrada binaria: ");
Serial.print(numero, BIN);
Serial.print(" (Decimal: ");
Serial.print(numero);
Serial.println(")");
}
// Función para configurar los pines
void configurarPines() {
for(int pin = 0; pin < PINES_TOTAL; pin++) {
pinMode(pines[pin], OUTPUT);
}
pinMode(DP_PIN, OUTPUT); // Pin para el punto decimal
digitalWrite(DP_PIN, HIGH); // Apagar el punto decimal
for(int i = 0; i < 4; i++) {
pinMode(dipSwitches[i], INPUT_PULLUP);
}
}