PIC-Lernbeispiel: Tastatur


zurück , Lernbeispiele , PIC-Prozessoren , Elektronik , Homepage


Eine 12-Tasten Tastatur (3x4) am Port B wird abgefragt. Der Tastencode  wird mit LEDs am Port A angezeigt

Schaltung
Eine 3x4 Tastatur mit 4 Zeilen und 3 Spalten ist am Port B angeschlossen. RB1 bis RB3 sind über 2,7 kOhm Widerstände mit den Spaltenleitungen verbunden, RB4 bis RB7 mit den Zeilenleitungen. RB0  wird nicht benutzt. Die Widerstände dienen dem Schutz vor Kurzschlüssen, falls mehrere Tasten gleichzeitig gedrückt werden. Die Schaltung entspricht funktionell der LCD-Tastatur-Platine ohne LCD-Display, verbunden mit der 16F84-Testplatine oder die 16F84-Miniplatine mit einer LED-Platine am Port A.
 
Stromlaufplan RB1 -RB3 sind Ausgänge und liegen im Ruhezustand auf "1". Die anderen Pins des Port B (RB4-7) sind Eingänge, ihre aktivierten Pull-up-Widerstände sorgen für eine "1"-Pegel im Ruhezustand. 

Die Ausgänge werden nacheinander auf "0" gelegt und dabei die Eingänge RB4-RB7 ausgewertet. Liegt dabei ein Eingang auf "0", so muss dieser durch eine gedrückte Taste mit dem aktiven Ausgang verbunden sein. 

Jedem Eingangs/Ausgangs-Paar ist ein Taste zugeordnet.

Am Port A werden LEDs zur Anzeige benötigt. Hier werden die unteren 4 Bit des Tastencodes angezeigt.
 


Programmablauf
Zur Vorbereitung muss man:

  1. Das Port A auf Ausgang schalten
  2. Die Pins RB1-RB3 des Port B in Ausgabe-Mode schalten und auf "1" setzen
  3. die Pull-up-Widerstände des Port B aktivieren
Zur Abfrage muss man der Reihe nach die Pins RB1-RB3 vorübergehend auf "0" legen und RB4-RB7 mit "1" vergleichen. Ist ein Eingang nicht "1", dann ist eine Taste gedrückt. Jeder Taste ist ein Wert zugeordnet (ASCII-Code der aufgedruckten Zahl). Dieser Wert wird zur Kontrolle am Port A ausgegeben. Da Port A nur 5 Bit groß ist, wird natürlich nicht der ganze 7 Bit ASCII-Wert angezeigt.

Das Unterprogramm zur Tastaturabfrage ist etwas umständlich, erlaubt es aber jeder Taste individuelle Werte zuzuordnen. Da die Ausgabe an eine LED-Zeile unkritisch ist, wurde auf eine Entprellung der Tasten verzichtet.
 


Programmlisting

Das Beispiel ist für einen 16F84 bzw. 16F84A ausgelegt. Wer es für einen 16F628 oder 16F87x umschreiben will, muss die Analogfalle beachten.
 
        list p=16f84
;**********************************************************
;*      Pinbelegung
;*      ---------------------------------- 
;*      PORTA:  0   LED
;*              1   LED
;*              2   LED 
;*              3   LED
;*              4   LED
;*      PORTB:  0 
;*              1   Keyboard 1 4 7 *
;*              2   Keyboard 2 5 8 0
;*              3   Keyboard 3 6 9 #
;*              4   ---------I I I I
;*              5   -----------+ I I
;*              6   -------------+ I
;*              7   ---------------+
;* 
;**********************************************************
;
;sprut (zero) Bredendiek 05/2000 (mod. 01/2002; 10/2002)
;
; Matrixtastatur abfragen
; Tastencode an LED-Zeile darstellen
;
;**********************************************************
; Includedatei für den 16F84 einbinden

        #include <P16f84.INC>

; Configuration festlegen
; bis 4 MHz: Power on Timer, kein Watchdog, XT-Oscillator

        __CONFIG        _PWRTE_ON & _WDT_OFF & _XT_OSC
;**************************************************************

; Variablen festlegen

Taste   Equ     0x20

; Constanten festlegen

Ini_con Equ     B'00000000'     ; Interrupt disable
Ini_opt Equ     B'00000010'     ; pull-up einschalten

;**********************************************************
; los gehts mit der Initialisierung

Init    bsf     STATUS, RP0     ; Bank 1
        movlw   Ini_opt         ; pull-up Widerstände ein
        movwf   OPTION_REG 
        clrf    TRISA           ; RA0 .. RA4 output
        movlw   B'11110001'     ; RB1 .. RB3 output
        movwf   TRISB
        bcf     STATUS, RP0     ; Bank 0
        clrf    PORTA           ; 
        clrf    PORTB           ;
        movlw   Ini_con         ; Interrupt einstellen (disable)
        movwf   INTCON 

; das Folgende ist die Hauptschleife, die endlos durchlaufen wird

Main 
        call    Tastatur        ; Tastatur abfragen
        movfw   Taste
        btfsc   STATUS, Z       ; Taste gedrückt?
        goto    Main2           ; keine Taste gedrückt
        movwf   PORTA           ; Tastencode zu LEDs
Main2 
        goto    Main

;********************************************************** 
;
;Abfrage der 3x4-Tastatur
;
;**********************************************************
; Festlegung der Spaltennummern

Row1    equ     1               ;Keyboard 1 4 7 *
Row2    equ     2               ;Keyboard 2 5 8 0
Row3    equ     3               ;Keyboard 3 6 9 #
 

; ist eine Taste gedrückt? und welche?

Tastatur                        ; Tastencode nach Taste
                                ; wenn keine Taste gedrückt dann Taste=0
        movlw   0               ; W=0

        bsf     PORTB, Row2
        bsf     PORTB, Row3
        bcf     PORTB, Row1
        call    key1            ; 1. Spalte abfragen

        bsf     PORTB, Row1
        bcf     PORTB, Row2
        call    key2            ; 2. Spalte

        bsf     PORTB, Row2
        bcf     PORTB, Row3
        call    key3            ; 3. Spalte

        movwf   Taste
        return

key1
        btfss   PORTB, 4
        retlw   '1'
        btfss   PORTB, 5
        retlw   '4'
        btfss   PORTB, 6
        retlw   '7'
        btfss   PORTB, 7
        retlw   '*'
        return
key2
        btfss   PORTB, 4
        retlw   '2'
        btfss   PORTB, 5
        retlw   '5'
        btfss   PORTB, 6
        retlw   '8'
        btfss   PORTB, 7
        retlw   '0'
        return
key3
        btfss   PORTB, 4
        retlw   '3'
        btfss   PORTB, 5
        retlw   '6'
        btfss   PORTB, 6
        retlw   '9'
        btfss   PORTB, 7
        retlw   '#'
        return

        end 
;**********************************************************


zurück , Lernbeispiele , PIC-Prozessoren , Elektronik , Homepage


Autor: sprut
erstellt 2000
letzte Änderung: 27.10.2003