;############################################################# ; Fichero : relojd.asm ; Autor : Juan M.B. ; Fecha: Abril 2001. ; Version:0.0 ; Placa de programacion: Programador Universal Superpro II/P. ( XELTEK ) ; 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 sin BCD to 7 segment. ;############################################################# ;#################### CABEZERAS ############################## LIST p=PIC16F84A ; Directiva para definir micro. #include ; 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 EQU 0x11 ; Unidades de segundo. d_s EQU 0x12 ; Decenas de segundo. u_m EQU 0x13 ; Unidades de minuto. d_m EQU 0x14 ; Decenas de minuto. u_h EQU 0x15 ; Unidades de hora. d_h EQU 0x16 ; Decenas de hora. ;################ 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. INCF u_s,F MOVF u_s,W SUBLW 0x0A ; 10 - (u_s) --> W BTFSS STATUS,Z ; Si Z=1 => (u_s) = 10 GOTO salir MOVLW 0x00 MOVWF u_s ; 0 --> u_s ; Tratamos decenas de segundos. INCF d_s,F MOVF d_s,W SUBLW 0x06 ; 6 - (d_s) --> W BTFSS STATUS,Z ; Si Z=1 => (d_s) = 6 GOTO salir MOVLW 0x00 MOVWF d_s ; 0 --> d_s ; Tratamos unidades de minutos. INCF u_m,F MOVF u_m,W SUBLW 0x0A ; 10 - (u_m) --> W BTFSS STATUS,Z ; Si Z=1 => (u_m) = 10 GOTO salir MOVLW 0x00 MOVWF u_m ; 0 --> u_m ; Tratamos decenas de minutos. INCF d_m,F MOVF d_m,W SUBLW 0x06 ; 6 - (d_m) --> W BTFSS STATUS,Z ; Si Z=1 => (d_m) = 6 GOTO salir MOVLW 0x00 MOVWF d_m ; 0 --> d_m ; Tratamos unidades de horas. INCF u_h,F MOVF u_h,W ; Pueden ser las 24 horas ? SUBLW 0x04 ; 4 - (u_h) --> W BTFSS STATUS,Z ; Si Z=1 => (u_h) = 4 GOTO uh_no_4 GOTO uh_si_4 uh_no_4 MOVF u_h,W ; No son las 24 horas SUBLW 0x0A ; 10 - (u_h) --> W BTFSS STATUS,Z ; Si Z=1 => (u_h) = 10 GOTO salir MOVLW 0x00 MOVWF u_h ; 0 --> u_h ; Tratamos decenas de horas. INCF d_h,F GOTO salir uh_si_4 MOVF d_h,W ; Son las 24 horas ? SUBLW 0x02 ; 2 - (d_h) --> W BTFSS STATUS,Z ; Si Z=1 => (d_h) = 2 GOTO salir MOVLW 0x00 ; Son las 24 horas --> 00 horas. MOVWF u_h ; 0 --> u_h MOVWF d_h ; 0 --> d_h 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'10000000' MOVWF TRISB ; Configuramos I/O PORTB MOVLW B'11110000' MOVWF TRISA ; Configuramos I/O PORTA BCF STATUS,RP0 ; Banco 0 CLRF PORTB MOVLW 0x3D ; Variable para temporizar. MOVWF con0 ; con0 x divisor x TMR0 = 1 segundo. CLRF TMR0 ; TMR0 = 0 CLRF u_s ; u_s = 0 CLRF d_s ; d_s = 0 CLRF u_m ; u_m = 0 CLRF d_m ; d_m = 0 CLRF u_h ; u_h = 0 CLRF d_h ; d_h = 0 MOVLW B'10100000' ; Habilitamos Interrupciones TOIE. MOVWF INTCON bucle BTFSS PORTB,7 CALL mas_h ; Se ha pulsado H+ BTFSS PORTA,4 CALL mas_m ; Se ha pulsado M+ CALL display GOTO bucle ;############### FIN DE PROGRAMA PRINCIPAL ################## ;###################### RUTINAS ############################# ;************************************************************ ; RUTINA: display ; Funcion: Muestra informacion en displays 7 segmentos. ; Entrada: u_m, d_m, u_h, d_h ; Salida: nada. ; Variables utilizadas: nada. ;************************************************************ display MOVF u_m,W ; Visualizo unidades de minutos. CALL tabla_7seg MOVWF PORTB BSF PORTA,0 CALL delay BCF PORTA,0 MOVF d_m,W ; Visualizo decenas de minutos. CALL tabla_7seg MOVWF PORTB BSF PORTA,1 CALL delay BCF PORTA,1 MOVF u_h,W ; Visualizo unidades de horas. CALL tabla_7seg MOVWF PORTB BSF PORTA,2 CALL delay BCF PORTA,2 MOVF d_h,W ; Visualizo decenas de horas. CALL tabla_7seg MOVWF PORTB BSF PORTA,3 CALL delay BCF PORTA,3 RETURN ;************************************************************ ; FIN DE RUTINA: display ;************************************************************ ;************************************************************ ; RUTINA: mas_h ; Funcion: Modifica HORAS al pulsar H+. ; Entrada: nada ; Salida: nada ; Variables utilizadas: nada ;************************************************************ mas_h ; Tratamos unidades de horas. INCF u_h,F MOVF u_h,W ; Pueden ser las 24 horas ? SUBLW 0x04 ; 4 - (u_h) --> W BTFSS STATUS,Z ; Si Z=1 => (u_h) = 4 Salta GOTO uh_no_4h GOTO uh_si_4h uh_no_4h MOVF u_h,W ; No son las 24 horas SUBLW 0x0A ; 10 - (u_h) --> W BTFSS STATUS,Z ; Si Z=1 => (u_h) = 10 Salta GOTO salh MOVLW 0x00 MOVWF u_h ; 0 --> u_h ; Tratamos decenas de horas. INCF d_h,F GOTO salh uh_si_4h MOVF d_h,W ; Son las 24 horas ? SUBLW 0x02 ; 2 - (d_h) --> W BTFSS STATUS,Z ; Si Z=1 => (d_h) = 2 Salta GOTO salh MOVLW 0x00 ; Son las 24 horas --> 00 horas. MOVWF u_h ; 0 --> u_h MOVWF d_h ; 0 --> d_h salh CALL delay_r ; Eliminamos rebotes del PULSADOR. RETURN ;************************************************************ ; FIN DE RUTINA: mas_h ;************************************************************ ;************************************************************ ; RUTINA: mas_m ; Funcion: Modifica MINUTOS al pulsar M+. ; Entrada: nada ; Salida: nada ; Variables utilizadas: nada ;************************************************************ mas_m ; Tratamos unidades de minutos. INCF u_m,F MOVF u_m,W SUBLW 0x0A ; 10 - (u_m) --> W BTFSS STATUS,Z ; Si Z=1 => (u_m) = 10 GOTO salm MOVLW 0x00 MOVWF u_m ; 0 --> u_m ; Tratamos decenas de minutos. INCF d_m,F MOVF d_m,W SUBLW 0x06 ; 6 - (d_m) --> W BTFSS STATUS,Z ; Si Z=1 => (d_m) = 6 GOTO salm MOVLW 0x00 MOVWF d_m ; 0 --> d_m salm CALL delay_r ; Eliminamos rebotes del PULSADOR. RETURN ;************************************************************ ; FIN DE RUTINA: mas_m ;************************************************************ ;************************************************************ ; RUTINA: delay ; Funcion: Produce un retardo para los 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 ;************************************************************ ;************************************************************ ; RUTINA: tabla_7seg ; Funcion: Tabla para excitar displays de 7 segmentos C.C. ; Entrada: valor en W. ; Salida: LEDs a activar --> W. ; Variables utilizadas: nada ;************************************************************ tabla_7seg ADDWF PCL,F RETLW B'00111111' ; 0 --> LEDs -gfedcba RETLW B'00000110' ; 1 --> LEDs -gfedcba RETLW B'01011011' ; 2 --> LEDs -gfedcba RETLW B'01001111' ; 3 --> LEDs -gfedcba RETLW B'01100110' ; 4 --> LEDs -gfedcba RETLW B'01101101' ; 5 --> LEDs -gfedcba RETLW B'01111101' ; 6 --> LEDs -gfedcba RETLW B'00000111' ; 7 --> LEDs -gfedcba RETLW B'01111111' ; 8 --> LEDs -gfedcba RETLW B'01100111' ; 9 --> LEDs -gfedcba ;************************************************************ ; FIN DE RUTINA: tabla_7seg ;************************************************************ ;################## FIN DE RUTINAS ########################## ;################## FIN DE PROGRAMA ######################## END ; Fin de programa.