Sunteți pe pagina 1din 24

UNIVERSIDAD AUTÓNOMA DEL CARIBE

IMPLEMENTACIÓN DE UN RELOJ DIGITAL CON FUNCIÓN


CALENDARIO MEDIANTE DE EL USO DE UN
MICROCONTROLADOR

IMPLEMENTATION OF A DIGITAL CLOCK WITH CALENDAR


FUNCTION THROUGH THE USE OF A MICROCONTROLLER

Danilo Rojas M.1, José Salas R2.

1 Estudiante de Ingeniería Mecatrónica, Universidad Autónoma Del Caribe, Grupo De Investigación De


Ingeniería Mecatrónica GIIM. Email: darm940@hotmail.com
2 Estudiante de Ingeniera Mecatrónica, Universidad Autónoma Del Caribe. Email: jo-an17@hotmail.com

RESUMEN

Un microcontrolador es un circuito integrado programable que contiene todos los componentes necesarios
para controlar el funcionamiento de una tarea determinada, y que permite la utilización de la menor
cantidad de elementos externos a parte del mismo, lo que reduce notablemente el tamaño y número de
componentes permitiendo disminuir el número de averías, el volumen y el peso al momento de crear un
dispositivo electrónico o mecatrónico. El Reloj fue desarrollado utilizando un Microcontrolador
PIC16F84A el cual fue programado en lenguaje Assembler, también se utilizo un Decodificador de BCD a
7 Segmentos (7448), un demultiplexor (74138), 6 displays 7 Segmentos de Cátodo Común, un led y 4
pulsadores. Los Displays fueron controlados mediante la técnica de multiplexacion dinámica y las
diferentes variables como los segundos, minutos, horas y cambio de modo entre Hora y Calendario se
controlan mediante interrupciones externas e internas, todo esto permitió que la visualización de los
números y el control de las variables produjeran excelentes resultados y un producto final compuesto por
dos placas superpuestas.

Palabras Claves: Microcontrolador, Assembler, Display 7 segmentos, Reloj, Calendario.

ABSTRAC

A microcontroller is a programmable integrated circuit that contains all the components necessary to
control the operation of a particular task, and allows the use of fewer external components of the same,
which greatly reduces the size and number of components allowing reduce the number of failures, the
volume and weight when creating an electronic or mechatronics device. The clock was developed using
a PIC16F84A microcontroller which was programmed in Assembler, also use a Decoder BCD to
7 Segment (7448), a demultiplexer (74 138), 6 7-Segment Displays Common Cathode, a LED and
4 buttons. The displays were controlled by the dynamic multiplexing technique and the different
variables as the seconds, minutes, hours, and mode change between Time and Calendar are controlled
by external and internal interrupts, this allowed the display of numbers and control
variables produce excellent results and a final product consists of two overlapping plates.

Keywords: Microcontroller, Assembler, 7-segment Display, Clock, Calendar.

1
UNIVERSIDAD AUTÓNOMA DEL CARIBE

1. Introducción

A la lo largo de este documento verán el camino decidido tomar para la elaboración de un Reloj Digital
Con Función De Calendario utilizando un microcontrolador, impartido en el sexto semestre de ingeniería
Mecatrónica por el docente Msc. Mauricio Barrios Barrios en el periodo 2011-02.

El Reloj Digital contara con pulsadores que permiten modificar las diferentes variables como la hora,
minutos, segundos, días, meses, años y modo, las variables a modificar dependerán del modo en el que el
Reloj se encuentre, si esta en modo hora permitirá modificar las variables referentes a esta y si esta en
modo calendario las de este. El incremento de los segundos por parte del reloj se controla mediante
interrupciones por desbordamiento del Timer 0 para lo cual se realizaron una serie de cálculos para
obtener el valor con el que se debe cargar y la cantidad de veces que se debe desbordar para que pase un
segundo.

2. Elementos

 1 Microcontrolador PIC16F84A.
 1 Decodificador de BCD a 7-Segmentos 7448.
 1 Demultiplexor 74138.
 6 Transistores 2N3906.
 6 Displays de 7-Segmentos.
 6 Pulsadores.
 Un regulador de Voltaje de 5V 7805.
 7 Resistencias de 2.2k a ½ Watt.
 1 Capacitor de 100uf a 16V.
 2 Capacitores de 22pf.
 1 Cristal de Cuarzo de 4MHz.
 1 Led Rojo.

2.1 Microcontrolador PIC16F84A

Un microcontrolador es un circuito integrado programable que contiene todos los componentes necesarios
para controlar el funcionamiento de una tarea determinada, como el control de una lavadora, un teclado de
ordenar, una impresora, un sistema de alarma, etc. Un sistema de microcontrolador debe disponer de una
memoria donde se almacena el programa que gobierna el funcionamiento del mismo que, una vez
programado y configurado, solo sirve para realizar la tarea asignada. La utilización de un
microcontrolador en un circuito reduce notablemente el tamaño y número de componentes y, en
consecuencia, disminuye el número de averías y el volumen y el peso de los equipos, entre otras ventajas.
[1]

El microcontrolador PIC16F84A esta encapsulado en un DIL de 18 pines, trabaja a una frecuencia


máxima de 10 MHz, normalmente se alimenta con un voltaje de 5V aplicados entre los pines VDD y VSS
que son respectivamente la alimentación y masa del micro. Posee dos puertos de entra-salida, el Puerto A
con 5 líneas y el Puerto B con 8 líneas, los cuales pueden entregar niveles TTL. [1]

2
UNIVERSIDAD AUTÓNOMA DEL CARIBE

Figura 1. Encapsulado y símbolo del PIC16F84A.


Figure 1. Encapsulation and symbol of PIC16F84A.

2.2 Diodo Emisor de Luz LED

Un led es un tipo especial de Diodo semiconductor, el cual emite luz cuando se polariza directamente.
Estos emiten luz en la gama de los ultravioleta, luz visible e infrarrojos. El Led a utilizar es un Led Rojo.
[2]

Figura 2. Estructura LED.


Figure 2. LED structure.

2.3 Transistor

Los transistores son dispositivos de tres terminales que se utilizan para controlar corrientes relativamente
grandes a partir de señales de corriente o de voltajes muy débiles, actuando como resistencias o
interruptores controlables electrónicamente. Los transistores pueden ser básicamente de dos tipos:
Bipolares, y unipolares. Los transistores bipolares se denominan también transistores de unión o BJT y
son dispositivos controlados por corriente. Los transistores unipolares, por su parte se denominan
transistores de efecto de campo o FET. Y son dispositivos controlados por voltaje. El transistor a utilizar
es el PNP 2N3906. [3]

3
UNIVERSIDAD AUTÓNOMA DEL CARIBE

Figura 3. Estructura Transistor 2N3906.


Figure 3. 2N3906 Transistor structure.

2.4 Decodificador BCD-7Segmentos

Los decodificadores de segmentos requieren cuatro entradas en código decimal binario (BCD) y siete
salidas, una para cada segmento del display. Los decodificadores más comunes son los circuitos
integrados 7447 y 7448. Siendo el 7447 de lógica negativa y se trabaja con el display de ánodo común y el
7448 de lógica positiva y se trabaja con el display de cátodo común. El decodificador a utilizar es el 7448.
[4]

Figura 4. Estructura integrado decodificador BCD-7 segmentos 7448.


Figure 4. Integrated structure BCD-7 7448 segment de oder.

2.5 Display De Led 7-Segmentos

Un tipo muy común de display de 7 segmentos es el de diodo emisores de luz. Cada segmento es un LED
que emite luz cundo lo atraviesa una corriente eléctrica. La configuración de Ánodo Común requiere de un
circuito de excitación, que proporcione un nivel de excitación bajo para activar un determinado segmento.
Cuando se aplica un nivel bajo a la entrada de un segmento, el LED se enciende y circula corriente a
través de él. La configuración en cátodo común requiere de un circuito de excitación que proporcione un
nivel de tensión alto para activar un cierto segmento. Cuando se aplica un nivel alto a la entrada del
segmento, el LED se enciende y circula corriente a través de él. El 7-Segmentos a utilizar es de Cátodo
Común. [5]

4
UNIVERSIDAD AUTÓNOMA DEL CARIBE

Figura 5. Estructura Display de 7-Segementos.


Figure 5. Structure 7-segement display.

2.6 Demultiplexor

Un demultiplixor es un circuito integrado que permite tomar datos de una line a de entrada y distribuirlos
a un determinado número de salidas, por este motivo también se conoce como distribuidor de datos. Los
demultiplexores realizan la operación inversa a un multiplexor. El demultiplexor a utilizar es el 74138 que
es un demultiplexor de 3 líneas a 8 líneas. [6]

Figura 6. Estructura Demultiplexor 74138.


Figure 6. Demultiplexer Structure 74138.

3. Código del Programa

El código del programa se desarrollo en lenguaje Assembler y se presentara al final del informe como un
anexo (Ver anexo 1).

4. Diagrama, PCB y Fotos del Circuito

Los diagramas, PCB y fotos del circuito se presentaran al final del informe como un anexo (Ver Anexo 2).

5
UNIVERSIDAD AUTÓNOMA DEL CARIBE

5. Técnicas De Programación Utilizadas

5.1 Multiplexacion Dinámica

Debido a la baja cantidad de pines que posee el PIC16F84A fue necesario utilizar la técnica de
Multiplexacion Dinámica para controlar seis 7-Segmentos a la vez. En el circuito las señales que salen del
Decodificador 7448 están conectadas a todas las entradas de los 6 7-Segmentos y los pines comunes de
estos están conectados al Demultiplexor 74138. La técnica consiste en habilitar el primer 7-Segmentos
mediante el 74138 y enviar el dato a mostrar por este a través del 7448 manteniendo habilitado este primer
7-Segmentos durante un corto lapso de tiempo (durante ese tiempo los demás 7 segmentos están
deshabilitados por tanto el numero no se va a mostrar por estos), luego lo deshabilito, habilito el segundo
7-Segmentos y envio el dato a mostrar por este manteniendo este segundo 7-Segmentos habilitado durante
el mismo tiempo que el primero, el procedimiento se repite con cada uno de los demás. Esto quiere decir
que los 7 segmentos van a estar apagándose y prendiendo constantemente solo que este cambio es tan
rápido que el ojo humano no lo alcanza a percibir.

5.2 Interrupciones

Una interrupción es un mecanismo por el cual un evento interno o externo puede interrumpir la ejecución
de un programa en cualquier momento. El funcionamiento de estas es similar al de las interrupciones, de
las cuales se diferencian, principalmente, en los procedimientos que las ponen en marcha. Las
interrupciones se ejecutan al aparecer en cualquier instante de tiempo un evento externo al programa. [7]

En PIC16F84A existen cuatro tipos de interrupciones:

 Interrupción INT. Por activación del pin RB0/INT.


 Interrupción RBI. Por cambio en los estados en una o varias de las 4 líneas de más peso RB7:RB4
del puerto B.
 Interrupción TOI. Por Desbordamiento del Timer0.
 Interrupción EEI. Por la finalización de la escritura en el EEPROM de datos.

Las interrupciones utilizadas fueron en el desarrollo del programa fueron:

 Interrupción por RBI: Para modificar las variables Modo (Pin RB4), Hora/Dias (Pin RB5),
Minutos/Meses (Pin RB6) y Segundos/Años (Pin RB7).
 Interrupción por TOI: Para que se vayan incrementando los segundos de manera automática.

6. Resultados

6.1 Tiempo de Retardo Multiplexacion Dinámica

Como sabemos para realizar la multiplexacion cada 7-Segmentos debe durar un tiempo habilitado, para lo
cual utilizamos un retardo. Las pruebas se hicieron con tiempos de 10ms, 5ms, 2ms, 1ms y 500us.
Obteniéndose una buena multiplexacion con los valores de 1ms y 500us. Pudiéndose utilizar cualquiera
de las dos.

6
UNIVERSIDAD AUTÓNOMA DEL CARIBE

6.2 Carga Del Valor y Cantidad de Desbordamientos del TMR0

Al utilizar el TMR0 como temporizador toca cargarle una constante para determinar un intervalo de
tiempo en concreto. Como se está utilizando un Cristal de Cuarzo de 4MHz el TMR0 se incremente cada
1us con lo que se desbordaría a los 256us debido a que es un registro de 1byte,pero se le puede asignar un
Prescaler (divisor de frecuencia) para obtener tiempos mayores. Como el tiempo máximo que se puede
obtener con el TMR0 utilizando el máximo prescaler es de 65.536 ms, se decidió trabajar con 50ms. Para
conocer el valor que se debe cargar al TMR0 se utilizo la siguiente fórmula: [8]

· · 256 0 (1)
Donde Temporización es el tiempo que se desea obtener, Tcm es el periodo de un ciclo maquina y
CargaTMR0 es el valor a cargar. [8]

50000 1 · 256 · 256 0 (2)


50000 65536 256 0 (3)
0 65536 50000 (4)

0 60536 (5)
Tomando el resultado anterior y redondeando se obtuvo del valor de 61.

Para calcular cuantas veces tiene que desbordarse el TMR0, debemos conocer cuantas veces esta
contenido 50ms en un 1s, entonces realizando una simple división:
!"

#$%!$&'"
(6)

20 (7)
Por lo tanto de lo anterior se puede inferir que para que transcurra un segundo el TMR0 ha de desbordarse
20 veces.

7. Conclusiones

Podemos concluir que:

 Los microcontroladores son elementos programables que nos permiten ahorrar espacio y
elementos al momento de realizar un proyecto teniendo muy en cuenta cuáles son sus
características físicas externas e internas y el modo de funcionamiento.

 Los microcontroladores poseen recursos como las interrupciones que nos facilitan la captura de
datos externos y realizar temporizaciones internas.

 Para obtener una excelente visualización utilizando la multiplexacion dinámica es necesario tener
habilitado cada 7-segmentos 1ms o menos.

 El valor a cargar al TMR0 para obtener una temporización de 50 ms es de 61.

 La cantidad de veces que tiene que desbordarse el TMR0 para que transcurra un segundo es de 20.

7
UNIVERSIDAD AUTÓNOMA DEL CARIBE

8. Referencias

[1] Palacios E., Remiro F., y López L. (2006) Microcontrolador PIC16F84. En: Palacios E., Remiro F., y
López L. Microcontrolador PIC16F84 Desarrollo De Proyectos 2nd Edición. México, AlfaOmega, p.1-
9.

[2] Que es el LED? [Internet] Sistema De Información Energética de Guanajuato. Disponible desde:
<http://energia.guanajuato.gob.mx/siegconcyteg/eventosieg/archivos/AI_Led.pdf> [Acceso 3 de
Diciembre 2011]

[3] Aranzabal Olea A. Transistor De Union Bipolar BJT [Internet] Universidad Nacional de Educación
a Distancia. Disponible desde: <http://www.uned.es/ca-
bergara/ppropias/Morillo/web_et_dig/02_semiconduc/transistores.pdf> [Acceso 3 de Diciembre 2011]

[4] Floyd T. (2000) Funciones De Lógica Combinacional. En: Floyd T. Fundamentos De Sistemas
Digitales 7ª Edición. España, Prentice Hall, p.358-359.

[5] Floyd T. (2000) Algebra de Boole y Simplificación Lógica. En: Floyd T. Fundamentos De Sistemas
Digitales 7ª Edición. España, Prentice Hall, p.254-257.

[6] Floyd T. (2000) Funciones De Logica Combinacional. En: Floyd T. Fundamentos De Sistemas
Digitales 7ª Edición. España, Prentice Hall, p.379-381.

[7] Palacios E., Remiro F., y López L. (2006) Interrupciones. Lectura de Entradas. En: Palacios E.,
Remiro F., y López L. Microcontrolador PIC16F84 Desarrollo De Proyectos 2nd Edición. México,
AlfaOmega, p.253-270.

[8] Palacios E., Remiro F., y López L. (2006) TMR 0. En: Palacios E., Remiro F., y López L.
Microcontrolador PIC16F84 Desarrollo De Proyectos 2nd Edición. México, AlfaOmega, p.223-234

8
UNIVERSIDAD AUTÓNOMA DEL CARIBE

ANEXOS

Anexo 1. Código Del Programa.

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 días
diasd ; Registros de las decenas de los días
mesesu ; Registros de las unidades de los meses
mesesd ; Registros de las decenas de los meses
añosu ; Registros de las unidades de los años
añosd ; Registros de las decenas de los años
diasauxu ; Registros auxiliar de las unidades de los días
diasauxd ; Registros auxiliar de las decenas de los días
GuardaW ; Registros para guardar el valor de W
ENDC

org 0
goto inicio
org 4
btfsc INTCON,RBIF ; Verificamos si la interrupción 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

;*:*:*:*:*:*:*CONFIGURACIÓN 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 más 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 correspondiente para un


movwf TMR0 ; retardo de 50 ms

movlw b'10101000' ; Configuro interrupción por RB7:RB4, por TMR0 y general

9
UNIVERSIDAD AUTÓNOMA DEL CARIBE

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 días 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 interruptor 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 horas
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 interrupción por RB7:RB0
call Retardo_100ms ; Este retardo es para evitar rebotes
call Retardo_50ms
movf GuardaW,W ; Cargamos a W con su valor previamente guardado
retfie

incmendias
btfsc PORTB,5 ; Incrementar DÍAS
call incdias1
btfsc PORTB,6 ; Incrementar MESES
call incmeses1b
btfsc PORTB,7 ; Incrementar AÑOS

10
UNIVERSIDAD AUTÓNOMA DEL CARIBE

call incaños1b
call verdiasmes ; Verificamos los Días dependiendo del Mes
call vermesesu ; Verificamos Los Meses
bcf INTCON,RBIF ; Borramos bit indicador de interrupción por RB7:RB0
call Retardo_100ms ; Este retardo es para evitar rebotes
call Retardo_50ms
movf GuardaW,W ; Cargamos a W con su valor previamente guardado
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 correspondiente para un
movwf TMR0 ; retardo de 50 ms

inctmr incf tmr,F


movf tmr,W
sublw .20 ; Le restamos el valor correspondiente a la cantidad 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 interrupción por TMR0
movf GuardaW,W ; Cargamos a W con su valor previamente guardado
retfie

incdeseg
clrf tmr ; Borramos el registro tmr
call incseg1 ; Incrementamos un segundo
call verhoru ; verificamos la hora
return

;*:*:*:*:*:*:*:*BORRADO DE REGISTROS*:*:*:*:*:*:*:*

11
UNIVERSIDAD AUTÓNOMA DEL CARIBE

borrarregh1
call incdias1 ; Se incrementan los segundos
call verdiasmes ; Se verifica los días 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 añosu
clrf añosd
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 segundos
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 btfss INTCON,RBIF ; Verifica si el incremento fue por un interruptor


goto incmin1 ; Sino fue, incremento los minutos
clrf segd ; Borramos las decenas de los segundos
return

incmin1

12
UNIVERSIDAD AUTÓNOMA DEL CARIBE

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

inchor btfss INTCON,RBIF ; Verifica si el incremento fue por un interruptor


goto inchor1 ; Sino fue, incremento las horas
clrf mind ; Borramos las decenas de los minutos
return

inchor1 clrf mind ; Borramos las decenas de los minutos


inchor1b
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 horas
incf hord,F ; Incrementamos las decenas de los minutos
movf hord,W
sublw .10 ; Si las decenas de las horas se han
btfsc STATUS,Z ; incrementado en 10
clrf hord ; Borramos las decenas de las horas
return

;*:*:*:*:*:*:*:*DIAS*:*:*:*:*:*:*:*

incdias1
incf diasu,F ; Incrementamos las unidades de los días
movf diasu,W
sublw .10 ; Si las unidades de los días se han
btfsc STATUS,Z ; incrementado en 10
goto incdias10 ; incrementamos las decenas de los días
return

13
UNIVERSIDAD AUTÓNOMA DEL CARIBE

incdias10
clrf diasu ; Borramos las unidades de los días
incf diasd,F ; Incrementamos las decenas de los días
return

incmeses1
clrf diasd ; Borramos las decenas de los días
clrf diasu ; Borramos e inicializamos las unidades
bsf diasu,0 ; de los días
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

incaños1
clrf mesesd ; Borramos las decenas de los meses
clrf mesesu ; Borramos e inicializamos las unidades
bsf mesesu,0 ; de los meses
incaños1b
incf añosu,F ; Incrementamos las unidades de los años
movf añosu,W
sublw .10 ; Si las unidades de los años se han
btfsc STATUS,Z ; incrementado en 10
goto incaños10 ; Incrementamos las decenas de los años
return

incaños10
clrf añosu ; Borramos las unidades de los años
incf añosd,F ; Incrementamos las decenas de los años
movf añosd,W
sublw .10 ; Si las decenas de los años se han
btfsc STATUS,Z ; incrementado en 10
clrf añosd ; Borramos las decenas de los años
return

;*:*:*:*:*:*:*VERIFICAR REGISTROS*:*:*:*:*:*

;*:*:*:*:*:*:*:*:*:*HORA*:*:*:*:*:*:*:*:*:*

verhoru
movf horu,W

14
UNIVERSIDAD AUTÓNOMA DEL CARIBE

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 interruptor


goto borrarregh1 ; Sino fue, reinicio la hora e incremento 1 día
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

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 interruptor
return

vermeses
btfss INTCON,RBIF ; Verifico si el incrementos fue por un interruptor
goto incaños1 ; Sino fue, incrementos los años
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 días dependiendo del mes
call descnumero ; Descomponemos el numero en unidades y decenas

15
UNIVERSIDAD AUTÓNOMA DEL CARIBE

verdiasu
movf diasu,W
subwf diasauxu,F ; Verificamos si las unidades de los días son iguales
btfsc STATUS,Z ; si lo son
goto verdiasd ; pasamos a verificar las decenas de los días
return

verdiasd
movf diasd,W
subwf diasauxd,F ; Verificamos si las decenas de los días son iguales
btfsc STATUS,Z ; si lo son
goto verdias ; Verificamos si el incremento fue por interruptor
return

verdias btfss INTCON,RBIF ; Verifico si el incremento fue por interruptor


goto incmeses1 ; Sino fue, incremento los meses
clrf diasd ; si fue, borramos e inicializamos los días
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

16
UNIVERSIDAD AUTÓNOMA DEL CARIBE

;*:*:*:*:*:*:*:*:*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

17
UNIVERSIDAD AUTÓNOMA DEL CARIBE

;*:*:*:*:*:*:*:*:*:*:*:*:*DIAS*:*:*:*:*:*:*:*:*:*:*:

mostrard
movlw b'00000100'
movwf PORTA ; Habilitamos el primer 7-Segmentos
movf añosu,W
movwf PORTB ; Mostramos las unidades de los días
call Retardo_1ms ; Esperamos un tiempo
clrf PORTB

movlw b'00001000'
movwf PORTA ; Habilitamos el segundo 7-Segmentos
movf añosd,W
movwf PORTB ; Mostramos las decenas de los días
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

18
UNIVERSIDAD AUTÓNOMA DEL CARIBE

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

19
UNIVERSIDAD AUTÓNOMA DEL CARIBE

Anexo 2. Diagramas, PCB y Fotos del circuito.

El diagrama del circuito es:


Figura 7. Diagrama del Reloj.
Figure 7. Diagram of the Clock.

20
UNIVERSIDAD AUTÓNOMA DEL CARIBE

Figura 8. PCB Vista Real de la Cara Inferior.


Figure 8. PCB Real view of the lower face.

Figura 9. PCB Vista Real de la Cara Superior.


Figure 9. PCB Real view of the top face.

21
UNIVERSIDAD AUTÓNOMA DEL CARIBE

Figura 10. Impreso De la Cara Inferior.


Figure 10. Printed of the lower face.

Figura 11. Diagrama del Reloj.


Figure 11. Printed of the top face.

22
UNIVERSIDAD AUTÓNOMA DEL CARIBE

Figura 12. Foto Del circuito de la cara superior.


Figure 12. Photo of the top face circuit.

Figura 13. Foto Del circuito de la cara del lado.


Figure 13. Photo of the beside face circuit.

23
UNIVERSIDAD AUTÓNOMA DEL CARIBE

Figura 14. Foto Del circuito de la cara inferior.


Figure 14. Photo of the lower face circuit

24

S-ar putea să vă placă și