Hannes wrote:
> Danke für die Antworten!
> Was ihr sagt leuchtet mir ein. Ich werde mich mal dran machen und
> probieren das ganze per Flankenerkennung auszuwerten. Die Code Beispiele
> nehm ich vielleicht als Referenz aber die so direkt zu kopieren und
> versuchen in mein Program einzuflicken erscheint mir doch auf Anhieb
> etwas zu kompliziert (obwohl es vielleicht doch nicht so schwer ist).
Guter Ansatz. Ich benutze auch keinen fremden unverstandenen Code. ;-)
> Zudem hoffe ich auch etwas dazu zu lernen wenn ich's erst mal selber
> versuche.
Richtige Einstellung. Ich hatte das Beispiel ja auch hauptsächlich zum
Analysieren der Funktionsweise genannt.
Kurze Erklärung:
Die Tastenentprellung braucht neben einem temporär genutztem Register 4
eigene Register. Drei davon können "untere" Register sein, für das
Key_press-Register (heißt bei mir "tfl" wie Tastenflags) nehme ich aber
gerne ein oberes Register, um es mit cbr bitweise löschen zu können.
Das Einlesen und Entprellen der Tasten erfolgt im Timer-Interrupt alle 4
bis 25 Millisekunden, der entprellte Tastenzustand der bis zu 8 Taster
steht im Register Key_state (bei mir "tas" wie Tastenstatus). Dieser
"Zustand" kann ggf nützlich sein, wenn man eine "Shift-Taste" abfragen
will. Die Flankenerkennung (Taste wurde erneut betätigt) setzt das zum
Taster zugehörige Bit im Register Key_press (tfl), wenn der Taster
erneut (min. 4 Interrupt-Runden lang) gedrückt wurde, zuvor aber (min. 4
Int-Runden lang) losgelassen war.
Das Hauptprogramm muss dann nur noch (gelegentlich) die Tastenflags
(Key_press bzw. tfl) abfragen. Ist eines gesetzt, so wird zu der Routine
verzweigt, die die zur Taste gehörende Arbeit verrichtet. Diese löscht
dann das entsprechende Tastenflag, damit der Job nur einmal pro
Tastendruck erledigt wird.
Ich hänge mal noch ein Beispiel an, was die Einzelabfrage mehrerer
Taster etwas deutlicher zeigt.
> Vielen Dank nochmals und ich melde mich wieder wenn ich wieder
> feststecke ;-)
Viel Erfolg
...