#include <Arduino.h>
#define COLUMNA1 8
#define COLUMNA2 9
#define SEGMENTOA 5
#define SEGMENTOB 4
#define SEGMENTOC 12
#define SEGMENTOD 2
#define SEGMENTOE 3
#define SEGMENTOF 6
#define SEGMENTOG 7
#define SEGMENTODP 11
// Tabla de conversión BCD a 7 segmentos
const byte Tabla_Digitos_BCD_7seg[] = {
0b00111111, // 0
0b00000110, // 1
0b01011011, // 2
0b01001111, // 3
0b01100110, // 4
0b01101101, // 5
0b01111101, // 6
0b00000111, // 7
0b01111111, // 8
0b01101111 // 9
};
volatile int currentNumber = 0;
unsigned long previousMillis = 0;
const unsigned long interval = 500; // Intervalo de actualización en milisegundos (más rápido)
volatile int currentColumn = 0;
void setup() {
Serial.begin(9600);
DISPLAY7SEG_Init();
Timer1_Initialize();
}
void loop() {
unsigned long currentMillis = millis();
// Cambiar el número cada intervalo
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
currentNumber++;
if (currentNumber > 99) {
currentNumber = 0;
}
}
}
void DISPLAY7SEG_Init(void) {
pinMode(COLUMNA1, OUTPUT);
pinMode(COLUMNA2, OUTPUT);
pinMode(SEGMENTOA, OUTPUT);
pinMode(SEGMENTOB, OUTPUT);
pinMode(SEGMENTOC, OUTPUT);
pinMode(SEGMENTOD, OUTPUT);
pinMode(SEGMENTOE, OUTPUT);
pinMode(SEGMENTOF, OUTPUT);
pinMode(SEGMENTOG, OUTPUT);
pinMode(SEGMENTODP, OUTPUT);
// Apagar todos los segmentos y columnas al inicio
DISPLAY7SEG_ApagaTodo();
}
void DISPLAY7SEG_ApagaTodo(void) {
// Apagar todas las columnas
digitalWrite(COLUMNA1, HIGH);
digitalWrite(COLUMNA2, HIGH);
// Apagar todos los segmentos
digitalWrite(SEGMENTOA, LOW);
digitalWrite(SEGMENTOB, LOW);
digitalWrite(SEGMENTOC, LOW);
digitalWrite(SEGMENTOD, LOW);
digitalWrite(SEGMENTOE, LOW);
digitalWrite(SEGMENTOF, LOW);
digitalWrite(SEGMENTOG, LOW);
digitalWrite(SEGMENTODP, LOW);
}
void DISPLAY7SEG_EscribeDato(int numero) {
if (numero < 0 || numero > 9) return; // Validación del número
// Escribir el número en los segmentos
byte codigo = Tabla_Digitos_BCD_7seg[numero];
digitalWrite(SEGMENTOA, (codigo & 0x01) ? HIGH : LOW);
digitalWrite(SEGMENTOB, (codigo & 0x02) ? HIGH : LOW);
digitalWrite(SEGMENTOC, (codigo & 0x04) ? HIGH : LOW);
digitalWrite(SEGMENTOD, (codigo & 0x08) ? HIGH : LOW);
digitalWrite(SEGMENTOE, (codigo & 0x10) ? HIGH : LOW);
digitalWrite(SEGMENTOF, (codigo & 0x20) ? HIGH : LOW);
digitalWrite(SEGMENTOG, (codigo & 0x40) ? HIGH : LOW);
digitalWrite(SEGMENTODP, (codigo & 0x80) ? HIGH : LOW);
}
void Timer1_Initialize() {
noInterrupts(); // Deshabilitar interrupciones
TCCR1A = 0; // Configurar el registro de control A de Timer1
TCCR1B = 0; // Configurar el registro de control B de Timer1
TCNT1 = 0; // Inicializar el contador de Timer1 a 0
OCR1A = 249; // Establecer el valor de comparación para 1ms
TCCR1B |= (1 << WGM12); // Modo CTC
TCCR1B |= (1 << CS11) | (1 << CS10); // Prescaler 64
TIMSK1 |= (1 << OCIE1A); // Habilitar la interrupción de comparación
interrupts(); // Habilitar interrupciones
}
ISR(TIMER1_COMPA_vect) {
DISPLAY7SEG_ApagaTodo(); // Apagar todos los segmentos y columnas
// Mostrar el dígito correspondiente
if (currentColumn == 0) {
DISPLAY7SEG_EscribeDato(currentNumber / 10); // Mostrar decenas
digitalWrite(COLUMNA1, LOW); // Encender columna 1
} else if (currentColumn == 1) {
DISPLAY7SEG_EscribeDato(currentNumber % 10); // Mostrar unidades
digitalWrite(COLUMNA2, LOW); // Encender columna 2
}
currentColumn++;
if (currentColumn >= 2) { // Solo hay 2 columnas
currentColumn = 0;
}
}