0% encontró este documento útil (0 votos)
55 vistas6 páginas

Practica 3

Este documento describe un programa para mostrar el tiempo en centésimas de segundo en cuatro displays de 7 segmentos mientras se mantiene pulsado un botón. Cuando el botón está pulsado, los displays muestran "PU" parpadeando y el microcontrolador mide el tiempo. Cuando se suelta el botón, convierte el tiempo medido a BCD y lo muestra en los displays.

Cargado por

Lorena Agachi
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
55 vistas6 páginas

Practica 3

Este documento describe un programa para mostrar el tiempo en centésimas de segundo en cuatro displays de 7 segmentos mientras se mantiene pulsado un botón. Cuando el botón está pulsado, los displays muestran "PU" parpadeando y el microcontrolador mide el tiempo. Cuando se suelta el botón, convierte el tiempo medido a BCD y lo muestra en los displays.

Cargado por

Lorena Agachi
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

;Realice un programa que muestre por los cuatro Displays de 7 segmentos

el tiempo, con precisión de centésimas de segundo [[Link]],


;el tiempo durante el que se ha mantenido pulsado el botón RA4.
;a) Cuando el pulsador RA4 está sin pulsar (RA4=1) se muestra en el
display el tiempo de la última pulsación
;b) Si el pulsador RA4 está pulsado (RA4=0), el display muestra el texto
"PU" parpadeando y, mediante un temporizador que genera
;interrupciones periódicas, el microcontrolador está midiendo el tiempo
;c) Una vez se suelta el pulsador, se convierte la medida del tiempo a
BCD/7SEGMENTOS y se muestra en el display

LIST p=16F877A ; Directiva para iniciar el tipo de


PIC
INCLUDE [Link]; Definiciones de registros
internos
__CONFIG _XT_OSC & _WDT_OFF & _LVP_OFF

RET1 equ 0x20


RET2 equ 0x21
RESTA equ 0x22
CONT equ 0x30
CONTCENT equ 0x31 ;contara las veces que se
desborda TMR1 (centesimas)
CONTDEC equ 0x32 ;cuenta las decimas
CONTSEG equ 0x33 ;cuenta los segundos
CONTD equ 0x34 ;cuenta decenas de segundos
CONT20 equ 0x35 ;contador para retardo
de 20ms
W_TEMP equ 0x40 ;guarda valor de W
durante la interrupcion
STATUS_TEMP equ 0x41 ; " " " STATUS "
" "
PCLATH_TEMP equ 0x42 ; " " " PCLATH "
" "
CONTANDO equ 0x43 ;registro auxiliar para
saber si estaba o no pulsado (para saber si sigo contando o empiezo de
nuevo)

org 0x00
goto INICIO
org 0x04
goto RAI

;RUTINA DE ATENCION A LA INTERRUPCION:_______AQUI VIENE CUANDO SE


DESBORDA EL TMR1 (pasan 10ms)
RAI movwf W_TEMP
swapf STATUS,0
bcf STATUS,RP0
bcf STATUS,RP1
movwf STATUS_TEMP
movf PCLATH,0
movwf PCLATH_TEMP

bcf PIR1,TMR1IF ;baja el flag del


TMR1
movlw 0xFB ;vuelvo a cargar
TMR1
movwf TMR1H
movlw 0x1E
movwf TMR1L

btfsc PORTA,4
goto PARO ;no pulsado
btfsc CONTANDO,0 ;miro si contando esta
a 0 o a 1 mirando su bit 0
goto CUENTA
goto REINICIO

PARO clrf CONTANDO


goto SAL_RAI

;__________________________________________SI CONTANDO=0 VA AQUI


REINICIO movlw .1
movwf CONTANDO
bcf T1CON, TMR1ON ;apago el tmr1
bsf T1CON, TMR1ON ;y lo vuelvo a
encender para que se reinicie
clrf CONTCENT
clrf CONTDEC
clrf CONTSEG
clrf CONTD
goto SAL_RAI

;__________________________________________SI CONTANDO=1 VA AQUI


CUENTA incf CONTCENT,1 ;incrementa el
contador de centesimas

movlw 0x0A
subwf CONTCENT,0
btfss STATUS,Z ;¿Z=1,resta=0?
goto SAL_RAI ;no
incf CONTDEC,1 ;si, incrementa
contador de decimas
clrf CONTCENT ;pone el de
centesimas a 0

movlw 0x0A
subwf CONTDEC,0
btfss STATUS,Z ;¿Z=1,resta=0?
goto SAL_RAI ;no
incf CONTSEG,1 ;si, incrementa
contador de segundos
clrf CONTDEC ;pone el de
decimas a 0

movlw 0x0A
subwf CONTSEG,0
btfss STATUS,Z ;¿Z=1,resta=0?
goto SAL_RAI ;no
incf CONTD,1 ;si, incrementa
contador de decenas de segundo
clrf CONTSEG ;pone el de
segundos a 0

SAL_RAI movf PCLATH_TEMP,0


movwf PCLATH
swapf STATUS_TEMP,0
movwf STATUS
swapf W_TEMP,1
swapf W_TEMP,0
retfie

TABLA addwf PCL,F ; Suma del PC con el dígito a


representar (en W)
RETLW 0xC0 ; Código 7 segmentos complementado para
el cero
RETLW 0xF9 ; el uno
RETLW 0xA4 ; el dos
RETLW 0xB0 ; el tres
RETLW 0x99 ; el cuatro
RETLW 0x92 ; el cinco
RETLW 0x82 ; el seis
RETLW 0xF8 ; el siete
RETLW 0x80 ; el ocho
RETLW 0x98 ; el nueve

PUNTO movwf RESTA


movlw 0x80
subwf RESTA,0
return

INICIO clrf PORTA


clrf PORTD
movlw .50
movwf CONT ;contador
auxiliar para el retardo de 500ms (=2*(50*5ms))
clrf CONTCENT
clrf CONTDEC
clrf CONTSEG
clrf CONTD
movlw .4
movwf CONT20
clrf CONTANDO ;inicializo
contando a 0

movlw 0xFB ;cargo TMR1 con


64286 (0xFB en TMR1H y 0x1E en TMR1L) (temporizara 10ms, 1 centesima)
movwf TMR1H
movlw 0x1E
movwf TMR1L

bcf STATUS,RP1
bsf STATUS,RP0 ;banco 1
movlw b'00000110'
movwf ADCON1 ;PORTA con todas
las señales digitales
clrf TRISD
movlw b'0010000' ;todo salidas menos
RA4, que se configura como entrada
movwf TRISA
;___________________________________________
movlw b'00000111' ;TMR0
temporizador con predivisor de 256
movwf OPTION_REG
bsf PIE1,TMR1IE ;habilita
interrupciones por desbordamiento de TMR1
bcf STATUS,RP0
bcf PIR1,TMR1IF
bsf INTCON,GIE ;habilita
interrupciones globales SIEMPRE
bsf INTCON,PEIE ;habilita
interrupciones de perifericos PARA TMR1
bcf INTCON, T0IE ;deshabilita la
interrupcion por desbordamiento del TMR0
bcf INTCON,T0IF ;se asegura de
que el flag de TMR0 este a 0
;___________________________________________
movlw b'00110000' ;TMR1
temporizador con predivisor de 8
movwf T1CON
bsf T1CON, TMR1ON ;empiezo a contar
goto MUESTRA

;___________________________________________PROGRAMA SI ESTA PULSADO RA4:


PU movlw b'00000001' ;activa display0
movwf PORTA
movlw b'11000001' ;codigo BCD para
la 'U'
movwf PORTD
call RET500MS1

U movlw b'00000010' ;activa display1


movwf PORTA
movlw b'10001100' ;codigo BCD para
la 'P'
movwf PORTD
call RET500MS1
call PUOMUESTRA
goto PU

APAGADO clrf PORTD


clrf PORTA ;apago los
displays
call RET500MS2
goto APAGADO

;___________________________________________RETARDO DE 10MS MEDIANTE TMR0


RET5MS movlw d'236' ;carga el valor
236 en TMR0 (se temporizan 5ms)
movwf TMR0 ;T=(256-
n)*256*1u=5ms
RET btfss INTCON,T0IF ;¿se ha
desbordado TMR0?
goto RET ;no, espero
bcf INTCON,T0IF ;si, T0IF=0
return

RET500MS1 call RET5MS


decfsz CONT,1 ;decremento CONT
return ;le resto 1
al cont y si no es 0, vuelvo
movlw .50
movwf CONT ;recargo contador
goto APAGADO

RET500MS2 call RET5MS


decfsz CONT,1 ;decremento CONT
return ;si no es
0, vuelvo
movlw .50
movwf CONT ;recargo contador
goto PU

PUOMUESTRA btfsc CONTANDO,0


goto PU ;si
contando es 1, me enseña PU
goto MUESTRA ;si contando es
0, me enseña la temporizacion

;___________________________________________PROGRAMA PARA 00.00 O CUANDO


SE SUELTE RA4
MUESTRA movlw b'00000001' ;_________ENSEÑA CENTESIMAS

movwf PORTA ;se activa


display 0
movf CONTCENT,0 ;muevo el
contador de las centesimas a WREG
call TABLA
movwf PORTD ;volvera de TABLA
con el valor del numero en BCD
call RET5MS ;espero 5ms

;___________________________________________ENSEÑA DECIMAS DE SEGUNDO


movlw b'00000010'
movwf PORTA ;se activa
display 1
movf CONTDEC,0 ;muevo el
contador de decimas a WREG
call TABLA
movwf PORTD
call RET5MS

;___________________________________________ENSEÑA SEGUNDOS
movlw b'00000100'
movwf PORTA ;se activa
display 2
movf CONTSEG,0 ;muevo el
contador de segundos a WREG
call TABLA ;la tabla me
devolvera el numero sin en punto de decimales
call PUNTO ;le pongo el
punto restandole 0x80 a lo que llega de la tabla
movwf PORTD
call RET5MS

;___________________________________________ENSEÑA DECIMAS
movlw b'00001000'
movwf PORTA ;se activa
display 3
movf CONTD,0 ;muevo el
contador de decimas a WREG
call TABLA
movwf PORTD
call RET5MS

call PUOMUESTRA

goto MUESTRA

end

También podría gustarte