Está en la página 1de 4

Contador de 4 dgitos

U1
13
14
1

+5V

2
3
4
5
6
7

R14
10k

S1

RESET

R12
10k

8
9
10

OSC1/CLKIN
OSC2/CLKOUT
MCLR/Vpp/THV

RA0/AN0
RA1/AN1
RA2/AN2/VREFRA3/AN3/VREF+
RA4/T0CKI
RA5/AN4/SS
RC0/T1OSO/T1CKI
RC1/T1OSI/CCP2
RE0/AN5/RD
RC2/CCP1
RE1/AN6/WR
RC3/SCK/SCL
RE2/AN7/CS
RC4/SDI/SDA
RC5/SDO
RC6/TX/CK
RC7/RX/DT
RD0/PSP0
RD1/PSP1
RD2/PSP2
RD3/PSP3
RD4/PSP4
RD5/PSP5
RD6/PSP6
RD7/PSP7

S2

BOTON1

U2
RB0/INT
RB1
RB2
RB3/PGM
RB4
RB5
RB6/PGC
RB7/PGD

33
34
35
36
37
38
39
40
15
16
17
18
23
24
25
26

7
1
2
6
4
5
3

A
B
C
D
BI/RBO
RBI
LT
74LS48

19
20
21
22
27
28
29
30

QA
QB
QC
QD
QE
QF
QG

13
12
11
10
9
15
14

DISP1

R1
R3
R2
220R
R4
220R
R5
220R
R6
220R
R7
220R
220R
220R

U3:A
1

2
74LS04

U3:B
3

4
74LS04

U3:C
5

6
74LS04

U3:D
13

12

PIC16F877
74LS04

;Contador de 4 dgitos 0000 a 9999 en displays con PIC877


; ******** DEFINICION DE REGISTROS UTILIZADOS
pcl
status
ptoa
ptob
ptoc
ptod
ptoe
pclath
intcon
pir1
rcsta
txreg
rcreg
adresh
adcon0
trisa
trisb
trisc
trisd
trise
txsta
spbrg
adresl
adcon1

equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ

02h
03
05
06
07
08
09
0ah
0bh
0ch
18h
19h
1ah
1eh
1fh
85h
86h
87h
88h
89h
98h
99h
9eh
9fh

;Definicin de bits utilizados


rp0
rp1
irp
z
c

equ
equ
equ
equ
equ

5
6
7
2
0

txif
go

equ
equ

4
2

;Variables del usuario


loops
loops2
loops3
dig0
dig1
dig2
dig3

equ
equ
equ
equ
equ
equ
equ

30h
31h
36h
32h
33h
34h
35h

; ************ Configuracin para el simulador Proteus


list p=16f877
_CP_ALL
_CP_HALF
_CP_UPPER_256
_CP_OFF
_DEBUG_ON
_DEBUG_OFF
_WRT_ENABLE_ON
_WRT_ENABLE_OFF
_CPD_ON
_CPD_OFF
_LVP_ON
_LVP_OFF
_BODEN_ON
_BODEN_OFF
_PWRTE_OFF
_PWRTE_ON
_WDT_ON
_WDT_OFF
_LP_OSC
_XT_OSC
_HS_OSC
_RC_OSC

EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU

H'0FCF'
H'1FDF'
EQU H'2FEF'
H'3FFF'
H'37FF'
H'3FFF'
EQU H'3FFF'
EQU H'3DFF'
H'3EFF'
H'3FFF'
H'3FFF'
H'3F7F'
H'3FFF'
H'3FBF'
H'3FFF'
H'3FF7'
H'3FFF'
H'3FFB'
H'3FFC'
H'3FFD'
H'3FFE'
H'3FFF'

__CONFIG _CP_OFF & _WDT_OFF & _XT_OSC & _PWRTE_ON

retarms
otro2
otro

retarboton

org
goto

00
inicio

movwf
movlw
movwf
nop
nop
nop
nop
nop
nop
decfsz
goto
decfsz
goto
return

loops
d'110'
loops2

movlw

d'10'

;retardo de milisegundos cargado desde afuera

loops2,1
otro
loops,1
otro2
;retardo de 100 milisegundos con display activo

masboton

display

movwf
call
decfsz
goto
return

loops3
display
loops3,1
masboton

clrf
movf
movwf
bsf
movlw
call
bcf
movf
movwf
bsf
movlw
call
bcf
movf
movwf
bsf
movlw
call
bcf
movf
movwf
bsf
movlw
call
bcf
return

ptoc
dig0,0
ptob
ptoc,3
d'3'
retarms
ptoc,3
dig1,0
ptob
ptoc,2
d'3'
retarms
ptoc,2
dig2,0
ptob
ptoc,1
d'3'
retarms
ptoc,1
dig3,0
ptob
ptoc,0
d'3'
retarms
ptoc,0

;rutina que carga cada dato en su respectivo display


;activando el transistor correspondiente en cada caso

; ****** Programa Principal


inicio

ciclo1

bcf
bsf
movlw
movwf
movlw
movwf
movlw
movwf
movlw
movwf
movlw
movwf
movlw
movwf
bcf

status,6
status,5
b'1111111'
trisa
b'11110000'
trisb
b'11110000'
trisc
b'1111111'
trisd
b'11101111'
trise
b'11110111'
adcon1
status,5

clrf
clrf
clrf
clrf
clrf
clrf

dig0
dig1
dig2
dig3
ptob
ptoc

;inicio con displays en ceros

call
btfsc
goto
call

display
ptoc,7
ciclo1
retarboton

;siempre refresca los displays


;pregunta si botn 1 esta en cero (oprimido)
;retardo de 100 ms con display activo

espera

call
btfss
goto

display
ptoc,7
espera

incf
movf
xorlw
btfss
goto
clrf

dig0,1
dig0,0
d'10'
status,2
ciclo1
dig0

; ****** Inicia incremento de displays


;incrementa digito 0
;pasa digito 0 a W
;prueba si el contador llego a 10
;pregunta si es cierto
;si no ha llegado a diez vuelve a ciclo1
;si llego a diez lo pone en cero e incrementa al otro

incf
movf
xorlw
btfss
goto
clrf

dig1,1
dig1,0
d'10'
status,2
ciclo1
dig1

;incrementa digito 1
;pasa digito 1 a W
;prueba si el contador llego a 10
;pregunta si es cierto
;si no ha llegado a diez vuelve a ciclo1
;si llego a diez lo pone en cero e incrementa al otro

incf
movf
xorlw
btfss
goto
clrf

dig2,1
dig2,0
d'10'
status,2
ciclo1
dig2

;incrementa digito 2
;pasa digito 2 a W
;prueba si el contador llego a 10
;pregunta si es cierto
;si no ha llegado a diez vuelve a ciclo1
;si llego a diez lo pone en cero e incrementa al otro

incf
movf
xorlw
btfss
goto
clrf

dig3,1
dig3,0
d'10'
status,2
ciclo1
dig3

;incrementa digito 3
;pasa digito 3 a W
;prueba si el contador llego a 10
;pregunta si es cierto
;si no ha llegado a diez vuelve a ciclo1
;si llego a diez lo pone en cero e incrementa al otro

goto

inicio

;puede ser a ciclo 1

end

;pregunta si botn 1 esta en uno (suelto)


;si no est suelto sigue esperando con display activo
;si lo sueltan, entonces sigue con los incrementos

También podría gustarte