mit einem Taster mehrere Zustände durchschalten

Gast #3378449
Lesenswert?
• ▲
▼
Hallo,

ich programmiere in C mit einem Atmega 32. Ich möchte gerne mit einem 
Taster mehrere Zustände auf dem Display anzeigen
also das bei Tastendruck halt der nächste Zustand angezeigt wird
Bis jetzt habe ich dies shcon aber es Zeigt mir nicht das gewünschte an
hat jemand eine Idee?
1
if(taste == 0)
2
Zustand = Zustand +1; 
3
if(Zustand == 3) Zustand =0;
4

5
if(Zustand == 1)
6
{
7
//erste Anzeige
8
}
9
if(Zustand == 2)
10
{
11
//zweite Anzeige
12
}
#3378479
Lesenswert?
• ▲
▼
Stefan us schrieb:
>> if(taste == 0)
>> Zustand = Zustand +1;
>
> So kommst du von 0 zu 1, aber nicht von 1 zu 2 und von 2 zu 3.

Doch kommt er.
Der Teil funktioniert wunderbar.

Aber das Problem ist, dass diese Zustandsweiterschaltung passiert, 
SOLANGE die Taste gedrückt ist. SOLANGE ist aber ein relativer Begriff. 
Egal wie sehr er auch versucht, diese Drückdauer kurz zu halten ... sein 
µC führt die darüberliegende (Haupt-)Schleife ein paar tausendmal in 
dieser Zeit aus und damit erfolgt diese Zustandsweiterschaltung auch ein 
paar tausendmal während er die Taste drückt. Damit ist das aber für 
einen Benutzer nicht mehr handhabbar, denn er kann das gewünschte 
Ergebnis nicht reproduzierbar steuern.

Die Lösung des Problems wurde von Falk schon angesprochen: Sie besteht 
in der Erkennung des Tastenwechsels von 'nicht gedrückt' zu 'gedrückt' 
und der dann einmaligen Ausführung der Zustandsweiterschaltung.
Im Prinzip eine einfache Sache (eine banale Flankenerkennung), wenn da 
nicht das Problem wäre, dass Taster nach einiger Zeit anfangen zu 
prellen.
Gast #3378482
Lesenswert?
• ▲
▼
Ganz quick & dirty

ich gehe mal davon aus das du den Taster entprellt hast und der 
entprellte Zustand in Variable "taster" abgelegt ist.

1
if(taste == 0 && taste_merk == 1)
2
{
3
    Zustand = Zustand +1; 
4
}
5
taste_merk = taste;
6

7
if(Zustand == 3) Zustand =0;
8

9
if(Zustand == 1)
10
{
11
//erste Anzeige
12
}
13
if(Zustand == 2)
14
{
15
//zweite Anzeige
16
}

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.