Estoy tratando de implementar un pequeño fragmento de código, y básicamente se puede simplificar a lo siguiente.
Tengo tres LED diferentes (digamos P0.0, P0.1 y P0.2). Tengo un botón que, cuando se presiona, primero debe encender el LED en P0.0. Cuando se presiona nuevamente, debe encender P0.1 y así sucesivamente. El LED debe permanecer encendido hasta que se detecte el siguiente botón.
En el siguiente código de prueba, me refiero a cada LED como una función. Mi idea era incrementar un contador y dependiendo del conteo, encender un LED en particular.
El resultado de este código no es lo que esperaba. No hay transición entre funciones. Cualquier sugerencia sobre cómo podría reestructurar este código sería útil.
No quiero usar interrupciones para este código. Además, no he incluido la eliminación de rebotes, 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 manera de salir inmediatamente de la función actual, en lugar de tener que esperar a que termine?
No va a funcionar sin un rebote básico que, si no quiere usar interrupciones, significa una función de espera básica a menos que rebote en el hardware.
La funcionalidad prevista de su código parece ser llamar a las funciones LED establecidas constantemente 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 se suelte el botón. Permanecerán encendidos hasta que se llame a una función de ajuste de LED diferente.
Finalmente, si está haciendo AND en 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 de que 0 es falso y todos los demás valores son verdaderos, esto hace que el código sea mucho más limpio mirando. Mover eso a una función lo hace aún más agradable 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
;
}
}
}
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 rápidamente por las distintas funciones.
Su código tiene controles de condición innecesarios que también podrían limpiarse. Básicamente, desea esperar a que se presione el botón, verifique si todavía está presionado, digamos 75-100 mS más tarde y, de ser así, espere a que se suelte el botón y luego incremente su contador de funciones y listo.
finbarr
brahans
rrz0