Ich versuche, ein kleines Stück Code zu implementieren, und kann im Grunde wie folgt vereinfacht werden.
Ich habe drei verschiedene LEDs (zB P0.0, P0.1 & P0.2). Ich habe einen Taster, der beim Drücken zuerst die LED an P0.0 einschalten sollte. Beim erneuten Drücken sollte P0.1 eingeschaltet werden und so weiter. Die LED soll so lange an bleiben, bis der nächste Taster erkannt wird.
Im folgenden Testcode beziehe ich mich auf jede LED als Funktion. Meine Idee war, einen Zähler zu erhöhen und abhängig von der Zählung eine bestimmte LED aufleuchten zu lassen.
Die Ausgabe dieses Codes entspricht nicht meiner Erwartung. Es gibt keinen Übergang zwischen den Funktionen. Irgendwelche Vorschläge, wie ich diesen Code umstrukturieren könnte, wären hilfreich.
Ich möchte keine Interrupts für diesen Code verwenden. Außerdem habe ich keine Entprellung einbezogen, da ich darauf abziele, diesen Code in 15 Minuten von Grund auf neu reproduzieren zu können.
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();
}
Gibt es eine Möglichkeit, die aktuelle Funktion sofort zu beenden, anstatt warten zu müssen, bis sie beendet ist?
Ohne eine grundlegende Entprellung wird es nicht funktionieren, was, wenn Sie keine Interrupts verwenden möchten, eine grundlegende Wartefunktion bedeutet, es sei denn, Sie entprellen in Hardware.
Die beabsichtigte Funktionalität Ihres Codes scheint darin zu bestehen, die eingestellten LED-Funktionen ständig aufzurufen, während die Taste gedrückt wird. Nach Ihrer Beschreibung ist dies nicht erforderlich. Sie können sie einmal aufrufen und dann warten, bis die Taste losgelassen wird. Sie bleiben erleuchtet, bis eine andere LED-Einstellungsfunktion aufgerufen wird.
Wenn Sie schließlich das IO-Register mit 0x02 UND-verknüpfen, ist das Ergebnis entweder 2 oder 0. Anstatt nach einem bestimmten Wert zu suchen, können Sie die c-Konvention verwenden, dass 0 falsch und alle anderen Werte wahr sind, dies macht den Code viel sauberer suchen. Das Verschieben in eine Funktion macht es noch schöner zu lesen.
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
;
}
}
}
Ich denke, das grundlegende Problem ist, dass Ihr Code den Schalter nicht entprellt. Beim Drücken eines mechanischen Schalters rattert dieser zunächst schnell auf und zu. Dies führt dazu, dass Ihr Code die verschiedenen Funktionen schnell durchläuft.
Ihr Code enthält unnötige Zustandsprüfungen, die ebenfalls bereinigt werden könnten. Grundsätzlich möchten Sie warten, bis die Taste gedrückt wird, prüfen, ob sie noch 75-100 ms später gedrückt wird, und wenn ja, warten, bis die Taste losgelassen wird, und dann Ihren Funktionszähler erhöhen und loslegen.
Finbarr
brhans
rrz0