;RELOJ CON UN PIC 16F84 ;POR VICENTE MARTINEZ ;RA4 ENTRADA INPULSOS DE RELOJ. ;RB1-7 SALIDA DE SEGMENTOS ;RA0-3 SALIDA SELECCION DEL DIGITO ;RB0 ENTRADA PUESTA EN HORA ; ________________ ; decenas minuto -| RA2 RA1 |- unidades hora ; unidades minuto -| RA3 RA0 |- decenas hora ; input ----------+-----| RA4/TOCKI |- Clkin ___a___ ; 10K -| |- | | ; Masa--/\/\/\-+ -| |- VDD 3..5 Volt f| |b ; Puesta en hora +-----| RB0 Rb7 |- "g" segment | g | ; "a" segment -| RB1 RB6 |- "f" segment |-----| ; "b" segment -| RB2 RB5 |- "e" segment e| |c ; "c" segment -| RB3 RB4 |- "d" segment | d | ; ---------------- ------- STATUS equ 0x03 ;Registro de estado TRISA equ 0x05 ;Registro de direci¢n de la puerta A PORTA equ 0x05 ;Puerta A TRISB equ 0x06 ;Registro de direcci¢n de la puerta B PORTB equ 0x06 ;Puerta B INTCON equ 0x0B ;Registro control de interrupciones pc equ 0x02 w equ 0 f equ 1 MINUTO1 equ 0x18 ;unidades de minuto MINUTO2 equ 0x19 ;decenas de minuto HORA1 equ 0x1A ;unidades de hora HORA2 equ 0x1B ;decenas de hora cifra equ 0x1D ;dato que se pasa a la tabla de segmentos conta1 equ 0x1E conta2 equ 0x1F pseg equ 0x23 segu equ 0x24 cam_s equ 0x20 LIST p=16F84 org 0 goto princi org 10h princi clrf INTCON movlw 10h bsf STATUS,5 ;seleccionamos Banco 1 movwf TRISA ;puerto A como SALIDAS excepto RA4 movlw 01h ;rb0 entrada y demas salidas movwf TRISB ;puerto B bcf STATUS,5 clrf PORTA clrf PORTB clrf MINUTO2 clrf HORA2 clrf HORA1 clrf MINUTO1 clrf segu prin0 call pres btfsc PORTB,0 ;si el bit es "1" directamente aumenta los segundos goto cam_h btfss PORTA,4 ;si el bit 4 es uno salta goto prin0 prin2 call pres btfsc PORTA,4 ;si el bit ahora es cero salta goto prin2 i_seg incf segu,f movf segu,w sublw 3ch ;60 en hexadecimal btfss STATUS,2 ;si el resultado es cero salta goto prin0 i_min clrf segu incf MINUTO1,f ;incremetamos los minutos movf MINUTO1,w andlw 0fh sublw 0Ah ;restamos 10 btfss STATUS,2 ;salta si 10 goto prin0 ;si la unidad de minuto es inferior a 9 final clrf MINUTO1 ;si es superior se pone a cero incf MINUTO2,f ; y se incrementa la decena de minuto movf MINUTO2,w andlw 0fh sublw 06h btfss STATUS,2 goto prin0 clrf MINUTO2 i_hora movf HORA2,w andlw 0Fh sublw 02h ;es 2 la decena de hora btfss STATUS,2 goto i_fin incf HORA1,f movf HORA1,w andlw 0Fh sublw 04h ;si la decena de hora es 2 la unidad cuenta hasta 3 btfss STATUS,2 goto prin0 i_ho clrf HORA1 incf HORA2,f movf HORA2,w andlw 0Fh sublw 03h btfss STATUS,2 goto prin0 clrf HORA2 clrf HORA1 clrf MINUTO1 clrf MINUTO2 goto prin0 i_fin incf HORA1,f movf HORA1,w andlw 0Fh sublw 0Ah ;si la decena no es 2 la unidad solo cuenta hasta 9 btfss STATUS,2 goto prin0 goto i_ho goto prin0 cam_h incf cam_s,f movf cam_s,w sublw 20h btfss STATUS,2 ;si el resultado es cero salta goto cam_h goto i_min pres movf MINUTO1,w movwf cifra call segmenti movwf PORTB bsf PORTA,3 call ritardo bcf PORTA,3 movf MINUTO2,w movwf cifra call segmenti movwf PORTB bsf PORTA,2 call ritardo bcf PORTA,2 movf HORA1,w movwf cifra call segmenti movwf PORTB bsf PORTA,1 call ritardo bcf PORTA,1 movf HORA2,w movwf cifra call segmenti movwf PORTB bsf PORTA,0 call ritardo bcf PORTA,0 return segmenti nop movf cifra,w addwf pc,f ;return into W the right set of segments retlw 7Eh ;0 retlw 0Ch ;1 retlw 0B6h ;2 retlw 9Eh ;3 retlw 0CCh ;4 retlw 0DAh ;5 retlw 0FAh ;6 retlw 0Eh ;7 retlw 0FEh ;8 retlw 0CEh ;9 return ritardo movlw 0x01 ; | movwf conta2 ; | rita2 movlw 0x25 movwf conta1 rita1 decfsz conta1,f goto rita1 decfsz conta2,f goto rita2 return end