THREE-DIGIT ANALOG DISPLAY USING A MICROCHIP MCU PIC 16F84

 

It is very common to see displays showing voltage, current, frequency, time or counts.  Sometimes the use of a PC for showing small data is too much.  This device can be plug just to any transducer, TermoCouples, Current Transformers, pH meters, etc.

PICs have a Reduce Instruction Assembly Code.  I choose 16F84 MCU since it avaliable worlwide and the programer can be homebuilt, the programming software is avaliable FREE on the web.  MicroChip’s IDE (Integrated Development Environmet) MPLAB is also FREE and can be obtain at www.microchip.com .

 

This is the source code

;Programa para leer el convertidor serial de 8 bits ADC0831

;y desplegar el valor en un display de tres digitos

 

       processor 16f84

       include   <p16f84.inc>

       __config _XT_OSC & _WDT_OFF & _PWRTE_ON

 

;Variables usadas genericamente

 

I      equ    H'0C'

J      equ    H'0D'

K      equ    H'0E'

 

;Bits y variables para el ADC0831

 

CS     equ    H'00'  ;Chip Select

CLK    equ    H'01'  ;Clock

DO     equ    H'02'  ;Salida serial binaria

 

S      equ    H'0F'  ;byte leido

 

;Bits y variables para el display

 

L1     equ    H'04'  ;Encendido del digito centenas

L2     equ    H'05'  ;Encendido del digito decenas

L3     equ    H'06'  ;Encendido del digito unidades

 

T      equ    H'10'  ;Conteo de centenas

D      equ    H'11'  ;Conteo de decenas

U      equ    H'12'  ;Conteo de unidades

 

;Programa principal

 

       org    0            ;inicia en la direccion 0

      

       bsf    STATUS,RP0   ;Selecciona los registros del banco 1

       movlw  B'11111100'  ;RA2=entrada, RA1 y RA0=salida

       movwf  TRISA

       movlw  B'10000000'  ;RB0..RB6 salidas a display

       movwf  TRISB

            

       bcf    STATUS,RP0   ;Selecciona los registros del banco 0

       movlw  B'11111101'  ;CLK=low, CS=high

       movwf  PORTA       

       movlw  B'10000000'  ;Apaga todos los displays

       movwf  PORTB

 

continuo:

       call   adc          ;llama a la rutina del ADC0831

       call   display             ;llama a la rutina del display

       call   continuo     ;recicla

 

;********************************

pulso:                     ;Subrutina que genera un pulso de reloj

       bsf    PORTA,CLK    ;CLK=high

      

       movlw  D'120'       ;I=120

       movwf  I            ;

alto: 

       decfsz I,F          ;I=I-1

       goto   alto        

 

       bcf    PORTA,CLK    ;CLK=low

      

       movlw  D'120'       ;I=120

       movwf  I            ;

bajo:

       decfsz I,F          ;I=I-1

       goto   bajo

 

       return

;********************************

adc:

       clrf   S            ;valor=0

       movlw  D'8'         ;J=8

       movwf  J            ;

 

       bcf    PORTA,CS     ;CS=low, inicia conversion

       nop

 

       call   pulso        ;Genera un pulso

       btfsc  PORTA,DO     ;DO=low?

       return              ;no, regresa y s=0

 

next:

       call   pulso        ;genera un pulso

 

       bsf    STATUS,C     ;Carry bit=1

       btfss  PORTA,DO     ;DO=high?

       bcf    STATUS,C     ;no, carry bit=0

 

       rlf    S,F          ;desplaza valor un bit a la izq.

 

       decfsz J,F          ;J=J-1

       goto   next        

 

       bsf    PORTA,CS     ;CS=high

       bcf    PORTA,CLK    ;CLK=low

 

       return

 

;********************************

retrazo:

       movlw  D'120'       ;K=120

       movwf  K

delay:

       decfsz K,F          ;K=K-1

       goto   delay

 

       return

 

;********************************

display:

       clrf   T            ;Contador de centenas=0

centenas:

       incf   T,F          ;T=T+1

       movlw  D'100'       ;w=100

       subwf  S,F          ;s=s-w

       btfsc  STATUS,C     ;Carry=0? resultado negativo?

       goto   centenas     ;no, recicla.

 

       decf   T,F          ;T=T-1

       movlw  D'100'       ;w=100

       addwf  S,F          ;s=s+w

 

       clrf   D            ;Contador de decenas=0

decenas:

       incf   D,F          ;D=D+1

       movlw  D'10'        ;w=10

       subwf  S,F          ;s=s-w

       btfsc  STATUS,C     ;Carry=0? resultado negativo?

       goto   decenas             ;no, recicla.

 

       decf   D,F          ;D=D-1

       movlw  D'10'        ;w=10

       addwf  S,F          ;s=s+w

 

       clrf   U            ;Contador de unidades=0

unidades:

       incf   U,F          ;U=U+1

       movlw  D'1'         ;w=1

       subwf  S,F          ;s=s-w

       btfsc  STATUS,C     ;Carry=0? resultado negativo?

       goto   unidades     ;no, recicla.

 

       decf   U,F          ;U=U-1

       movlw  D'1'         ;w=1

       addwf  S,F          ;s=s+w

 

      

       movf   T,W          ;w=T

       movwf  PORTB        ;PORTB=w

       bsf    PORTB,L1     ;Enciende el digito de centenas

       call   retrazo            

       bcf    PORTB,L1     ;Apaga el digito de centenas

 

       movf   D,W          ;w=D

       movwf  PORTB        ;PORTB=w

       bsf    PORTB,L2     ;Enciende el digito de decenas

       call   retrazo            

       bcf    PORTB,L2     ;Apaga el digito de decenas

 

       movf   U,W          ;w=U

       movwf  PORTB        ;PORTB=w

       bsf    PORTB,L3     ;Enciende el digito de unidades

       call   retrazo            

       bcf    PORTB,L3     ;Apaga el digito de unidades

 

       return

;*******************************

 

                end         

 

 

This is how simple the PIC programer can be made.

 

I connected my display to the current transformer and used it to display a value proportional to the current flowing on my AC drive

 

 

Circuit diagram of display.

 

Back to index page.