Alessio Luffarelli - Sito Web
Sei qui: Guide e Tutorial / Basso Livello / Gestire una tastiera esadecimale a matrice con un PIC 16F84
Gestire una tastiera a matrice con un PIC.

prev Tutorial
Precedente
next

Sommario:


INTRODUZIONE

Questa guida non è un corso di programmazione di quei fantastici dispositivi che vengono chiamati PIC (per questo si rimanda all'ottimo e ormai leggendario corso di Tanzilli - basta fare una ricerca nel Web per trovare la sua Home) ma intende solamente trattare un argomento che non viene considerato in nessuna guida reperibile su Internet. Ci occuperemo infatti di come interfacciare e gestire una tastierina esadecimale a matrice con un microcontrollore PIC16F84.

Ovviamente le informazioni qui presenti sono perfettamente valide per qualsiasi microcontrollore della famiglia PIC; inoltre è facile adattare queste informazioni a qualsiasi altro tipo di microcontrollore (ST6, controllori Motorola, ecc..): infatti dovranno essere cambiate le istruzioni in linguaggio assembler ma i concetti e i principi di funzionamento rimarranno gli stessi.

Come dicevo prima, informazioni riguardo questo argomento non sono facili da reperire in Internet. Io stesso nel 2000 (quando ho cominciato ad interessarmi ai PIC) mi sono trovato nella necessità di dover ricevere degli input da una tastiera a matrice; ho fatto immediatamente una ricerca sul Web ma sono rimasto deluso nel non trovare niente; sono stato così costretto a fare tutto da solo.

Ho deciso di scrivere questa guida proprio per chi sta incontrando gli stessi problemi che ho avuto io.

LE TASTIERE A MATRICE

Per comprendere esattamente la natura del problema dobbiamo innanzitutto capire come è fatta una tastierina a matrice. Le più comuni reperibili in commercio sono le tastiere esadecimali (come quella in Figura 1). Hanno cioè 4 righe e 4 colonne; sono infatti anche dette tastiere 4x4 (4 x 4 = 16 = esadecimale). Pur avendo 16 tasti sono dotate di soli 8 pin. Il problema è proprio questo: come sono collegati i 16 tasti con gli 8 pin? Per capirlo aiutiamoci con lo schema in Figura 2, che mostra come è realizzato il circuito interno di queste tastiere. Come potete vedere dallo schema, tutti i pulsanti di una stessa riga sono connessi tra loro come pure tutti i pulsanti di una stessa colonna.

Si capisce quindi, che alla pressione, ad esempio, del tasto P7, vengono connesse tra loro la 2a riga e la 3a colonna.
Al contrario se noi, in qualche modo che tra poco vedremo, ci accorgiamo che la 2a riga e la 3a colonna sono connesse tra loro, possiamo affermare con esattezza che è premuto il tasto P7.

Cominciate a intravedere la soluzione? Penso proprio di sì.

COLLEGARE LA TASTIERA AL PIC

Colleghiamo le 4 righe del tastierino alle linee RB0-RB3 del PIC in questo modo: RB0 - Riga 1, RB1 - Riga 2, RB2 - Riga 3, RB3 - Riga 4. Colleghiamo invece le colonne del tastierino alle linee RB4-RB7 del PIC in questo modo: RB4 - Colonna 1, RB5 - Colonna 2, RB6 - Colonna 3, RB7 - Colonna 4.

Non sapete quali sono le righe e quali sono le colonne degli otto pin della tastiera? Beh, fate riferimento al datasheet della tastiera. Se invece non lo avete, dovrete verificare i pin manualmente con l'aiuto di un multimetro (tester). È un lavoro noioso ma si può fare (io ho fatto proprio così).

Tenete comunque presente che, generalmente, i pin sono disposti nel seguente modo: girate la tastiera e guardatela da dietro; da destra verso sinistra i pin sono: colonna 1, colonna 2,....., colonna 4, riga 1,....., riga 4. Vi sono alcune tastiere che dispongono di 9 pin: in questo caso procedete come se il 9° pin (generalmente l'ultimo a sinistra guardandolo da dietro) non ci fosse e lasciatelo scollegato.

Fatti questi collegamenti, dovete ora collegare quattro resistenze di pull-up alle colonne della tastiera. Il circuito è ora completo. Se non avete capito bene come è fatto potere fare riferimento alla Figura 3. Questo è il circuito base (senza il circuito di funzionamento del PIC) che si dovrà montare se si vuole sperimentare quanto illustrato in questa guida.

IL CODICE

Una volta montato l'intero circuito (ricordatevi che il PIC per funzionare deve essere inserito in un circuito apposito) possiamo passare ad analizzare la routine di scansione della tastiera.

Innanzitutto dobbiamo dichiarare le linee RB0-RB3 del PIC come uscite e le linee RB4-RB7 (collegate tramite resistenze di pull-up) come ingressi nel seguente modo:

bsf STATUS,RP0

movlw 00000000B ;RA0-RA3: uscite per 4 led
movwf TRISA

movlw 11110000B ;RB0-RB3: uscita (righe); RB4-RB7: ingressi (colonne)
movwf TRISB

bcf STATUS,RP0

Come vedete la porta A del PIC è stata settata tutta in uscita. Questo perché tale porta verrà utilizzata, nel nostro progetto di esempio, per gestire 4 LED che ci indicheranno il tasto della tastiera premuto (in codice binario, ovviamente).

Ora bisogna scrivere la routine di scansione della tastiera. Come? Tenendo presente il circuito illustrato e tenendo presente il settaggio di ingresso/uscita della porta B del PIC, si può intuire quanto segue. Se noi poniamo a 0 una riga e tutte le altre a 1 ed andiamo poi a verificare tutte le colonne (che sono tenute a 1 dalle resistenze di pull-up) e ci accorgiamo che una di queste è settata a 0, allora significa che tale colonna è connessa alla riga che abbiamo precedentemente posto a 0. E questo significa che è premuto il tasto che unisce tale riga con tale colonna. Ponendo una per volta tutte le righe a 0 e andando a verificare, per ognuna, tutte le colonne, possiamo proprio determinare se e quale pulsante è premuto.

Una routine che effettua tutto questo è la seguente:

LeggiTastiera

movlw b'11111110' ;Abilito scansione riga 1
movwf PORTB

btfss PORTB,4 ;Test pulsante P1
retlw .1
btfss PORTB,5 ;Test pulsante P2
retlw .2
btfss PORTB,6 ;Test pulsante P3
retlw .3
btfss PORTB,7 ;Test pulsante P4
retlw .4

movlw b'11111101' ;Abilito scansione riga 2
movwf PORTB

btfss PORTB,4 ;Test pulsante P5
retlw .5
btfss PORTB,5 ;Test pulsante P6
retlw .6
btfss PORTB,6 ;Test pulsante P7
retlw .7
btfss PORTB,7 ;Test pulsante P8
retlw .8

movlw b'11111011' ;Abilito scansione riga 3
movwf PORTB

btfss PORTB,4 ;Test pulsante P9
retlw .9
btfss PORTB,5 ;Test pulsante P10
retlw .10
btfss PORTB,6 ;Test pulsante P11
retlw .11
btfss PORTB,7 ;Test pulsante P12
retlw .12

movlw b'11110111' ;Abilito scansione riga 4
movwf PORTB

btfss PORTB,4 ;Test pulsante P13
retlw .13
btfss PORTB,5 ;Test pulsante P14
retlw .14
btfss PORTB,6 ;Test pulsante P15
retlw .15
btfss PORTB,7 ;Test pulsante P16
retlw .16

movlw b'11111111' ;Disabilito scansione tastiera
movwf PORTB

retlw .0 ;Ritorna che nessun tasto è stato premuto

Questa routine ritorna (nel registro W, vi ricordo) il numero del pulsante premuto, in binario. Vi ricordo anche che per numero del pulsante si intende la sua posizione nella matrice e non, necessariamente, cosa vi è stampato sopra. Sul pulsante di posizione 2, infatti, potrebbe esserci stampato "4" o "C" o "Topolino" o "Enter". Sta a voi considerare queste cose.

CONCLUSIONE

Questa guida finisce qui, ma vi ricordo che per un utilizzo efficiente della routine illustrata occorre prevedere del codice che attende che il pulsante premuto venga rilasciato (cosa succede, ad esempio, se teniamo premuto un pulsante per 9 secondi?). Ma non preoccupatevi: in questo file (pic_tastiera.zip - 45k) trovate il programma completo, da applicare al circuito illustrato in queste pagine. Alla prossima...


Questa guida ti è piaciuta o ti è stata utile? Scrivimi e dimmi cosa ne pensi. Mi incoraggerai a scriverne altre..

(C) Alessio Luffarelli