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.

Per recuperare il listato disp.zip                      Altra applicazione con display


  .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