Eine Tastatur-ISR sichert den Tastencode der zuletzt gedrückten Taste in der Variablen curr_key_state, der Status der einzelnen Tasten wird in den Variablen key_state0...2 abgelegt.
; ==================================================================
; keyboard interrupt service routine
; this subroutine just stores the actual keyboard in
; $curr_key_state, also taking into account, that key0
; only sets bit 0b0000100 of port D. Pattern 0b00 is stored if
; key 0 is pressed, 0b10, 0b01 otherwise.
; ---------------------------------
keyboard_isr:
PUSHF ; save flags
push temp1
push temp2
in temp1, pinD
andi temp1, key_mask0 ; mask b0+b1
sts curr_key_state, temp1 ; store current key state
; we also set the state of the key to 'press_state'
ldi temp2, press_state
dec temp1
brne isr_not_key1 ; it was not key1
sts key_state1, temp2 ; it was key1
rjmp keyboard_isr_return
isr_not_key1:
dec temp1
brne isr_not_key2 ; it was not key2
sts key_state2, temp2 ; it was key2
rjmp keyboard_isr_return
isr_not_key2:
sts key_state0, temp2 ; it was key0
keyboard_isr_return: ; as user feedback
RED_LED_ON ; we switch red led on
pop temp2
pop temp1
POPF ; restore flags
reti ; end of interrupt service routine
Der Tastaturinterrupt wird nur direkt beim Tastendruck ausgelöst,
ein längeres Niederhalten einer Taste erzeugt keinen weiteren Interrupt.
Um diesen Umstand berücksichtigen zu können, wurde eine Highlevel
Tastaturbehandlung eingeführt (Keyboard-Postprocessing), die die Stati
der Tasten, die Tasten-Niederhaltedauer im speziellen und die Tastaturwiederholungen
behandelt.
Dazu wird pro Taste eine Statusvariable mit Statuswerten verwendet,
dies sind die Variablen key_state0, key_state1
und key_state2, die die in Tabelle 7.1
festgelegten Status-Werte annehmen können.
Status | Wert | Bemerkung |
inact_state | 0x00 | Taste ist und wurde nicht gedrückt bzw. alle Keyboard Events sind bereits abgearbeitet |
activ_state | 0x01 | Taste wurde gedrückt, jedoch noch nicht „verarbeitet” oder sie wird noch niedergehalten |
press_state | 0x02 | Taste wurde gedrückt, jedoch noch nicht „verarbeitet” Dieser Wert wird von der Tastatur-ISR gesetzt |
>0x02 | Beim längeren Niederhalten wird dieser Wert bei jedem Postprocessing-Durchlauf erhöht |
Die Statusvariablen sind nach der im Abschnitt 7.5 festgelegten Struktur in der Datei inc/variables.inc abgelegt.
Die Statuswerte sind als Konstante in der Datei inc/constants.inc festgelegt, wie auch die ,,symbolischen'' Tastenbezeichnungen key_mask0, key_next und key_middle für die mittlere Funktionstaste, key_mask1, key_back und key_left für die linke Funktionstaste und key_mask2, key_enter und key_right für die rechte Taste.Damit wird eine gute Lesbarkeit und bessere Wartbarkeit des Source-Codes erreicht.
Zusätzlich zu den ,,normalen'' Tastaturbehandlungs-Routinen, die
den Status einer Taste oder die ,,Niederhaltezeit'' liefern, existieren
High-Level Funktionen mit einem hohen Abstraktionsgrad, sodass diese
Funktionen auch bei einer Änderung der Hardware weiter verwendet werden
könnten. Einige Beispiele sind in Tab. 7.2
angeführt.
Highlevel Tastaturbehandlungen
Subroutine | Beschreibung |
wait_key_confirm | Ausgabe einer Textmeldung und Warten auf eine Taste |
wait_key_pressed | Wartet auf einen beliebigen Tastendruck |
wait_key_release | Wartet bis keine Taste mehr gedrückt ist |
check_keypress | Prüft ob und welche Taste betätigt wurde |
keyproc_varvalue_preset | Komplexe Tastatur Eingaberoutine - siehe unten |
Die sehr mächtige Werte-Eingabefunktion Funktion keyproc_varvalue_preset
stellt die Basis aller Werteingaben der Drehwinkelsteuerung dar und
ermöglicht die Kontrolle eines beliebigen nummerischen 16-Bit Wertes,
wobei über Parameter das zu ändernde Register und der Maximalwert
festgelegt wird (Tabelle 7.3).
Highlevel Werte-Eingabefunktion
Eingabe: | LREG_A | 16-Bit Wert, der über die Tastatur geändert wird |
MREG_A | 16-Bit Wert als oberer Grenzwert, die untere Grenze ist immer 0 | |
Ausgabe: | LREG_A | Interaktiv ausgewählter 16-Bit Wert |
Verändert: | var_valdirection | intern verwendete Speichervariable, die die Änderungsrichtung (Zunahme, Abnahme) steuert |
Die nähere Beschreibung dieser Funktion aus Sicht der Anwendung im GUI kann im Abschnitt 7.6.2.2 nachgelesen werden.
Alle Tastaturroutinen sind in der Bibliotheksdatei lib/keyboard.lib zusammen gefasst.
gerhard.reithofer@tech-edv.co.at