Logo del sito i2viu

LETTURA TASTIERA 3X4 CON ST62
© by Vittorio Crapella - i2viu

15 TASTI

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.

tastsch.gif-5Kb

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
	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

TAST.3x4

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 :

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 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.

RICOSTRUZIONE NR. PULSANTE

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
ROURINE 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

TAST.3x4

Come implementare l'OR con gli ST6        

Come ruotare a destra i bit dell'accumulatore negli ST6

[ Electronic ] [ Le mie pagine ] [ Link ST6 ]