Controle diferentes funciones usando el mismo botón. BRAZO 7

1

Estoy tratando de implementar un pequeño fragmento de código, y básicamente se puede simplificar a lo siguiente.

Tengo tres LED diferentes (por ejemplo, P0.0, P0.1 y amp; P0.2). Tengo un botón que cuando se presiona primero debe encender el LED en P0.0. Cuando se presiona de nuevo se debe encender P0.1 y así sucesivamente. El LED permanecerá encendido hasta que se detecte el siguiente botón pulsador.

En el siguiente código de prueba, me refiero a cada LED como una función. Mi idea fue incrementar un contador y, dependiendo del conteo, encender un LED en particular.

La salida de este código no es lo que espero. No hay transición entre las funciones. Cualquier sugerencia sobre cómo podría reestructurar este código sería útil.

No uso las interrupciones para este código. Además, no he incluido el debouncing ya que mi objetivo es poder reproducir este código desde cero en 15 minutos.

else if ( SW1 != (0x00000002) )  //when pressed     
    {
    delay();  //for debouncing
    count++;
    }   

    if (count == 1) {
        IO0SET = (1<<0);
        pattern1();
}
 else   if (count == 2) {
        IO0SET = (1<<6);
        pattern2();
}
     else   if (count == 3) {
        IO0SET = (1<<7);
        pattern3();
}

¿Hay alguna forma en la que pueda salir inmediatamente de la función actual, en lugar de tener que esperar a que termine?

    
pregunta John Smith

2 respuestas

2

No va a funcionar sin un rebote básico que, si no quieres usar interrupciones, significa una función de espera básica a menos que abuses en el hardware.

La funcionalidad prevista de su código parece ser llamar constantemente a las funciones del LED de configuración mientras se presiona el botón. Siguiendo su descripción, no hay necesidad de hacer esto, puede llamarlas una vez y luego esperar a que el botón aparezca. publicado. Permanecerán encendidas hasta que se llame a una función de configuración de LED diferente.

Finalmente, si está ANDing el registro IO con 0x02, el resultado es 2 o 0. En lugar de verificar un valor específico, puede usar la convención c que 0 es falso y todos los demás valores son verdaderos, esto hace que el código Mirando mucho más limpio. Mover eso a una función hace que sea aún más fácil de leer.

int SW1Pressed (void) {
  return !(IO0PIN & 0x00000002) //switch connected on P0.1. Low when pressed.
}

....

count = 0;
while (1){
  if (SW1Pressed()) {                         //when pressed
    wait_ms(100);                             // wait 100 ms
    if (SW1Pressed()) {                       // still pressed.
      if (count==0)                           // turn on correct led
        function1();
      else
        function2();

      if (++count == 2)                       // update count
        count = 0;

       while(SW1Pressed())                  // do nothing until the button is released
         ;
    }    
  }
}
    
respondido por el Andrew
1

Creo que el problema básico es que su código no rebota el interruptor. Al presionar un interruptor mecánico, inicialmente se abrirá y cerrará rápidamente. Esto hará que su código pase por las diversas funciones rápidamente.

Su código tiene comprobaciones de condición innecesarias que también podrían limpiarse. Básicamente, desea esperar a que se presione el botón, verifique si aún se presionó, digamos 75-100 ms más tarde y, en ese caso, espere a que se suelte el botón y luego incremente el contador de funciones y listo.

    
respondido por el Glenn W9IQ

Lea otras preguntas en las etiquetas