DISPLAY A TRE CIFRE

Il circuito raffigurato nello schema riportato qui sotto, rappresenta la parte hardware necessaria per monitorare la tensione di una batteria a 12V attaccata al morsetto IN del circuito mediante la visualizzazione del valore della tensione con tre cifre su display a sette segmenti. Avremo coś la tensione espressa in decine unità e decimi di volt.

 


	.title  "Display"	
	.vers   "ST6210"  	

;--------------------------------------
; VARIABILI usate da questo programma 
;--------------------------------------
decimi		.def      084h	;display
unita		.def	085h	;"
decine		.def	086h	;"
resto		.def	087h	;divisione
risul		.def	088h
aa		.def	089h	;per contare le conversioni

;***************************
;***  Settaggio iniziale ***
;***************************
	.org    0880h      
;***  Setta la porta A 
	ldi     pdir_a,11111111b        ;dipsonibili solo pa0,1,2,3
	ldi     popt_a,11111111b        ; tutti ouput
	ldi     port_a,11111111b       
					
;***  Setta la porta B 
	ldi     pdir_b,00000111b       ;pa0,1,2  output 
	ldi     popt_b,00001111b       ;pa3 in ADC
	ldi     port_b,00001111b        ; rimanenti non utilizzati conf. input

;*********************
;***   SUBROUTINE  ***
;*********************
display
	ld 	a,decimi		;cifra di destra DECIMALI
	ld 	port_a,a		;mette sulla porta i DECIMI
	ldi 	port_b,00001110b	;abilita trans. decimali			
	call    delay
	ldi     port_b,00001111b	;disabilita tr decimali
        ld 	a,unita			;prende unitá 
	ld 	port_a,a		;mette sulla porta UNITA
	ldi	port_b,00001101b	;abilita transitore UNITA	
	call      delay
	ldi	port_b,00001111b
	ld	a,decine		;DECINE
	ld	port_a,a		;mette sulla porta le DECINE
	ldi	port_b,00001011b	;abilita tr decine
	call	delay
	ldi	port_b,00001111b	;spegne decine
rito	ret				;ritorna
delay	ldi     y,50			;circa  1 mS di ritardo complessivo
decy	dec     y
	ldi	wdog,255
	jrnz	decy
	ret

					;DIVIDE x 10
subb	clr 	w
	ldi	wdog,255
	cpi 	a,10			;se a= salta e continua a sottrarre
ok	ld 	resto,a			;resto       UNITA
	ld 	a,w	 		;risultato
	ld 	risul,a 		; DECINE
	ret

convert res	4,ior			;disabilita interrup 
	clr	resto
	clr	risul
	ldi 	aa,255
averr1	ldi	wdog,255
	ldi 	adcr,00110000b		;abilita A/D   su pb3
att	jrr	6,adcr,att		;attende conversione
	nop
	ld	a,addr			;mette in a il valore convertito
	add	a,resto			;somma il precedente valore con il nuovo
	jrnc	averr2			;se non c’è riporto salta
	inc	risul			;altrimenti incrementa 
averr2	ld	resto,a
	ld	a,aa			;verifica se ha eseguito 255 conversioni
	jrz	averr4			;se si salta 
	dec 	aa			;altrimenti un conversione in meno
	call	display			;visualizza valori precedentemente convertiti
	jp	averr1			;continua a convertire
averr4	ld	a,resto			;arrotonda
	cpi	a,127
	jrc	averr3			;se a <127 salta 
	inc 	risul 			;altrimenti arrotonda incrementando risul 
averr3	ld	a,risul			;valore mediato 255 volte va in a 
	set 	4,ior 			;riabilita int. ret 
	inc	risul
averr3	ld	a,risul
	set	4,ior			;riabilita int. timer
	ret

;******************************************
;PROGRAMMA PRINCIPALE
;******************************************

main	ldi	wdog,255
	call 	attendi		;legge tensione
;	addi	a,2		;aggiustamento partitore
	call 	subb		;divide x 10	ex: 142:10=14
	ld	decine,a		;salva risultato in decine
	ld	a,resto		;prende resto		=2
	ld	decimi,a		;preara display DECIMALI  =2
	ld	a,decine		;riprende val. decine =14
prepar2	call	subb		;divide x 10 = 1 decine e 2 unita
	cpi	a,0		;se risultato =0 allora DECINE=15 (spento)
	jrnz	deci
	ldi	a,15		;display spento
deci	ld	decine,a
	ld      a,resto		;resto in UNITA
	ld 	unita,a		; decine  unita  decimi
	jp 	main
 
Per gentile concessione: Vittorio Crapella
Torna all'indice