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