Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
;#############################################################
; Fichero : Atimer2.0.asm
; Autor : Ivan E.G.
; Fecha: Marzo 2002.
; Version:0.0
; Sistema RAD-MICROS.
; Placa Microcontroladora: micro-p1684.
; Placa de Aplicaciones: apli-timercc.
; Placa de programacion: Programador Universal Superpro II/P. ( XELTEK )
; Bus: bus-40.
; Codigo para: PIC16C84 y PIC16F84
p=PIC16F84A
#include <H16f84a.inc>
w_temp
EQU
status_temp
0x0C
EQU
0x0D
con0
EQU
0x0E
; Variable de temporizacion.
con1
EQU
0x0F
; Variable de temporizacion.
con2
EQU
0x10
; Variable de temporizacion.
u_s
EQU
0x11
; Unidades de segundo.
d_s
EQU
0x12
; Decenas de segundo.
c_s
EQU
0x13
; Centenas de segundo.
m_s
EQU
0x14
; Millares de segundo.
start
EQU
0x15
; start=1 decrementa.
; start=0 se para.
;################ COMIENZO DEL PROGRAMA #####################
ORG
0x00
GOTO inicio
; Vector de Reset.
; Programa Principal.
ORG
0x04
; Vector de interrupcion.
MOVWF w_temp
; Guarda W.
MOVF STATUS,W
MOVWF status_temp
DECFSZ con0,F
; Guarda STATUS.
GOTO salir
MOVLW 0x3D
MOVWF con0
GOTO salir
MOVLW 0x09
MOVWF u_s
; 9 --> u_s
GOTO salir
MOVLW 0x09
MOVWF d_s
; 9 --> d_s
SUBLW 0xFF
BTFSS STATUS,Z
GOTO salir
MOVLW 0x09
MOVWF c_s
; 9 --> c_s
BTFSS STATUS,Z
GOTO salir
MOVLW 0x09
MOVWF m_s
salir
; 9 --> m_s
MOVF status_temp,W
MOVWF STATUS
; Recupera STATUS.
SWAPF w_temp,F
SWAPF w_temp,W
BCF
INTCON,T0IF
RETFIE
; Recupera W.
; Bajamos Bandera T0IF.
; Retorno de interrupcion.
BSF
STATUS,RP0
; Banco 1
MOVLW B'10000101'
; Divisor = 64
MOVWF OPTION_REG
; Configuramos TMR0
MOVLW B'11110000'
MOVWF TRISB
MOVLW B'00000000'
MOVWF TRISA
BCF
STATUS,RP0
BCF
PORTA,4
; Banco 0
MOVLW 0x3D
MOVWF con0
CLRF TMR0
; TMR0 = 0
MOVLW 0x09
MOVWF u_s
; u_s = 9
MOVWF d_s
; d_s = 9
MOVWF c_s
; c_s = 9
MOVWF m_s
CLRF start
; m_s = 9
; temporizador parado
MOVLW B'10100000'
MOVWF INTCON
bucle
BTFSS PORTB,6
CALL mas_cs
BTFSS PORTB,5
CALL mas_ds
BTFSS PORTB,4
CALL mas_us
BTFSS PORTB,7
CALL start_stop
CALL todo_0
CALL display
GOTO bucle
;############### FIN DE PROGRAMA PRINCIPAL ##################
;#################### RUTINAS ###############################
;************************************************************
; RUTINA: display
MOVF u_s,W
MOVWF PORTA
BSF
PORTB,0
CALL delay
BCF
PORTB,0
MOVF d_s,W
MOVWF PORTA
BSF
PORTB,1
CALL delay
BCF
PORTB,1
MOVF c_s,W
MOVWF PORTA
BSF
PORTB,2
CALL delay
BCF
PORTB,2
MOVF m_s,W
MOVWF PORTA
BSF
PORTB,3
CALL delay
BCF
PORTB,3
RETURN
;************************************************************
; FIN DE RUTINA: display
;************************************************************
;************************************************************
; RUTINA: start_stop
; Funcion: Establece el COMIENZO o la PARADA del TEMPORIZADOR.
; Entrada: nada
; Salida: nada
; Variables utilizadas: start
;************************************************************
start_stop
CALL delay_r
MOVLW 0x01
XORWF start,F
MOVF start,W
BTFSS STATUS,Z
GOTO cuenta
MOVLW B'00100000'
MOVWF INTCON
GOTO fuera
cuenta
MOVLW B'10100000'
MOVWF INTCON
fuera
RETURN
;************************************************************
; FIN DE RUTINA: start_stop
;************************************************************
;************************************************************
; RUTINA: mas_us
; Funcion: Modifica UNIDADES DE SEGUNDOS.
; Entrada: nada
; Salida: nada
; Variables utilizadas: nada
;************************************************************
mas_us
; Tratamos unidades de segundos.
INCF u_s,F
MOVF u_s,W
SUBLW 0x0A
BTFSS STATUS,Z
; 10 - (u_s) --> W
; Si Z=1 => (u_s) = 10
GOTO salus
MOVLW 0x00
MOVWF u_s
salus
CALL delay_r
; 0 --> u_s
; Eliminamos rebotes del PULSADOR.
RETURN
;************************************************************
; FIN DE RUTINA: mas_us
;************************************************************
;************************************************************
; RUTINA: todo_0
; Funcion: Para el temporizador si todas las unidades est n a 0
; Entrada: nada
; Salida: nada
; Variables utilizadas: nada
;************************************************************
todo_0
MOVF u_s,W
BTFSS STATUS,Z
GOTO sal
MOVF d_s,W
BTFSS STATUS,Z
GOTO sal
MOVF c_s,W
BTFSS STATUS,Z
GOTO sal
MOVF m_s,W
BTFSS STATUS,Z
GOTO sal
MOVLW B'00100000'
MOVWF INTCON
BSF
PORTA,4
; Se activa el zumbador.
CALL zumba
BCF
sal
PORTA,4
RETURN
;************************************************************
; FIN DE RUTINA: todo_0
;************************************************************
;************************************************************
; RUTINA: zumba
; Funcion: zumba
; Entrada: nada
; Salida: nada
; Variables utilizadas: nada
;************************************************************
zumba
MOVLW 0x3D
MOVF con1
zumba_1
DECFSZ con2,F
GOTO zumba_1
Return
;************************************************************
; FIN DE RUTINA: todo_0
;************************************************************
;************************************************************
; RUTINA: mas_ds
; Funcion: Modifica DECENAS DE SEGUNDOS.
; Entrada: nada
; Salida: nada
; Variables utilizadas: nada
;************************************************************
mas_ds
; Tratamos decenas de segundos.
INCF d_s,F
MOVF d_s,W
SUBLW 0x0A
BTFSS STATUS,Z
; 10 - (d_s) --> W
; Si Z=1 => (d_s) = 10
GOTO salds
MOVLW 0x00
MOVWF d_s
salds
CALL delay_r
; 0 --> d_s
; Eliminamos rebotes del PULSADOR.
RETURN
;************************************************************
; FIN DE RUTINA: mas_ds
;************************************************************
;************************************************************
; RUTINA: mas_cs
; Funcion: Modifica CENTENAS DE SEGUNDOS.
; Entrada: nada
; Salida: nada
; Variables utilizadas: nada
;************************************************************
mas_cs
; Tratamos centenas de segundos.
INCF c_s,F
MOVF c_s,W
SUBLW 0x0A
BTFSS STATUS,Z
; 10 - (c_s) --> W
; Si Z=1 => (c_s) = 10
GOTO salcs
MOVLW 0x00
MOVWF c_s
; 0 --> c_s
INCF m_s,F
MOVF m_s,W
SUBLW 0x0A
BTFSS STATUS,Z
GOTO salcs
MOVLW 0x00
MOVWF m_s
salcs
CALL delay_r
RETURN
;************************************************************
; FIN DE RUTINA: mas_cs
;************************************************************
;************************************************************
; RUTINA: delay
; Funcion: Produce un retardo para displays.
; Entrada: nada
; Salida: nada
; Variables utilizadas: con1, con2
;************************************************************
delay
CLRF con1
MOVLW 0x05
MOVWF con2
loop
DECFSZ con1,F
GOTO loop
DECFSZ con2,F
GOTO loop
RETURN
;************************************************************
; FIN DE RUTINA: delay
;************************************************************
;************************************************************
; RUTINA: delay_r
; Funcion: Produce un retardo para evitar rebotes en PULSADORES.
; Entrada: nada
; Salida: nada
; Variables utilizadas: con1, con2
;************************************************************
delay_r
MOVLW 0x2D
MOVWF con1
loop_r
DECFSZ con1,F
GOTO loop_r
RETURN
;************************************************************
; FIN DE RUTINA: delay_r
;************************************************************
;################## FIN DE RUTINAS ##########################
;################## FIN DE PROGRAMA ########################
END
; Fin de programa.