PIC Material MPLab Boards Programmer Assembler Programme LCD Tastatur Arithmetik C Python Betriebssystem Linux Bauchladen Anwendungen
Pfad: Startseite / Fächer / Informatik / MSR / PIC / Tastatur
Autor: mk
18.10.2008 13:51:10
2295
Tastatur

Tastatur

Tastaturschema

Unterseite

Grundprinzip

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.

Softwarerealisierung

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

Programme

Links

Valid XHTML 1.0! lokal