![]() |
|||
| HSG |
|

Widerstände zwischen Tasten und Ports können Kurzschlüsse zwischen den Ports vermeiden. Ihr Wert ist unkritisch und könnte etwa bei 1kΩ liegen. Bei korrekter Programmierung gibt es keine Kurzschlüsse ;-). Die 27kΩ-Widerstände dienen als Pulldown- bzw. Pullup-Widerstände. Hier kann über den Port RE2 beides eingestellt werden. Die folgenden Programme gehen davon aus, dass RE2 auf 0 gesetzt wird. Damit wird ohne gedrückte Taste bei jeder Zeile eine 0 gelesen. Die 16 Taster können die Kreuzungspunkte von Zeilen und Spalten verbinden. Im Schema ist gezeigt, wie z.B. die Taste 'A' gelesen werden kann. Zunächst sind die Spalten 1 (RA0), 2 (RA1) und 4 (RE1) auf Eingang zu schalten, sie können also keine 1 liefern. Die Spalte 3 (RE0) muss auf 1 gelegt werden. Bei gedrückter Taste 'A' kann diese 1 in Zeile 2 (RA3) gelesen werden. Um die Taste '0' zu lesen, muss Spalte 1 (RA0) auf 1 , die Spalten 2(RA1), 3 (RE0) und 4 (RE1) auf Eingang gesetzt werden und die Zeile 4 (RA5) gelesen werden.
Will man mit einem Tastendruck z.B. ein Zeichen eingeben, so muss man sich darüber klar werden, an welches 'Ereignis' diese Eingabe geknüpft werden soll. Von der PC-Tastatur her ist man gewohnt, das Niederdrücken der Taste als auslösendes Ereignis zu nehmen. In bestimmten Anwendungen kann auch das Loslassen der Taste das interessierende Ereignis sein. Es gilt also, eine 'steigende Flanke' (0-1-Übergang) bzw. eine 'fallende Flanke' (1-0-Übergang) zu entdecken. Das könnte über Interrupts oder durch wiederkehrendes Abfragen ('Polling') geschehen. Zunächst soll die Polling-Alternative realisiert werden.
tastatur0 equ 0x30 ; Tasten 0 - 7, 1 = gedrückt tastatur1 equ 0x31 ; Tasten 8 - F tastatur0a equ 0x32 ; Tasten 0 - 7, alt tastatur1a equ 0x33 ; Tasten 8 - F, alt tastencode equ 0x34 ; Tastencode event equ 0x35 ; Ereignis-Flags, 0=kein Ereignis, Bit0=gedrückt, Bit1=losgelassen
Obige Variablen haben folgende Bedeutung: tastatur0 und tastatur1 speichern den aktuell gelesenen Zustand, tastatur0a und tastatur1a den vorhergehenden. Dabei ist jeweils ein Bit einer Taste zugeordnet. Die Variable event zeigt mit Bit0 und Bit1 das Auftreten der Ereignisse 'Taste gedrückt' und 'Taste losgelassen' an. Die Ereignisbehandlung ist dann für das Rücksetzen des jeweiligen Ereignisflags verantwortlich. Falls eine Taste gedrückt wurde, wird ihr Tastencode (0x00-0x0F) in der Variablen tastencode gespeichert.
Die Tastaturroutine behandelt alle 16 Tasten nacheinander. Im Folgenden wird die Behandlung der TasteA gezeigt.
;-----------------------------------------------------------------
; Taste A
; Vorbereitung
bsf STATUS,5 ; wechsle zu Bank1
;Spalten
bsf TRISA,0 ; setze Port RA0 als Eingang
bsf TRISA,1 ; setze Port RA1 als Eingang
bcf TRISE,0 ; setze Port RE0 als Ausgang
bsf TRISE,1 ; setze Port RE1 als Eingang
;Zeile
bsf TRISA,3 ; setze Port RA3 als Eingang
bcf STATUS,5 ; wieder in Bank 0 wechseln
bsf PORTE,0 ; RE0 auf 1
; Auswertung
; Tastaturzustand retten
movfw tastatur1 ; Tastaturzustand
movwf tastatur1a ; nach Tastaturzustand,alt kopieren
; Taste abfragen
btfsc PORTA,3 ; RA3 testen, skip if clear
goto tasteA_1 ; Taste A gedrückt
goto tasteA_0 ; Taste A nicht gedrückt
tasteA_1:
bsf tastatur1,2 ; Tasten-Bit setzen
movlw 0x0a ; Tastencode setzen
movwf tastencode
goto ereignisA ; Sprung zu Ereignistest
tasteA_0:
bcf tastatur1,2 ; Tasten-Bit löschen
goto ereignisA ; Sprung zu Ereignistest
ereignisA:
btfss tastatur1a,2 ; Bit2 testen, skip if set
goto fall_A0_ ; Bit2=0
goto fall_A1_ ; Bit2=1
fall_A0_:
btfss tastatur1,2
goto fall_A00
goto fall_A01
fall_A1_:
btfss tastatur1,2
goto fall_A10
goto fall_A11
fall_A01:
movlw 0x01 ; steigende Flanke
movwf event
call wait2ms ; Tastenprellen abwarten
goto endeA
fall_A10:
movlw 0x02 ; fallende Flanke
movwf event
call wait2ms ; Tastenprellen abwarten
goto endeA
fall_A00:
fall_A11:
endeA:
;-----------------------------------------------------------------