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: ;-----------------------------------------------------------------