|
;#############################################################
; Fichero : Amini.asm
; Autor : Almudena Soblechero Garc¡a.
; Profesor: Juan Mu¤oz Barbo.
; Fecha: Marzo de 2002.
; Version:0.0
; Sistema RAD-MICROS.
; Placa Microcontroladora: micro-p1684.
; Placa de Aplicaciones: apli-miniclock.
; Placa de programacion: Programador Universal Superpro II/P. (
XELTEK )
; Bus: bus-40.
; Codigo para: PIC16C84 y PIC16F84
; Clock: 4MHz , XT. -> Ciclo = 1 uS.
; Reset: Power On Reset.
; Watch dog: Inhabilitado.
; Proteccion de codigo: Inhabilitado.
; Ficheros requeridos: H16f84a.inc
; Funcion : Genera RELOJ DIGITAL con BCD to 7 segment con
alarma.
;#############################################################
;#################### CABEZERAS ##############################
LIST p=PIC16F84A ; Directiva para definir micro.
#include <H16f84a.inc> ; Fichero standard de cabezera.
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC
;#################### DEFINICIONES ###########################
w_temp EQU 0x0C ; Variable para guardar W.
status_temp EQU 0x0D ; Variable para guardar STATUS.
con0 EQU 0x0E ; Variable de temporizacion.
con1 EQU 0x0F ; Variable de temporizacion.
con2 EQU 0x10 ; Variable de temporizacion.
u_s_t EQU 0x11 ; Unidades de segundo de tiempo.
d_s_t EQU 0x12 ; Decenas de segundo de tiempo.
u_m_t EQU 0x13 ; Unidades de minuto de tiempo.
d_m_t EQU 0x14 ; Decenas de minuto de tiempo.
u_h_t EQU 0x15 ; Unidades de hora de tiempo.
d_h_t EQU 0x16 ; Decenas de hora de tiempo.
u_s_a EQU 0x17 ; Unidades de segundo de alarma.
d_s_a EQU 0x18 ; Decenas de segundo de alarma.
u_m_a EQU 0x19 ; Unidades de minuto de alarma.
d_m_a EQU 0x1A ; Decenas de minuto de alarma.
u_h_a EQU 0x1B ; Unidades de hora de alarma.
d_h_a EQU 0x1C ; Decenas de hora de alarma.
;################ COMIENZO DEL PROGRAMA #####################
ORG 0x00 ; Vector de Reset.
GOTO inicio ; Programa Principal.
;########## TRATAMIENTO DE INTERRUPCIONES ####################
ORG 0x04 ; Vector de interrupcion.
MOVWF w_temp ; Guarda W.
MOVF STATUS,W
MOVWF status_temp ; Guarda STATUS.
DECFSZ con0,F ; Salta si tiempo = 1 seg.
GOTO salir
MOVLW 0x3D ; Variable para temporizar.
MOVWF con0 ; con0 x divisor x TMR0 = 1 segundo.
; Tratamos unidades de segundos de tiempo.
INCF u_s_t,F
MOVF u_s_t,W
SUBLW 0x0A ; 10 - (u_s_t) --> W
BTFSS STATUS,Z ; Si Z=1 => (u_s_t) = 10
GOTO salir
MOVLW 0x00
MOVWF u_s_t ; 0 --> u_s_t
; Tratamos decenas de segundos de tiempo.
INCF d_s_t,F
MOVF d_s_t,W
SUBLW 0x06 ; 6 - (d_s_t) --> W
BTFSS STATUS,Z ; Si Z=1 => (d_s_t) = 6
GOTO salir
MOVLW 0x00
MOVWF d_s_t ; 0 --> d_s_t
; Tratamos unidades de minutos de tiempo.
INCF u_m_t,F
MOVF u_m_t,W
SUBLW 0x0A ; 10 - (u_m_t) --> W
BTFSS STATUS,Z ; Si Z=1 => (u_m_t) = 10
GOTO salir
MOVLW 0x00
MOVWF u_m_t ; 0 --> u_m_t
; Tratamos decenas de minutos de tiempo.
INCF d_m_t,F
MOVF d_m_t,W
SUBLW 0x06 ; 6 - (d_m_t) --> W
BTFSS STATUS,Z ; Si Z=1 => (d_m_t) = 6
GOTO salir
MOVLW 0x00
MOVWF d_m_t ; 0 --> d_m_t
; Tratamos unidades de horas de tiempo.
INCF u_h_t,F
MOVF u_h_t,W ; Pueden ser las 24 horas ?
SUBLW 0x04 ; 4 - (u_h_t) --> W
BTFSS STATUS,Z ; Si Z=1 => (u_h_t) = 4
GOTO uh_t_no_4
GOTO uh_t_si_4
uh_t_no_4 MOVF u_h_t,W ; No son las 24 horas
SUBLW 0x0A ; 10 - (u_h_t) --> W
BTFSS STATUS,Z ; Si Z=1 => (u_h_t) = 10
GOTO salir
MOVLW 0x00
MOVWF u_h_t ; 0 --> u_h_t
; Tratamos decenas de horas de tiempo.
INCF d_h_t,F
GOTO salir
uh_t_si_4 MOVF d_h_t,W ; Son las 24 horas ?
SUBLW 0x02 ; 2 - (d_h_t) --> W
BTFSS STATUS,Z ; Si Z=1 => (d_h_t) = 2
GOTO salir
MOVLW 0x00 ; Son las 24 horas --> 00 horas.
MOVWF u_h_t ; 0 --> u_h_t
MOVWF d_h_t ; 0 --> d_h_t
; Comprobamos las unidades de minuto.
MOVF u_m_a,W ; Movemos al registro
XORWF u_m_t,W ; Comprobamos con una xor si son iguales umt y uma
BTFSS STATUS,Z ; Si Z=1 --> sigue (u_m_a = u_m_t)
GOTO salir
; Comprobamos las decenas de minuto.
MOVF d_m_a,W ; Movemos al registro
XORWF d_m_t,W ; Hacemos la comprobacion
BTFSS STATUS,Z ; Si Z=1 --> sigue (d_m_a = d_m_t)
GOTO salir
; Comprobamos las unidades de hora
MOVF u_h_a,W ; Movemos al registro
XORWF u_h_t,W ; Son u_h_t y u_h_a iguales?
BTFSS STATUS,Z ; Si Z=1 --> sigue (u_h_t = u_h_a)
GOTO salir
; Comprobamos las decenas de hora
MOVF d_h_a,W ; Movemos al registro
XORWF d_h_t,W ; Son d_h_t y d_h_a iguales?
BTFSS STATUS,Z ; Si Z=1--> Call a Zumba (d_h_t = d_h_a)
GOTO salir
CALL zumba
salir MOVF status_temp,W
MOVWF STATUS ; Recupera STATUS.
SWAPF w_temp,F
SWAPF w_temp,W ; Recupera W.
BCF INTCON,T0IF ; Bajamos Bandera T0IF.
RETFIE ; Retorno de interrupcion.
;########## FIN DE TRATAMIENTO DE INTERRUPCIONES #############
;################ PROGRAMA PRINCIPAL #########################
inicio BSF STATUS,RP0 ; Banco 1
MOVLW B'10000101' ; Divisor = 64
MOVWF OPTION_REG ; Configuramos TMR0
MOVLW B'11110000'
MOVWF TRISB ; Configuramos I/O PORTB se pulsan interruptores
MOVLW B'00000000'
MOVWF TRISA ; Configuramos I/O PORTA
BCF STATUS,RP0 ; Banco 0
CLRF PORTB
CLRF PORTA
MOVLW 0x3D ; Variable para temporizar.
MOVWF con0 ; con0 x divisor x TMR0 = 1 segundo.
CLRF TMR0 ; TMR0 = 0
CLRF u_s_t ; u_s_t = 0
CLRF d_s_t ; d_s_t = 0
CLRF u_m_t ; u_m_t = 0
CLRF d_m_t ; d_m_t = 0
CLRF u_h_t ; u_h_t = 0
CLRF d_h_t ; d_h_t = 0
MOVLW B'10100000' ; Habilitamos Interrupciones TOIE.
MOVWF INTCON
bucle CALL display_t ; Visualiza en los display la hora
BTFSC PORTB,6 ; Se pulsa set reloj
GOTO sigue
GOTO reloj
sigue BTFSC PORTB,7 ; Se pulsa set alarma
GOTO bucle
GOTO alarma
reloj BTFSS PORTB,5
CALL mas_h_t ; Se programa mas_h_t.
BTFSS PORTB,4
CALL mas_m_t ; Se programa mas_m_t.
GOTO bucle ; Hace un retorno al bucle
alarma BTFSS PORTB,5
CALL mas_h_a ; Se programa mas_h_a.
BTFSS PORTB,4
CALL mas_m_a ; Se programa mas_m_a.
CALL display_a ; Visualiza en los displays la alarma
BTFSS PORTB,7 ; Se sigue pulsando alarma?
GOTO alarma
GOTO bucle
;############### FIN DE PROGRAMA PRINCIPAL ##################
;#################### RUTINAS ###############################
;************************************************************
; RUTINA: display_t
; Funcion: Visualiza el tiempo en los displays de 7 segmentos.
; Entrada: u_m_t, d_m_t, u_h_t, d_h_t
; Salida: nada.
; Variables utilizadas: nada.
;************************************************************
display_t MOVF u_m_t,W ; Visualizo unidades de minutos de
tiempo.
MOVWF PORTA
BSF PORTB,0
CALL delay
BCF PORTB,0
MOVF d_m_t,W ; Visualizo decenas de minutos de tiempo.
MOVWF PORTA
BSF PORTB,1
CALL delay
BCF PORTB,1
MOVF u_h_t,W ; Visualizo unidades de horas de tiempo.
MOVWF PORTA
BSF PORTB,2
CALL delay
BCF PORTB,2
MOVF d_h_t,W ; Visualizo decenas de horas de tiempo.
MOVWF PORTA
BSF PORTB,3
CALL delay
BCF PORTB,3
RETURN
;************************************************************
; FIN DE RUTINA: display_t
;************************************************************
;************************************************************
; RUTINA: display_a
; Funcion: Visualiza la alrma en los displays de 7 segmentos.
; Entrada: u_m_a, d_m_a, u_h_a, d_h_a
; Salida: nada.
; Variables utilizadas: nada.
;************************************************************
display_a MOVF u_m_a,W ; Visualizo unidades de minutos de
alarma.
MOVWF PORTA
BSF PORTB,0
CALL delay
BCF PORTB,0
MOVF d_m_a,W ; Visualizo decenas de minutos de alarma.
MOVWF PORTA
BSF PORTB,1
CALL delay
BCF PORTB,1
MOVF u_h_a,W ; Visualizo unidades de horas de alarma.
MOVWF PORTA
BSF PORTB,2
CALL delay
BCF PORTB,2
MOVF d_h_a,W ; Visualizo decenas de horas de alarma.
MOVWF PORTA
BSF PORTB,3
CALL delay
BCF PORTB,3
RETURN
;************************************************************
; FIN DE RUTINA: display_a
;************************************************************
;************************************************************
; RUTINA: mas_h_t
; Funcion: Modifica HORAS al pulsar H+.
; Entrada: nada
; Salida: nada
; Variables utilizadas: nada
;************************************************************
mas_h_t
; Tratamos unidades de horas.
INCF u_h_t,F
MOVF u_h_t,W ; Pueden ser las 24 horas ?
SUBLW 0x04 ; 4 - (u_h_t) --> W
BTFSS STATUS,Z ; Si Z=1 => (u_h_t) = 4
GOTO uh_t_no_4h
GOTO uh_t_si_4h
uh_t_no_4h MOVF u_h_t,W ; No son las 24 horas
SUBLW 0x0A ; 10 - (u_h_t) --> W
BTFSS STATUS,Z ; Si Z=1 => (u_h_t) = 10
GOTO salh_t
MOVLW 0x00
MOVWF u_h_t ; 0 --> u_h_t
; Tratamos decenas de horas.
INCF d_h_t,F
GOTO salh_t
uh_t_si_4h MOVF d_h_t,W ; Son las 24 horas ?
SUBLW 0x02 ; 2 - (d_h_t) --> W
BTFSS STATUS,Z ; Si Z=1 => (d_h_t) = 2
GOTO salh_t
MOVLW 0x00 ; Son las 24 horas --> 00 horas.
MOVWF u_h_t ; 0 --> u_h_t
MOVWF d_h_t ; 0 --> d_h_t
salh_t CALL delay_r ; Eliminamos rebotes del PULSADOR.
RETURN
;************************************************************
; FIN DE RUTINA: mas_h_t
;************************************************************
;************************************************************
; RUTINA: mas_m_t
; Funcion: Modifica MINUTOS al pulsar M+.
; Entrada: nada
; Salida: nada
; Variables utilizadas: nada
;************************************************************
mas_m_t
; Tratamos unidades de minutos.
INCF u_m_t,F
MOVF u_m_t,W
SUBLW 0x0A ; 10 - (u_m_t) --> W
BTFSS STATUS,Z ; Si Z=1 => (u_m_t) = 10
GOTO salm_t
MOVLW 0x00
MOVWF u_m_t ; 0 --> u_m_t
; Tratamos decenas de minutos.
INCF d_m_t,F
MOVF d_m_t,W
SUBLW 0x06 ; 6 - (d_m_t) --> W
BTFSS STATUS,Z ; Si Z=1 => (d_m_t) = 6
GOTO salm_t
MOVLW 0x00
MOVWF d_m_t ; 0 --> d_m_t
salm_t CALL delay_r ; Eliminamos rebotes del PULSADOR.
RETURN
;************************************************************
; FIN DE RUTINA: mas_m_t
;************************************************************
;************************************************************
;RUTINA:mas_h_a
;Funcion:Programa las horas de la alarma
;Entrada:nada
;Salida:
;Variables utilizadas:nada
;************************************************************
mas_h_a
;Tratamos unidades de hora de alarma
INCF u_h_a,F
MOVF u_h_a,W ;Pueden ser las 24 horas de alarma?
SUBLW 0x04 ;4-(u_h_a) -->W
BTFSS STATUS,Z ;Si Z=1 => (u_h_a) =4
GOTO uh_a_no_4h
GOTO uh_a_si_4h
uh_a_no_4h MOVF u_h_a,W ;No son las 24 horas
SUBLW 0x0A ;10-(u_h_a) -->W
BTFSS STATUS,Z ;Si Z=>1 (u_h_a) = 10
GOTO salh_a
MOVLW 0x00
MOVWF u_h_a ;0 --> u_h_a
;Tratamos decenas de hora de alarma
INCF d_h_a,F
GOTO salh_a
uh_a_si_4h MOVF d_h_a,W ;Son las 24 horas de alarma?
SUBLW 0x02 ;2- (d_h_a) --> W
BTFSS STATUS,Z ;Si Z=1 => (d_h_a) =2
GOTO salh_a
MOVLW 0x00 ;Son las 24 horas de alarma-->00 horas alarma.
MOVWF u_h_a ;0 --> u_h_a
MOVWF d_h_a ;0 --> d_h_a
salh_a CALL delay_r ;Eliminamos rebotes del PULSADOR.
RETURN
;************************************************************
; FIN DE RUTINA:mas_h_a
;************************************************************
;************************************************************
; RUTINA: mas_m_a
; Funcion: Programa minutos de hora de alarma
; Entrada: nada
; Salida: nada
; Varialbes utilizadas: nada
;************************************************************
mas_m_a
; Tratamos unidades de minuto de alarma
INCF u_m_a,F
MOVF u_m_a,W
SUBLW 0x0A ;10 -(u_m_a) -->W
BTFSS STATUS,Z ;Si Z=1 => (u_m_a)=10
GOTO salm_a
MOVLW 0x00
MOVWF u_m_a ;0 --> u_m_a
; Tratamos decenas de minutos de alarma
INCF d_m_a,F
MOVF d_m_a,W
SUBLW 0x06 ;6 -(d_m_a) --> W
BTFSS STATUS,Z ;Si Z=1 => (d_m_a) =6
GOTO salm_a
MOVLW 0x00
MOVWF d_m_a ;0--> d_m_a
salm_a CALL delay_r ;Eliminamos rebotes del PULSADOR.
;************************************************************
; FIN DE RUTINA:mas_m_a
;************************************************************
;************************************************************
; RUTINA:zumba
; Funcion: Produce un sonido cuando alarma coincide con tiempo
; Entrada: nada
; Salida: nada
; Variables utilizadas: con1, con2
;************************************************************
zumba BSF PORTA,4 ; Activamos el zumbador
CALL delay
CALL delay
BCF PORTA,4
RETURN
;************************************************************
; FIN DE RUTINA:Zumba
;************************************************************
;************************************************************
; 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 CLRF con1
MOVLW 0x0F
MOVWF con2
loop_r DECFSZ con1,F
GOTO loop_r
DECFSZ con2,F
GOTO loop_r
RETURN
;************************************************************
; FIN DE RUTINA: delay_r
;************************************************************
;################## FIN DE RUTINAS ##########################
;################## FIN DE PROGRAMA ########################
END ; Fin de programa.
|
|