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.