Tastierino 3x4
© by Vittorio Crapella - i2viu
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
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
ret
COME 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 l’uso 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 Negri
Con un solo ingresso ADC è possibile riconoscere quale dei 15 pulsanti è selezionato.
L’ingresso 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 l’ADC legge un valore ben preciso per ogni pulsante pigiato. A pulsanti non selezionati si ha un partitore di tensione come segue :
on una tensione di 4,935 V il convertitore restituisce un numero pari a 253 che corrisponde a pulsante non selezionato.
TABELLA CONVERSIONE
RICOSTRUZIONE NR. PULSANTE
La tabella qui a fianco riportata mostra come varia la tensione in entrata al convertitore in funzione del tasto selezionato. Ad esempio se seleziono il pulsante 1, che mette l’ingresso 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.
CONFIGURAZIONE I/O
ldi pdir_a,11111111b ;port_a come output
ldi popt_a,11111111b
ldi port_a,00000000b
ldi pdir_b,00000000b ;port_b come input
ldi popt_b,00000000b
ldi port_b,00000000b
ldi pdir_c,00000000b ;pc7 come ADC
ldi popt_c,10000000b ;pc4,5,6 come input
ldi port_c,10000000b
ROUTINE DI CONVERSIONE
convert 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
ret
PROGRAMMA PRINCIPALE
main 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 main
Come implementare l'OR con gli ST6
Come ruotare a destra i bit dell'accumulatore negli ST6