Estoy haciendo un programa para el msp430 usando el launchpad de energia, el primer código que tuve fue el siguiente:
// display flag
boolean flag_display = false;
void setup() {
// define ISR to activate the display
attachInterrupt(PUSH2, display_ISR, CHANGE);
}
void display_ISR() {
clean_leds();
flag_display = !flag_display;
}
void loop() {
if(flag_display == true) {
// prints the number 45 on the display
pick_digit(1);
pick_number(4);
delay(8);
pick_digit(2);
pick_number(5);
delay(8);
}
}
Básicamente, el programa presenta el número 45 en la pantalla cada vez que se presiona el botón PUSH2 y limpia la pantalla cada vez que no se presiona el botón, el problema es que algunas veces (cuando el botón no se presiona y el programa está aún en el primer retraso) el número 5 en el segundo dígito permanece presente, así que utilicé lo siguiente para evitar este problema:
// display flag
boolean flag_display = false;
// delay flag from the display
boolean flag_delay = true;
void setup() {
// define ISR to activate the display
attachInterrupt(PUSH2, display_ISR, CHANGE);
}
void display_ISR() {
flag_display = !flag_display;
}
void loop() {
if(flag_display == true) {
// prints the number 45 on the display
pick_digit(1);
pick_number(4);
delay(8);
pick_digit(2);
pick_number(5);
delay(8);
// if the code runs till the end, un-flag the delay flag
flag_delay = false;
}
// Keeps cleaning the leds until the delayed code is over processing
if(flag_display == false && flag_delay == false) {
clean_leds();
flag_delay = !flag_delay;
}
}
Pero leí que el uso de indicadores en su programa es una mala práctica de programación y mi solución no parece elegante ni eficiente desde el punto de vista de la línea:
flag_delay = false;
Se seguirá procesando cada vez que la pantalla esté encendida, y la función clean_leds () se seguirá procesando hasta que el código retrasado haya terminado. ¿Hay una forma más eficiente de usar los ISR y las banderas en este caso particular? Gracias.
La función clean_leds () tiene lo siguiente:
void clean_leds()
{
digitalWrite(P1_7, LOW);
digitalWrite(P1_6, LOW);
digitalWrite(P2_5, LOW);
digitalWrite(P2_4, LOW);
digitalWrite(P2_3, LOW);
digitalWrite(P2_2, LOW);
digitalWrite(P2_1, LOW);
}