2 Behandlung der Tastatureingaben

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.

Tastatur Statuswerte

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