// -------- DISPLAY 1 --------
#define A1 23
#define B1 22
#define C1 21
#define D1 19
#define E1 18
#define F1 5
#define G1 17
// -------- DISPLAY 2 --------
#define A2 16
#define B2 4
#define C2 14
#define D2 15
#define E2 13
#define F2 2
#define G2 0
// -------- DISPLAY 3 --------
#define A3 27
#define B3 26
#define C3 25
#define D3 33
#define E3 32
#define F3 12
#define G3 11
// -------- DIP SWITCH (Pines limpios de entrada) --------
#define SW1 36
#define SW2 39
#define SW3 34
#define SW4 35
int seg1[] = {A1, B1, C1, D1, E1, F1, G1};
int seg2[] = {A2, B2, C2, D2, E2, F2, G2};
int seg3[] = {A3, B3, C3, D3, E3, F3, G3};
// Tu cédula: 1097189583- (16 estados continuos obligatorios)
char datos[16] = {
'1','0','9','7',
'1','8','9','5',
'8','3','-','1',
'0','9','7','1'
};
// Matriz de segmentos (Cátodo Común)
byte numeros[10][7] = {
{1,1,1,1,1,1,0}, // 0
{0,1,1,0,0,0,0}, // 1
{1,1,0,1,1,0,1}, // 2
{1,1,1,1,0,0,1}, // 3
{0,1,1,0,0,1,1}, // 4
{1,0,1,1,0,1,1}, // 5
{1,0,1,1,1,1,1}, // 6
{1,1,1,0,0,0,0}, // 7
{1,1,1,1,1,1,1}, // 8
{1,1,1,1,0,1,1} // 9
};
void setup() {
Serial.begin(115200);
// Configurar pines de los displays como salidas
for(int i = 0; i < 7; i++) {
pinMode(seg1[i], OUTPUT);
pinMode(seg2[i], OUTPUT);
pinMode(seg3[i], OUTPUT);
}
// Configurar interruptores
pinMode(SW1, INPUT_PULLUP);
pinMode(SW2, INPUT_PULLUP);
pinMode(SW3, INPUT_PULLUP);
pinMode(SW4, INPUT_PULLUP);
}
void apagar(int seg[]) {
for(int i = 0; i < 7; i++) {
digitalWrite(seg[i], LOW);
}
}
void mostrar(int seg[], char numero) {
apagar(seg);
if(numero == '-') {
digitalWrite(seg[6], HIGH); // Enciende solo la línea del medio
return;
}
int n = numero - '0';
for(int i = 0; i < 7; i++) {
digitalWrite(seg[i], numeros[n][i]);
}
}
void loop() {
// Lógica binaria combinacional pura
int estado = (!digitalRead(SW1)) * 1 +
(!digitalRead(SW2)) * 2 +
(!digitalRead(SW3)) * 4 +
(!digitalRead(SW4)) * 8;
Serial.print("Estado actual: ");
Serial.println(estado);
// Desplazamiento circular de los datos en los displays
mostrar(seg1, datos[estado]);
mostrar(seg2, datos[(estado + 1) % 16]);
mostrar(seg3, datos[(estado + 2) % 16]);
delay(300);
}