Está en la página 1de 4

Contador de 4 dígitos DISP1

U1 U2 R1
13 33 7 13
14
OSC1/CLKIN RB0/INT
34 1
A QA
12
R3
+5V
1
OSC2/CLKOUT RB1
35 2
B QB
11
R2
220R
MCLR/Vpp/THV RB2
36 6
C QC
10
R4
220R
2
RB3/PGM
37 4
D QD
9
R5
220R
3
RA0/AN0 RB4
38 5
BI/RBO QE
15
R6
220R
4
RA1/AN1 RB5
39 3
RBI QF
14
R7
220R
RA2/AN2/VREF- RB6/PGC LT QG 220R
5 40
RA3/AN3/VREF+ RB7/PGD 220R
6 74LS48
RA4/T0CKI
7
RA5/AN4/SS RC0/T1OSO/T1CKI
15
16
U3:A
RC1/T1OSI/CCP2
R14 R12 8
9
RE0/AN5/RD RC2/CCP1
17
18
1 2
10k 10k RE1/AN6/WR RC3/SCK/SCL
10 23
RE2/AN7/CS RC4/SDI/SDA 74LS04
RC5/SDO
24
25
U3:B
RC6/TX/CK
26 3 4
RC7/RX/DT
19
RD0/PSP0 74LS04
S1 S2 RD1/PSP1
20
21
U3:C
RD2/PSP2
22 5 6
RD3/PSP3
27
RD4/PSP4
28
RD5/PSP5 74LS04
RD6/PSP6
29
30
U3:D
RD7/PSP7
RESET BOTON1 PIC16F877
13 12

74LS04

;Contador de 4 dígitos 0000 a 9999 en displays con PIC877


; ******** DEFINICION DE REGISTROS UTILIZADOS

pcl equ 02h


status equ 03
ptoa equ 05
ptob equ 06
ptoc equ 07
ptod equ 08
ptoe equ 09
pclath equ 0ah
intcon equ 0bh
pir1 equ 0ch
rcsta equ 18h
txreg equ 19h
rcreg equ 1ah
adresh equ 1eh
adcon0 equ 1fh
trisa equ 85h
trisb equ 86h
trisc equ 87h
trisd equ 88h
trise equ 89h
txsta equ 98h
spbrg equ 99h
adresl equ 9eh
adcon1 equ 9fh

;Definición de bits utilizados

rp0 equ 5
rp1 equ 6
irp equ 7
z equ 2
c equ 0
txif equ 4
go equ 2

;Variables del usuario

loops equ 30h


loops2 equ 31h
loops3 equ 36h
dig0 equ 32h
dig1 equ 33h
dig2 equ 34h
dig3 equ 35h

; ************ Configuración para el simulador Proteus

list p=16f877

_CP_ALL EQU H'0FCF'


_CP_HALF EQU H'1FDF'
_CP_UPPER_256 EQU H'2FEF'
_CP_OFF EQU H'3FFF'
_DEBUG_ON EQU H'37FF'
_DEBUG_OFF EQU H'3FFF'
_WRT_ENABLE_ON EQU H'3FFF'
_WRT_ENABLE_OFF EQU H'3DFF'
_CPD_ON EQU H'3EFF'
_CPD_OFF EQU H'3FFF'
_LVP_ON EQU H'3FFF'
_LVP_OFF EQU H'3F7F'
_BODEN_ON EQU H'3FFF'
_BODEN_OFF EQU H'3FBF'
_PWRTE_OFF EQU H'3FFF'
_PWRTE_ON EQU H'3FF7'
_WDT_ON EQU H'3FFF'
_WDT_OFF EQU H'3FFB'
_LP_OSC EQU H'3FFC'
_XT_OSC EQU H'3FFD'
_HS_OSC EQU H'3FFE'
_RC_OSC EQU H'3FFF'

__CONFIG _CP_OFF & _WDT_OFF & _XT_OSC & _PWRTE_ON

org 00
goto inicio

retarms movwf loops ;retardo de milisegundos cargado desde afuera


otro2 movlw d'110'
movwf loops2
otro nop
nop
nop
nop
nop
nop
decfsz loops2,1
goto otro
decfsz loops,1
goto otro2
return

retarboton movlw d'10' ;retardo de 100 milisegundos con display activo


movwf loops3
masboton call display
decfsz loops3,1
goto masboton
return

display clrf ptoc ;rutina que carga cada dato en su respectivo display
movf dig0,0 ;activando el transistor correspondiente en cada caso
movwf ptob
bsf ptoc,3
movlw d'3'
call retarms
bcf ptoc,3
movf dig1,0
movwf ptob
bsf ptoc,2
movlw d'3'
call retarms
bcf ptoc,2
movf dig2,0
movwf ptob
bsf ptoc,1
movlw d'3'
call retarms
bcf ptoc,1
movf dig3,0
movwf ptob
bsf ptoc,0
movlw d'3'
call retarms
bcf ptoc,0
return

; ****** Programa Principal

inicio bcf status,6


bsf status,5
movlw b'1111111'
movwf trisa
movlw b'11110000'
movwf trisb
movlw b'11110000'
movwf trisc
movlw b'1111111'
movwf trisd
movlw b'11101111'
movwf trise
movlw b'11110111'
movwf adcon1
bcf status,5

clrf dig0 ;inicio con displays en ceros


clrf dig1
clrf dig2
clrf dig3
clrf ptob
clrf ptoc

ciclo1 call display ;siempre refresca los displays


btfsc ptoc,7 ;pregunta si botón 1 esta en cero (oprimido)
goto ciclo1
call retarboton ;retardo de 100 ms con display activo
espera call display
btfss ptoc,7 ;pregunta si botón 1 esta en uno (suelto)
goto espera ;si no está suelto sigue esperando con display activo
;si lo sueltan, entonces sigue con los incrementos

; ****** Inicia incremento de displays


incf dig0,1 ;incrementa digito 0
movf dig0,0 ;pasa digito 0 a W
xorlw d'10' ;prueba si el contador llego a 10
btfss status,2 ;pregunta si es cierto
goto ciclo1 ;si no ha llegado a diez vuelve a ciclo1
clrf dig0 ;si llego a diez lo pone en cero e incrementa al otro

incf dig1,1 ;incrementa digito 1


movf dig1,0 ;pasa digito 1 a W
xorlw d'10' ;prueba si el contador llego a 10
btfss status,2 ;pregunta si es cierto
goto ciclo1 ;si no ha llegado a diez vuelve a ciclo1
clrf dig1 ;si llego a diez lo pone en cero e incrementa al otro

incf dig2,1 ;incrementa digito 2


movf dig2,0 ;pasa digito 2 a W
xorlw d'10' ;prueba si el contador llego a 10
btfss status,2 ;pregunta si es cierto
goto ciclo1 ;si no ha llegado a diez vuelve a ciclo1
clrf dig2 ;si llego a diez lo pone en cero e incrementa al otro

incf dig3,1 ;incrementa digito 3


movf dig3,0 ;pasa digito 3 a W
xorlw d'10' ;prueba si el contador llego a 10
btfss status,2 ;pregunta si es cierto
goto ciclo1 ;si no ha llegado a diez vuelve a ciclo1
clrf dig3 ;si llego a diez lo pone en cero e incrementa al otro

goto inicio ;puede ser a ciclo 1

end

También podría gustarte