Display 3 digit -DVM ST6
DISPLAY A TRE CIFRE
(c) by Vittorio Crapella
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 così 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 UNITA`
ld port_a,a ;mette sulla porta UNITA
ldi port_b,00001101b ;abilita transistore 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,100 ;circa 2 mS di ritardo
decy dec y
ldi wdog,255
jrnz decy
ret
subb clr w ;DIVIDE x 10
ldi wdog,255
cpi a,10 ;se a= o> continua a sottrarre
jrc ok ;altrimenti salta
sub_ subi a,10
inc w
ldi wdog,255
cpi a,10
jrnc sub_
ok ld resto,a ;resto UNITA
ld a,w ;risultato
ld risul,a ;DECINE
ret
attendi 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 ;se a <127 salta
jrc averr3 ;altrimenti arrotonda incrementando risul
inc risul ;valore mediato 255 volte va in a
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