LETTURA TASTIERA 3X4 CON ST62
|
Lo schema rappresenta un modo di collegare una tastiera 3x4 per leggere il valore numerico dei suoi tasti quando vengono premuti. Mediante pb4 é possibile comandare un "buzzer" per segnalare con un "bip" la premuta dei tasti. Lo schema raffigura un micro ST6265 ma può essere usato qualsiasi ST6 purché si faccia uso di una porta completa a 8 bit.
SEGUE ROUTINE PER GESTIONE TASTIERA
tasti listato in file.zip (1 kb)
SETTAGGIO PORTA B ldi port_b,00001111b ;bit 0/3 out righe ldi pdir_b,00011111b ;bit 4 out per buzzer ldi popt_b,00011111b ;bit 5/7 input pul-up col. ;VARIABILI USATE: -aa- per salvataggio registro a ; -pigia- per ricordare se c'é pigiata ; -numero- per ricordare valore tasto premuto ; -t1- per delay antirimbalzo ; -t2- " " " ;REGISTRI USATI: a,x,w tasti ldi wdog,255 ;GESTIONE TASTIERA ldi w,4 ;numero righe ldi a,254 ;11111110 b jp ldaa cicla ldi a,255 com a ;cy=1 ld a,aa ;riprende a rlc a ;b7 di a in cy e cy in b0 di a (1^ riga) ldaa ld aa,a ;salva a in aa res 4,a ;tiene pb4 a livello 0 (no bip) ld port_b,a ;mette 0 su riga selezionata ldi x,4 ;numero colonna +1 ld a,port_b ;legge colonna per colonna decx dec x ;col=3 jrz altra ;altra riga se testato tutte le colonne rlc a ;b7->cy jrc decx ;se cy=1 salta altra colonna jp cla ;se cy=0 ha trovato tasto pigiato altra dec w ;altra riga e le conta jrz jpmai ;se non trova tasti ripete jp cicla jpmai clr pigia ;se non trova tasti pigia=0 jp tasti cla clr a ancora dec w jrz okk addi a,3 ;ricostruisce nr tasto jp ancora okk ld w,a ld a,x ;prende nr colonna add a,w ;numero tasto pigiato in a call delay ;antirimbalzo jrs 0,pigia,tasti ;se ripassa di qui e non avevo ancora ldi pigia,1 ;rilasciato il pulsante da prima non lo prende ld numero,a ;deve fare un giro senza trovare tasti pigiati ld a,port_b ;leggo stato port_b set 4,a ;metto alto pb4 per bip premuta tasto res 4,ior ;blocco eventuale interrupt ld port_b,a ;per non alterare il bip call delay call delay res 4,a ;fine bip ld port_b,a set 4,ior ;riabilito interrupt ret delay ;ANTIRIMBALZO ldi t1,10 lop1 ldi t2,255 lop2 ldi wdog,255 dec t2 jrnz lop2 dec t1 jrnz lop1 retCOME FUNZIONA
Da PB0 a PB3 sono uscite a livello alto =1
PB4 uscita a livello 0
da PB5 a PB7 input
Immaginiamo la tastiera collegata alla port_b come da figura 2 dove il livello dei bit PB0,1,2,3 diventano le righe della tastiera e i bit PB5,6,7 diventano gli ingressi da testare come colonne. Una riga alla volta, a cominciare da PB0, viene messa a livello 0 e per ognuna di queste leggo nel registro a il contenuto della port_b e ricerco mediante luso di carry, quale colonna potrebbe essere unita dalla chiusura di un tasto con la riga messa a 0. Esaminando il listato osservo che il registro w viene messo a 4 per contare le righe e verrà decrementato di uno ogni volta che una nuova riga viene messa a 0. Preparo in a il valore di 254 cioè 11111110b che verrà messo su port_b cioè PB0 = 0 = prima riga. Salto a ldaa dove salvo il valore di a per poterlo riprendere inalterato al prossimo cambio riga. Con ldi x,4 predispongo il registro x a contare le colonne da esplorare. Leggo in a i livelli di port_b, dec x (una colonna in meno) e se sono esplorate tutte cioè x=0 salto ad altra (jrz = jamp se risultato = zero) altrimenti RLC, ruoto tutti i bit del reg. a di un posto verso sinistra attraverso il cy mandando cioè il PB7 in Cy. Se carry = 1 con jrc salta a decx (altra colonna in meno) e testo altro bit PB6 in Cy. Se durante questo ciclo CY=0 cioè colonna a livello della riga selezionata cioè tasto pigiato, passa da jp cla dove ricostruirà il numero del pulsante premuto. Se invece decrementando x diventa 0 cioè ho esplorato tutte le colonne senza trovare nessun livello 0 e pertanto nessun tasto premuto, salta ad altra.
A cicla con ldi a,255 e com a setto cy = 1, recupero in a il valore precedentemente salvato in aa ed eseguo una rotazione dei bit a sinistra con RLC a ,così a diventa la seconda volta 11111101b cioè PB1=0. Salvo in aa e metto su port_b questo nuovo valore cioè seconda riga tastiera = 0.
Ripeto la verifica delle tre colonne alla ricerca di qualche 0 se sarà premuto un tasto. Ammesso di trovare una colonna a livello 0 , come precedentemente detto, si arriva a cla con x e w che avranno rispettivamente il numero di colonna e di riga. Ciò basta per sapere quale tasto è stato premuto.
Infatti il numero corrispondente al pulsante sarà dato da :
nr= (3*w)+x (tre per nr righe + nr colonna)
Per ottenere la moltiplica basta sommare 3 tante volte quanto vale w
Esempio : Tasto 5 premuto
Il tasto 5 premuto verrà rivelato quando PB2=0 che mi metterà PB6 =0 pertanto w assumerà il valore 1 mentre per avere cy=0 (=pb7) dovrò ruotare due volte e di conseguenza x=2
nr= 3*1+2=5
QUINDICI TASTI CODIFICATI CON ADC
Progetto ideato e presentato da Vittorio Crapella
Collaudato da Alessandro NegriCon un solo ingresso ADC è possibile riconoscere quale dei 15 pulsanti è selezionato.
Lingresso ADC è in grado di interpretare valori di tensioni al suo ingresso compresi tra 0 V e 5 V. Selezionando un pulsante qualsiasi, si chiude il partitore a massa con un valore di resistenza sempre diverso e pertanto lADC legge un valore ben preciso per ogni pulsante pigiato. A pulsanti non selezionati si ha un partitore di tensione come segue :
Con una tensione di 4,935 V il convertitore restituisce un numero pari a 253 che corrisponde a pulsante non selezionato.
TABELLA CONVERSIONE
R partitore |
R massa |
volt ADC |
nr. ADC |
se minore |
Pulsante |
0 |
0 |
0 |
0 |
5 |
1 |
150 |
150 |
0,312371 |
16 |
22 |
2 |
150 |
300 |
0,606 |
31 |
39 |
3 |
180 |
480 |
0,935907 |
48 |
56 |
4 |
180 |
660 |
1,243657 |
63 |
73 |
5 |
220 |
880 |
1,592832 |
81 |
90 |
6 |
220 |
1100 |
1,915517 |
98 |
107 |
7 |
270 |
1370 |
2,279572 |
116 |
124 |
8 |
270 |
1640 |
2,612618 |
133 |
141 |
9 |
330 |
1970 |
2,983058 |
152 |
158 |
10 |
330 |
2300 |
3,318571 |
169 |
175 |
11 |
390 |
2690 |
3,676455 |
187 |
192 |
12 |
390 |
3080 |
3,998458 |
204 |
209 |
13 |
470 |
3550 |
4,346061 |
222 |
226 |
14 |
470 |
4020 |
4,656193 |
237 |
243 |
15 |
470 |
4490 |
4,934603 |
253 |
no tasto |
La tabella qui sopra riportata mostra come varia la tensione in entrata al convertitore in funzione del tasto selezionato. Ad esempio se seleziono il pulsante 1, che mette lingresso ADC a massa cioè 0 V, il convertitore restituisce un valore 0 (± 1 errore di conversione) che nel software verrà riconosciuto perché risulterà un valore inferiore a 5. Se il pulsante selezionato fosse il 10 la tensione in ingresso sarebbe di 2,983 V che convertita restituisce il numero 152. Nel software basterà verificare che tale valore sia inferiore a 158. Se nella verifica risulterà che il valore non è inferiore di 243 ciò significa che non sono stati pigiati tasti.
RICOSTRUZIONE NR. PULSANTE
CONFIGURAZIONE I/O
ldi pdir_a,11111111b ;port_a come output ldi popt_a,11111111b ldi port_a,00000000bldi pdir_b,00000000b ;port_b come input ldi popt_b,00000000b ldi port_b,00000000bldi pdir_c,00000000b ;pc7 come ADC ldi popt_c,10000000b ;pc4,5,6 come input ldi port_c,10000000bROURINE DI CONVERSIONEconvert ldi wdog,255 ldi adcr,00110000b ;attiva ADC attesa jrr 6,adcr,attesa ;aspetta fine conversione (circa 70uS) clr x ldi a,243 cp a,addr ;se valore convertito > di 243 esce jrc esce ;con a=x=0 incx inc x ;x=1 prova con il primo pulsante addi a,17 ;somma 17 ad a cp a,addr ;confronta a con il valore dell' ADC jrc incx ;se a < di addr salta ad incx esce ld a,x ;prende x = nr retPROGRAMMA PRINCIPALEmain ldi wdog,255 conv call convert cpi a,1 ;torna con a = valore del pulsante jrnz due call proc1 ;chiama la procedura 1 jp main due cpi a,2 jrnz tre call proc2 jp main tre ............. quindi cpi a,15 jrnz fine call proc15 ;chiama la procedura 15 fine jp mainCome implementare l'OR con gli ST6
Come ruotare a destra i bit dell'accumulatore negli ST6