PIC-Lernbeispiel: Tastatur 2


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


Eine 12-Tasten Tastatur (3x4) am Port B wird abgefragt. Die Tastennummer 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.

Die Schaltung ist mit einem PIC16F84 beschrieben, lässt sich aber mit  minimalen Softwareänderungen auch z.B. mit einem PIC16F628A betreiben. Unten befinden sich Links zum Download der ASM- und HEX-Files für beide Microcontrollertypen.
Stromlaufplan RB1 -RB3 sind Ausgänge und liegen im Ruhezustand auf "1". Die anderen Pins des Port B 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 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 wird die Nummer der gedrückten Taste als Binärzahl angezeigt.


Programmablauf
Dieses Problem haben wir ja eigentlich schon gelöst, aber die Lösung war nicht besonders elegant. Insbesondere, wenn die Zahl der Spalten und Reihen weiter ansteigt, bläst sich der Quelltext der einfachen Lösung zu unakzeptabler Größe auf.
Die folgende Lösung ist eleganter. Es werden die Tasten durchgezählt, bis man auf die Taste trifft, die gedrückt wurde. Dieser Code kann auch große Tastaturen abfragen.

Zur Vorbereitung muss man:

  1. Das Port A auf Ausgang schalten
  2. Die Pins RB0-RB3 des Port B in Ausgabe-Mode schalten und auf "1" setzen
  3. die Pull-up-Widerstände des Port B aktivieren
Zur Abfrage werden der Reihe nach die Pins RB1-RB3 vorübergehend auf "0" gelegt und RB4-RB7 mit "1" vergleichen. Ist ein Eingang nicht "1", dann ist eine Taste gedrückt. Dabei wird die Zahl der getesteten Tasten mitgezählt.  Dieser Wert wird zur Kontrolle am Port A ausgegeben.
Wurde keine Taste gedrückt, dann zählt die Routine bis zur 12 (0Ch). Die nicht existierende Taste 12 ist also das Kennzeichen für eine nichtbetätigte Tastatur.


Programmlisting

Das folgende Listing ist die Version für den PIC16F84:

       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 02/2003 (patch am 27.02.2007)
;
; Matrixtastatur abfragen
; Tastencode an LED-Zeile darstellen
;
;**********************************************************
; Includedatei für den 16F84 einbinden

        #include <P16f84.INC>

        ERRORLEVEL      -302            ;SUPPRESS BANK SELECTION MESSAGES

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

        __CONFIG        _PWRTE_ON & _WDT_OFF & _XT_OSC

;**************************************************************
; Konstanten
#define keyport PORTB
#define col1    PORTB,4
#define col2    PORTB,5
#define col3    PORTB,6
#define col4    PORTB,7

; Variablen
rows    equ     0x20
Taste   equ     0x21
loop    equ     0x22

;**************************************************************
        org     0
start
        bsf     STATUS, RP0     ; Bank 1
        bcf     OPTION_REG, 7   ; pull ups an
        movlw   B'00000000'     ; RA all output 
        movwf   TRISA           ; 
        movlw   B'11110000'     ; PortB7..4 input, 3..0 output
        movwf   TRISB
        bcf     STATUS, RP0     ; Bank 0
        clrf    PORTA           ; 
        clrf    PORTB           ;

mainloop
        call    Tastatur
        movlw   0x0C
        xorwf   Taste, w
        bz      warten
        movfw   Taste
        movwf   PORTA           ; Taste anzeigen
        ;nun darauf warten, das Taste losgelassen wird
frei
        call    Tastatur
        movlw   0x0C
        xorwf   Taste, w
        bnz     frei            ; Taste noch gedrückt
warten
        nop
        nop
        decfsz  loop, f
        goto    warten
        goto    mainloop

;**************************************************************
; Tastaturabfrage
; Tastennummer in Taste
Tastatur
        clrf    Taste
        movlw   B'00001110'     ; RB0 muss output sein !
        movwf   keyport         ; RB0=0
        movlw   3
        movwf   rows            ; 3 x 4 Tastatur
        ; die '0' aus RB0 wird der Reihe nach durch alle Zeilen geschoben
suche
        setc
        rlf     keyport, f      ; nächte Zeile
        btfss   col1
        goto    gefunden
        incf    Taste,f
        btfss   col2
        goto    gefunden
        incf    Taste,f
        btfss   col3
        goto    gefunden
        incf    Taste,f
        btfss   col4
        goto    gefunden
        incf    Taste,f
        decfsz  rows,f
        goto    suche           ; alle 4 Zeilen testen
gefunden
        return                  ; Taste enthält die Tastennummer 0..B
                                ; 0x0C bedeutet: keine Taste gedrückt

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


zurück , Lernbeispiele , PIC-Prozessoren , Elektronik , Homepage
Autor: sprut
erstellt: 21.02.2003
letzte Änderung: 27.02.2007