Cómo hacer si la condición se ejecuta una vez cada vez (1)

0

Estoy integrando entradas y uart en PIC MCU. Mi programa es si presiono un interruptor, esta información se envía al terminal, pero el problema es que se sigue mostrando hasta que suelte el interruptor. Quiero que se muestre solo por una vez, sin importar cuánto tiempo se esté presionando el interruptor.

Por ejemplo:

while(1)
{
  if(switch == pressed)
  putsUART("switch 1 pressed");

 }

Es solo un pseudo código. Esto se sigue mostrando como está en while (1), pero hay alguna lógica o alguna función que lo muestre por una vez, y si alguien presiona el interruptor nuevamente, se imprime nuevamente por una vez.

    
pregunta anna carolina

2 respuestas

4

Si entiendo correctamente, desea imprimirlo solo una vez por cada vez que se presiona el botón, pero como el controlador girará bastante rápido, actualmente para una sola pulsación tendrá múltiples impresiones.

Así que para evitar eso, tendrá que guardar lo que lo imprimió, y siempre que se guarde, no lo imprima. Si se suelta el botón, borra la variable guardada para que se imprima de nuevo en la próxima pulsación del botón.

Algo como esto:

bool printedOut = false;
while (true)
{
    if (switch == pressed)
    {
        if (!printedOut)
        {
            putsUART("switch 1 pressed");
            printedOut = true;
        }
    }
    else
    {
        printedOut = false;
    }
}

Tenga en cuenta que esto es propenso al rebote del conmutador y tendrá que rebotar el conmutador en el software o en el hardware para obtener solo una impresión por impresión.

    
respondido por el Arsenal
0

Puedes "mantener" el proceso con otro 'while'. El putsUART se ejecutará después de que el usuario suelte el interruptor.

while(1)
{
  if(switch == pressed)
  {
     while(switch == pressed); //this semicolon is important to hold the process
    putsUART("switch 1 pressed");
  }
}

Alternativamente, podemos colocar una posición después de putsUART ejecutado. Con este código, putsUART se ejecutará después de que el usuario presione el interruptor.

while(1)
{
  if(switch == pressed)
  {
  putsUART("switch 1 pressed");
  while(switch == pressed); //this semicolon is important to hold the process
  }
}

Puede agregar un retraso para eliminar el efecto de rebote reemplazando

while(switch == pressed);

con

while(switch == pressed) delay_ms(100);
    
respondido por el Oka

Lea otras preguntas en las etiquetas