int DIGIT1=16;
int DIGIT2 =17;
int DIGIT3 =18;
int DIGIT4 =19;
int SEGMENT_A =13;
int SEGMENT_B =12;
int SEGMENT_C =14;
int SEGMENT_D =27;
int SEGMENT_E =26;
int SEGMENT_F =25;
int SEGMENT_G =33;
int SEGMENT_DP =32;
int SEGMENT_CLN =4;
int digit_counter=1;
int min_dec=1, min_uni=2, seg_dec=0, seg_uni=9;
long timer_clock_last=0, timer_clock_act=0, clock_period = 500;
long timer_digit_last=0, timer_digit_act=0, digit_period = 5;
byte display_code[11]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6,0x6C};
/*
retlw 0xFC
retlw 0x60
retlw 0xDA
retlw 0xF2
retlw 0x66
retlw 0xB6
retlw 0xBE
retlw 0xE0
retlw 0xFE
retlw 0xF6
retlw 0x6C
*/
hw_timer_t *timerClock = NULL;
hw_timer_t *timerMux = NULL; // Para el multiplexado cada 5ms
portMUX_TYPE Mux = portMUX_INITIALIZER_UNLOCKED;
volatile bool flag = false;
void IRAM_ATTR onTimer(); // Declaración anticipada
void update_digit(int value);
void OFF();
void onClock();
void onMux();
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
Serial.println("Hello, ESP32!");
pinMode(DIGIT1,OUTPUT);
pinMode(DIGIT2,OUTPUT);
pinMode(DIGIT3,OUTPUT);
pinMode(DIGIT4,OUTPUT);
pinMode(SEGMENT_A,OUTPUT);
pinMode(SEGMENT_B,OUTPUT);
pinMode(SEGMENT_C,OUTPUT);
pinMode(SEGMENT_D,OUTPUT);
pinMode(SEGMENT_E,OUTPUT);
pinMode(SEGMENT_F,OUTPUT);
pinMode(SEGMENT_G,OUTPUT);
pinMode(SEGMENT_DP,OUTPUT);
pinMode(SEGMENT_CLN,OUTPUT);
digitalWrite(DIGIT1, LOW);
digitalWrite(DIGIT2, LOW);
digitalWrite(DIGIT3, LOW);
digitalWrite(DIGIT4, LOW);
digitalWrite(SEGMENT_A, LOW);
digitalWrite(SEGMENT_B, LOW);
digitalWrite(SEGMENT_C, LOW);
digitalWrite(SEGMENT_D, LOW);
digitalWrite(SEGMENT_E, LOW);
digitalWrite(SEGMENT_F, LOW);
digitalWrite(SEGMENT_G, LOW);
digitalWrite(SEGMENT_DP, LOW);
digitalWrite(SEGMENT_CLN, LOW);
// Timer para multiplexado (5 ms)
timerMux = timerBegin(1);
timerAttachInterrupt(timerMux, &onMux);
timerWrite(timerMux, 5000); // 5 ms
timerAlarm(timerMux, 5000, true, 0); // 500ms segundos, autoreload ON, infinito
}
void loop() {
// put your main code here, to run repeatedly:
update_digit(digit_counter);
}
void update_digit(int value){
OFF();
switch (value) {
case 1:
digitalWrite(DIGIT1, LOW);
digitalWrite(DIGIT2, HIGH);
digitalWrite(DIGIT3, HIGH);
digitalWrite(DIGIT4, HIGH);
mostrar(min_dec);
break;
case 2:
digitalWrite(DIGIT1, HIGH);
digitalWrite(DIGIT2, LOW);
digitalWrite(DIGIT3, HIGH);
digitalWrite(DIGIT4, HIGH);
mostrar(min_uni);
break;
case 3:
digitalWrite(DIGIT1, HIGH);
digitalWrite(DIGIT2, HIGH);
digitalWrite(DIGIT3, LOW);
digitalWrite(DIGIT4, HIGH);
mostrar(seg_dec);
break;
case 4:
digitalWrite(DIGIT1, HIGH);
digitalWrite(DIGIT2, HIGH);
digitalWrite(DIGIT3, HIGH);
digitalWrite(DIGIT4, LOW);
mostrar(seg_uni);
break;
default:
digitalWrite(DIGIT1, HIGH);
digitalWrite(DIGIT2, HIGH);
digitalWrite(DIGIT3, HIGH);
digitalWrite(DIGIT4, HIGH);
break;
}
}
void IRAM_ATTR onMux() {
portENTER_CRITICAL_ISR(&Mux);
digit_counter++;
if (digit_counter > 4)
digit_counter = 1;
portEXIT_CRITICAL_ISR(&Mux);
}
void mostrar(int dato){
digitalWrite(SEGMENT_A, bitRead(display_code[dato], 7));
digitalWrite(SEGMENT_B, bitRead(display_code[dato], 6));
digitalWrite(SEGMENT_C, bitRead(display_code[dato], 5));
digitalWrite(SEGMENT_D, bitRead(display_code[dato], 4));
digitalWrite(SEGMENT_E, bitRead(display_code[dato], 3));
digitalWrite(SEGMENT_F, bitRead(display_code[dato], 2));
digitalWrite(SEGMENT_G, bitRead(display_code[dato], 1));
digitalWrite(SEGMENT_DP, bitRead(display_code[dato], 0));
}
void OFF(){
digitalWrite(SEGMENT_A, LOW);
digitalWrite(SEGMENT_B, LOW);
digitalWrite(SEGMENT_C, LOW);
digitalWrite(SEGMENT_D, LOW);
digitalWrite(SEGMENT_E, LOW);
digitalWrite(SEGMENT_F, LOW);
digitalWrite(SEGMENT_G, LOW);
digitalWrite(SEGMENT_DP, LOW);
digitalWrite(SEGMENT_CLN, LOW);
}