Está en la página 1de 9

LIST P=16F84A INCLUDE <P16F84A.

INC> __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC CBLOCK 0Ch ; Definimos un bloque de constantes segu ; Registros de las unidades de los segundos segd ; Registros de las decenas de los segundos minu ; Registros de las unidades de los minutos mind ; Registros de las decenas de los minutos horu ; Registros de las unidades de las horas hord ; Registros de las decenas de las horas tmr ; Registro de las veces que se ha desbordado el TMR0 modo ; Registro del tipo de modo diasu ; Registros de las unidades de los das diasd ; Registros de las decenas de los das mesesu ; Registros de las unidades de los meses mesesd ; Registros de las decenas de los meses aosu ; Registros de las unidades de los aos aosd ; Registros de las decenas de los aos diasauxu ; Registros auxiliar de las unidades de los das diasauxd ; Registros auxiliar de las decenas de los das GuardaW ; Registros para guardar el valor de W ENDC org 0 goto inicio org 4 btfsc INTCON,RBIF ; Verificamos si la interrupcin fue por interruptores goto interrbi ; si lo fue nos vamos a la subrutina de interruptores goto intertmr ; sino nos vamos a la subrutina de TMR0 ;*:*:*:*:*:*:*CONFIGURACIN PUERTOS E INTERRUPCIONES*:*:*:*:*:*:*:* inicio bsf STATUS,RP0 ; Pasamos al banco 1 movlw b'11110000' ; Configuramos el nibble mas alto como entrada movwf TRISB ; y el ms bajo como salida del puerto B movlw b'00000000' movwf TRISA ; Configuramos el puerto A como salida movlw b'00000111' movwf OPTION_REG ; Asignamos el prescaler de 256 al TMR0 bcf STATUS,RP0 ; Pasamos al banco 0 movlw .61 ; Cargamos el TMR0 con el valor correspo ndiente para un movwf TMR0 ; retardo de 50 ms movlw b'10101000' ; Configuro interrupcin por RB7:RB4, por TMR0 y general movwf INTCON clrf PORTB ; Inicializamos Los puertos en 0 clrf PORTA clrf modo bsf modo,0 ; Iniciamos en modo hora call borrarregh ; Inicializamos los registros de las horas en 0 call borrarregd ; Inicializamos los registros de los das en 0 ;*:*:*:*:*:*:*:*PROGRAMA PRINCIPAL*:*:*:*:*:*:*:*:* Principal btfsc modo,0 ; Verificamos en qu modo se encuentra goto mostrarh ; Si esta en hora mostramos la hora goto mostrard ; Si esta en calendario mostramos la fecha ;*:*:*:*:*:*:*:*:*INTERRUPCIONES*:*:*:*:*:*:*:* ;*:*:*:*:*:*:*:RBI:*:*:*:*:*:*:* interrbi movwf GuardaW ; Guardamos el contenido de W btfsc PORTB,4 ; verificamos si se ha presionado el inter

ruptor cambiar modo call cambmodo ; Cambiamos a modo calendario o viceversa btfsc modo,0 ; Verificamos en qu modo se encuentra goto incmenhoras ; Si esta en hora incrementamos las hor as goto incmendias ; Si esta en calendario incrementamos la fecha incmenhoras btfsc PORTB,7 ; Incrementar SEGUNDOS call incseg1 btfsc PORTB,6 ; Incrementar MINUTOS call incmin1b btfsc PORTB,5 ; Incrementar HORAS call inchor1b call verhoru ; Verificamos la Hora bcf INTCON,RBIF ; Borramos bit indicador de interrupcin p or RB7:RB0 call Retardo_100ms ; Este retardo es para evitar rebotes call Retardo_50ms movf GuardaW,W ; Cargamos a W con su valor previamente g uardado retfie incmendias btfsc PORTB,5 ; Incrementar DAS call incdias1 btfsc PORTB,6 ; Incrementar MESES call incmeses1b btfsc PORTB,7 ; Incrementar AOS call incaos1b call verdiasmes ; Verificamos los Das dependiendo del Mes call vermesesu ; Verificamos Los Meses bcf INTCON,RBIF ; Borramos bit indicador de interrupcin p or RB7:RB0 call Retardo_100ms ; Este retardo es para evitar rebotes call Retardo_50ms movf GuardaW,W ; Cargamos a W con su valor previamente g uardado retfie ;*:*:*:*:*:*:*CAMBIO DE MODO*:*:*:*:*:* cambmodo btfsc modo,0 ; Si esta en modo hora cambio a calendario goto modocalen btfss modo,0 ; Si esta en calendario cambio a hora goto modohora return modohora bsf modo,0 ; Activo modo hora return modocalen bcf modo,0 ; Activo modo calendario return ;*:*:*:*:*:*:*:TMR0:*:*:*:*:*:*:* intertmr movwf GuardaW ; Guardamos el contenido de W movlw .61 ; Cargamos el TMR0 con el valor correspondient e para un movwf TMR0 ; retardo de 50 ms inctmr incf tmr,F

movf tmr,W sublw .20 ; Le restamos el valor correspondiente a la ca ntidad de veces btfsc STATUS,Z ; que tiene que desbordarse para cumplir un tiempo de 1s call incdeseg ; si se cumple incrementamos los segundos bcf INTCON,T0IF ; Borramos el bit indicador de interrupc in por TMR0 movf GuardaW,W ; Cargamos a W con su valor previamente g uardado retfie incdeseg clrf tmr ; Borramos el registro tmr call incseg1 ; Incrementamos un segundo call verhoru ; verificamos la hora return ;*:*:*:*:*:*:*:*BORRADO DE REGISTROS*:*:*:*:*:*:*:* borrarregh1 call incdias1 ; Se incrementan los segundos call verdiasmes ; Se verifica los das dependiendo del mes call vermesesu ; Se verifican los meses borrarregh clrf segu ; Borramos todos los registros pertenecientes a las horas clrf segd clrf minu clrf mind clrf horu clrf hord return borrarregd clrf diasu ; Borramos todos los registros pertenecientes al calendario bsf diasu,0 ; y los inicializamos clrf diasd clrf mesesu bsf mesesu,0 clrf mesesd clrf aosu clrf aosd return ;*:*:*:*:*:*:*:*INCREMENTAR REGISTROS*:*:*:*:*:*:*:* ;*:*:*:*:*:*:*:*HORAS*:*:*:*:*:*:*:* incseg1 incf segu,F ; Incrementamos las unidades de los segundos movf segu,W sublw .10 ; Si las unidades de los segundos se han btfsc STATUS,Z ; incrementado en 10 goto incseg10 ; incrementamos las decenas de los segundo s return incseg10 clrf segu ; Borramos las unidades de los segundos incf segd,F ; Incrementamos las decenas de los segundos movf segd,W sublw .6 ; Si las decenas de los segundos se han btfsc STATUS,Z ; incrementado en 6 goto incmin ; incrementamos los minutos return

incmin uptor

btfss INTCON,RBIF ; Verifica si el incremento fue por un interr goto incmin1 ; Sino fue, incremento los minutos clrf segd ; Borramos las decenas de los segundos return

incmin1 clrf segd ; Borramos las decenas de los segundos incmin1b incf minu,F ; Incrementamos las unidades de los minutos movf minu,W sublw .10 ; Si las unidades de los minutos se han btfsc STATUS,Z ; incrementado en 10 goto incmin10 ; incrementamos las decenas de los minutos return incmin10 clrf minu ; Borramos las unidades de los minutos incf mind,F ; Incrementamos las decenas de los minutos movf mind,W sublw .6 ; Si las decenas de los minutos se han btfsc STATUS,Z ; incrementado en 6 goto inchor ; incrementamos las horas return btfss INTCON,RBIF ; Verifica si el incremento fue por un interr goto inchor1 ; Sino fue, incremento las horas clrf mind ; Borramos las decenas de los minutos return clrf mind ; Borramos las decenas de los minutos incf horu,F ; Incrementamos las unidades de las horas movf horu,W sublw .10 ; Si las unidades de las horas se han btfsc STATUS,Z ; incrementado en 10 goto inchor10 ; incrementamos las decenas de las horas return inchor10 clrf horu ; Borramos las decenas de las incf hord,F ; Incrementamos las decenas movf hord,W sublw .10 ; Si las decenas de las horas btfsc STATUS,Z ; incrementado en 10 clrf hord ; Borramos las decenas de las return ;*:*:*:*:*:*:*:*DIAS*:*:*:*:*:*:*:* incdias1 incf diasu,F ; movf diasu,W sublw .10 ; Si btfsc STATUS,Z goto incdias10 return incdias10 clrf diasu ; Borramos las unidades de los das incf diasd,F ; Incrementamos las decenas de los das return incmeses1 clrf diasd ; Borramos las decenas de los das clrf diasu ; Borramos e inicializamos las unidades horas de los minutos se han horas

inchor uptor

inchor1 inchor1b

Incrementamos las unidades de los das las unidades de los das se han ; incrementado en 10 ; incrementamos las decenas de los das

bsf diasu,0 ; de los das incmeses1b incf mesesu,F ; Incrementamos las unidades de los meses movf mesesu,W sublw .10 ; Si las unidades de los meses se han btfsc STATUS,Z ; incrementado en 10 goto incmeses10 ; incrementamos las decenas de los meses return incmeses10 clrf mesesu ; Borramos las unidades de los meses incf mesesd,F ; Incrementamos las decenas de los meses return incaos1 clrf mesesd ; Borramos las decenas de los meses clrf mesesu ; Borramos e inicializamos las unidades bsf mesesu,0 ; de los meses incaos1b incf aosu,F ; movf aosu,W sublw .10 ; Si btfsc STATUS,Z goto incaos10 return incaos10 clrf aosu ; Borramos las unidades de los aos incf aosd,F ; Incrementamos las decenas de los aos movf aosd,W sublw .10 ; Si las decenas de los aos se han btfsc STATUS,Z ; incrementado en 10 clrf aosd ; Borramos las decenas de los aos return ;*:*:*:*:*:*:*VERIFICAR REGISTROS*:*:*:*:*:* ;*:*:*:*:*:*:*:*:*:*HORA*:*:*:*:*:*:*:*:*:* verhoru movf horu,W sublw .4 ; Verificamos si las unidades de las horas btfsc STATUS,Z ; han llegado a 4, si han llegado goto verhord ; verificamos las decenas de las horas return verhord movf hord,W sublw .2 ; Verificamos si las decenas de las horas btfsc STATUS,Z ; han llegado a 2, si han llegado goto verhor ; verificamos si fue por interruptor return verhor btfss INTCON,RBIF ; Verifica si el incremento fue por un interr uptor goto borrarregh1 ; Sino fue, reinicio la hora e incremen to 1 da clrf hord ; si fue, reinicio el reloj solamente clrf horu return ;*:*:*:*:*:*:*:*:*:*:*:*MESES*:*:*:*:*:*:*:*:*.*:* vermesesu movf mesesu,W sublw .3 ; Verificamos si las unidades de los meses btfsc STATUS,Z ; han llegado a 4, si han llegado goto vermesesd ; verificamos las decenas de los meses return Incrementamos las unidades de los aos las unidades de los aos se han ; incrementado en 10 ; Incrementamos las decenas de los aos

vermesesd movf mesesd,W sublw .1 ; Verificamos si las decenas de las horas btfsc STATUS,Z ; han llegado a 1, si han llegado goto vermeses ; verificamos si el incremento fue por int erruptor return vermeses btfss INTCON,RBIF ; Verifico si el incrementos fue por u n interruptor goto incaos1 ; Sino fue, incrementos los aos clrf mesesd ; si fue, borramos e inicializamos los meses clrf mesesu bsf mesesu,0 return ;*:*:*:*:*:*:*:*:*:*:*:*:*:*:*DIAS*:*:*:*:*:*:*:*:*:*:*:*:* verdiasmes movf mesesu,W btfsc mesesd,0 ; Verificamos si los meses han llegado a 10 addlw .10 ; si han llegado, le sumo 10 a las unidades call tabladias ; Llamamos tabla de los das dependiendo de l mes call descnumero ; Descomponemos el numero en unidades y decenas verdiasu movf diasu,W subwf diasauxu,F ; Verificamos si las unidades de los das son iguales btfsc STATUS,Z ; si lo son goto verdiasd ; pasamos a verificar las decenas de los da s return verdiasd movf diasd,W subwf diasauxd,F ; Verificamos si las decenas de los das son iguales btfsc STATUS,Z ; si lo son goto verdias ; Verificamos si el incremento fue por inte rruptor return verdias btfss INTCON,RBIF ; Verifico si el incremento fue por interrupt or goto incmeses1 ; Sino fue, incremento los meses clrf diasd ; si fue, borramos e inicializamos los das clrf diasu bsf diasu,0 return tabladias addwf PCL,F retlw .0 retlw .32 retlw .29 retlw .32 retlw .31 retlw .32 retlw .31 retlw .32 retlw .32 retlw .31

retlw .32 retlw .31 retlw .32 descnumero clrf diasauxd movwf diasauxu unidad movlw .10 subwf diasauxu,F btfsc STATUS,C goto decena addwf diasauxu,F return decena incf diasauxd,F goto unidad ;*:*:*:*:*:*:*:*:*MOSTRAR REGISTROS*:*:*:*:*:*:*:* ;*:*:*:*:*:*:*:*:*:*:*:*:*HORAS*:*:*:*:*:*:*:*.*:*:*:* mostrarh movlw b'00000101' movwf PORTA ; Habilitamos el primer 7-Segmentos movf segu,W movwf PORTB ; Mostramos las unidades de los segundos call Retardo_1ms ; Esperamos un tiempo clrf PORTB movlw b'00001001' movwf PORTA ; Habilitamos el segundo 7-Segmentos movf segd,W movwf PORTB ; Mostramos las decenas de los segundos call Retardo_1ms ; Esperamos un tiempo clrf PORTB movlw b'00001101' movwf PORTA ; Habilitamos el tercer 7-Segmentos movf minu,W movwf PORTB ; Mostramos las unidades de los minutos call Retardo_1ms ; Esperamos un tiempo clrf PORTB movlw b'00010001' movwf PORTA ; Habilitamos el cuarto 7-Segmentos movf mind,W movwf PORTB ; Mostramos las decenas de los minutos call Retardo_1ms ; Esperamos un tiempo clrf PORTB movlw b'00010101' movwf PORTA ; Habilitamos el quinto 7-Segmentos movf horu,W movwf PORTB ; Mostramos las unidades de las horas call Retardo_1ms ; Esperamos un tiempo clrf PORTB movlw b'00011001' movwf PORTA ; Habilitamos el sexto 7-Segmentos movf hord,W movwf PORTB ; Mostramos las unidades de las horas call Retardo_1ms ; Esperamos un tiempo clrf PORTA clrf PORTB goto Principal ;*:*:*:*:*:*:*:*:*:*:*:*:*DIAS*:*:*:*:*:*:*:*:*:*:*: mostrard movlw b'00000100' movwf PORTA ; Habilitamos el primer 7-Segmentos

movf aosu,W movwf PORTB ; Mostramos las unidades de los das call Retardo_1ms ; Esperamos un tiempo clrf PORTB movlw b'00001000' movwf PORTA ; Habilitamos el segundo 7-Segmentos movf aosd,W movwf PORTB ; Mostramos las decenas de los das call Retardo_1ms ; Esperamos un tiempo clrf PORTB movlw b'00001100' movwf PORTA ; Habilitamos el tercer 7-Segmentos movf mesesu,W movwf PORTB ; Mostramos las unidades de los meses call Retardo_1ms ; Esperamos un tiempo clrf PORTB movlw b'00010000' ; Habilitamos el cuarto 7-Segmentos movwf PORTA movf mesesd,W movwf PORTB ; Mostramos las decenas de los meses call Retardo_1ms ; Esperamos un tiempo clrf PORTB movlw b'00010100' movwf PORTA ; Habilitamos el quinto 7-Segmentos movf diasu,W movwf PORTB ; Mostramos las unidades de las horas call Retardo_1ms ; Esperamos un tiempo clrf PORTB movlw b'00011000' movwf PORTA ; Habilitamos el sexto 7-Segmentos movf diasd,W movwf PORTB ; Mostramos las decenas de las horas call Retardo_1ms ; Esperamos un tiempo clrf PORTA clrf PORTB goto Principal ;*:*:*:*:*:*:*RETARDOS*:*:*:*:*:*:*:* CBLOCK R_ContA ; Contadores para los retardos. R_ContB R_ContC ENDC Retardo_100ms movlw d'100' ; Esta subrutina de retardo fue tomada del libro goto Retardos_ms ; Microcontrolador PIC16F84 Desarrollo de Retardo_50ms ; Proyectos de Enrique Palacios. movlw d'50' goto Retardos_ms Retardo_1ms movlw d'1' Retardos_ms movwf R_ContB R1ms_BucleExterno movlw d'249' movwf R_ContA R1ms_BucleInterno nop decfsz R_ContA,F

goto R1ms_BucleInterno decfsz R_ContB,F goto R1ms_BucleExterno return END