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 mainPer gentile concessione: Vittorio CrapellaTorna all'indice