Está en la página 1de 15

Repblica Bolivariana De Venezuela

Ministerios Del Poder Popular Para La Defensa


Universidad Nacional Experimental
Politcnica De La Fuerza Armada
UNEFA Caracas
Asignatura: Microprocesadores
Seccin: 6ITTC-D01

PARCIAL #2

Tutor:
Jos Muoz.

Alumno:
Jesus Urbina CI: 19581133

Caracas, mayo de 2015

Introduccin

El presente proyecto tiene como finalidad realizar un reloj digital con una pantalla lcd en el
cual la metodologa empleada es tipo basada en un contador con interrupciones debido a que
el microcontrolador pic 18f4550 hace un solo proceso a la vez ya que es mono tarea utilizando
un men para su configuracin en la cual se utiliza el puerto a del microcontrolador y el puerto
D para la configurar la pantalla lcd 16x2 obteniendo como resultado un reloj digital con un
formato de hora am pm en formato de 12 horas.

Reloj digital
Se denomina al que indica la hora mediante nmeros digitales, por oposicin al reloj
analgico que lo hace mediante manecillas. El funcionamiento de los relojes digitales en
electrnico normalmente, si bien existen emuladores informticos que pueden presentar en la
pantalla de una computadora tanto relojes analgicos como digitales.
Materiales a utilizar
Microcontrolador 18f4550
Pantalla lcd 16x2
4 pulsadores
Resistencias de 330 ohm
Poteciometro de 10k ohm
Cristal de cuarzo de 4mhz
2 condensadores de 22pF
Cable utp
Protoboard
Fuente de 5v
Conceptos bsicos
PIC
Son una familia de micro controladores tipo RISC fabricados por Microchip Technology
Inc. y derivados del PIC1650, originalmente desarrollado por la divisin
de microelectrnica de General Instrument.
El PIC original se dise para ser usado con la nueva CPU de 16 bits CP16000. Siendo
en general una buena CPU, sta tena malas prestaciones de entrada y salida, y el PIC de 8 bits
se desarroll en 1975 para mejorar el rendimiento del sistema quitando peso de E/S a la CPU.
El PIC utilizaba micro cdigo simple almacenado en ROM para realizar estas tareas; y aunque el
trmino no se usaba por aquel entonces, se trata de un diseo RISC que ejecuta
una instruccin cada 4 ciclos del oscilador.

Caractersticas
Los PIC actuales vienen con una amplia gama de mejoras hardware incorporados:

Ncleos de CPU de 8/16 bits con Arquitectura Harvard modificada


Memoria Flash y ROM disponible desde 256 bytes a 256 kilobytes
Puertos de E/S (tpicamente 0 a 5.5 voltios)
Temporizadores de 8/16/32 bits
Tecnologa Nanowatt para modos de control de energa
Perifricos serie sncronos y asncronos: USART, AUSART, EUSART
Conversores analgico/digital de 8-10-12 bits

Comparadores de tensin
Mdulos de captura y comparacin PWM
Controladores LCD
Perifrico MSSP para comunicaciones IC, SPI, y IS
Memoria EEPROM interna con duracin de hasta un milln de ciclos de lectura/escritura
Perifricos de control de motores
Soporte de interfaz USB
Soporte de controlador Ethernet
Soporte de controlador CAN
Soporte de controlador LIN
Soporte de controlador Irda

Timer 1
El Timer1 es un temporizador/contador ascendente parecido al TMR0, pero con
algunas peculiaridades que lo hacen muy interesante a la hora de incluir temporizaciones en
nuestros programas.
La primera de ellas, es que se trata de un contador de 16 bits cuyo valor se almacena
en dos registros de 8 bits el TMR1H y el TMR1L, ambos registros se pueden leer y escribir su
valor durante la ejecucin del programa.
Cuando el Timer1 est habilitado, el valor de esos registros se incrementan desde
0000h a FFFFh y una vez que llega a su mximo valor empieza otra vez desde 0 avisndonos de
ello por medio de la bandera TMR1F.
Si est activa la interrupcin por desbordamiento del Timer 1 al desbordarse el contador, el
programa entra en la funcin de tratamiento a la interrupcin por desbordamiento del
Timer1.

Procedimiento:
Colocamos nuestra biblioteca para poder utilizar el pic, los fuses para saber con cual oscilador
utilizamos que fue de 4MHZ, el perro guardin, clock entre otros. Definimos las conexiones del
pic con la pantalla, incluimos la biblioteca de la LCD con sus respectivas variables las cuales son
seg=0, seg1=0, min2=0, min1=0, hora=1; luego dije que la variable cond=1; esta nos sirve para
contar 2 veces 0,5ms y as se pueda cumplir 1seg que es lo que se desea, la variable
configuracin=0 esta nos dice que cuando est en 0 el reloj se pone en modo configuracin y si
est en 1 el reloj trabaja o da la hora normal (no se detiene), la variable posicin=1 es para
controlar la posicin de 1-6 dependiendo de dnde este (h:m.m1:seg.seg1 pm), si=1 significa
que disminuye donde este el cursor y si es sw=0 no hace nada. La variable horario=0; es la que
controla el am y el pm, cuando es horario=0 es am y cundo es horario=1 es pm.
El timer 1. Es el contador, donde si la configuracin es igual a ==0 que es el inicio
(donde debe estar siempre) entonces cumple la funcin de sumar un 1 segundo si no vuelve a
cero. Como se cumple la funcin entonces el timer1 (contador) va a cumplir el segundo exacto.
En el void main, primero habilitamos las interrupciones habilitamos la interrupcin del timer 1,
habilitamos la interrupcin global.

Iniciamos pantalla: configuramos el timer 1 como va a funcionar con lo siguiente


setup_timer_1(T1_INTERNAL),para finalizar establecemos el valor set_timer1(3036) que
significa que va empezar en el valor 3036.
El while (true): va a preguntar si estamos presionando configuracin if(input(pin_b0)==0)
entonces va tener un tiempo de 80 ms entonces el botn configuracin va agregar o sumar
uno entonces su configuracin es mayor a uno despus de sumarle 1van a ser dos pero como
no existe dos vuelve a cero (al inicio)para vuelva contar solo uno.[ configuracin=0].luego
preguntamos si est en modo de configuracin [if(configuracion==1], al pulsarlo va a pasar a 1
entones se va a detener y pasamos a modificar con los otros tres pulsadores entonces
preguntamos si se presiona el botn izquierda [if(input(pin_b1)==0)] y en la posicin 6,o si no
el botn derecho if(input(pin_b2)==0) en la posicin 1; ahora si presionamos el botn de
cambio [if(input(pin_b3)==0)] tambin dura 80 ms va a funcionar solo cuando se presiona que
pasara a 1 .
Para utilizar el cursor y cambiar las posiciones utilizamos el switch (posicin) en el case
1 se imprime en la pantalla printf(lcd_putc,"_
conf"); de manera que si pulsamos el botn
de cambio la hora cambie de forma decreciente la cual se va a ver en la posicin (4,1).para el
caso 2 imprime en pantalla printf(lcd_putc,"_
conf"); de manera que se pare en la posicin
de min y decremento de uno en uno en la posicin (6,1) en el saco 3 es lo mismo que el caso
dos pero en el min2 y har la misma funcin que el min y estar en la posicin (7,1) y
decremento de uno en uno en el caso 4 es parecido al caso tres y dos pero en diferente
posicin (9,1) y en seg1 disminuye de uno a uno igualmente en el seg. Dependiendo de cul
caso sea, escoger uno de ellos y pasa a break y luego pasa a la ltima llave y vuelve al principio
de switch (posicin).
Declaramos las preguntas de control de los minutos, segundos, minutos y hora

Conclusin

El reloj digital, fue una experiencia muy gratificante ya que pude aprender ms sobre la
programacin del lenguaje c, pudimos aplicar una nueva condicin llamada timer 1 el cual
hace que nuestra programacin se nos facilite a la hora de hacer un reloj digital, pudimos
programar un reloj digital en una pantalla lcd por medio de un pic 18f4550 ,tambin agregue
unos pulsadores en el cual tiene pulsadores que nos hacen pasar de una hora a otra si se
desea; investigue sobre una condicin en la cual hizo que mejorara mi programacin como lo
es switch Y gracias a la maqueta que constru pude darle vida a un reloj que podra ser
fcilmente utilizado por nosotros como adorno en un espacio deseado .

Cdigo
#include <18F4550.h>
#device ADC=8
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=4M)
#include <LCD4x16.c>
#include <string.h>
#byte port_A=0XF80
#byte port_B=0XF81
#byte port_C=0XF82
#byte port_D=0XF83
#define LCD_ENABLE_PIN PIN_D0
#define LCD_RS_PIN PIN_D1
#define LCD_RW_PIN PIN_D2
#define LCD_DATA4 PIN_D4
#define LCD_DATA5 PIN_D5
#define LCD_DATA6 PIN_D6
#define LCD_DATA7 PIN_D7
int8 seg=0,seg1=0, min2=0, min1=0,hora=1;
int8 cond=1;
int8 configuracion=0;
int8 posicion=1;
int8 sw=0;
int8 horario=0;

#INT_TIMER1

void contador(void)
{
If (configuracion==0)
{
If (cond==2)
{

seg+=1;
cond=0;
}
set_timer1(3036);
cond+=1;
}
}
void main ()
{
enable_interrupts(INT_TIMER1);
enable_interrupts(global);
lcd_init();
setup_timer_1(T1_INTERNAL | T1_DIV_BY_2);
set_timer1(3036);
while(true)
{
if(input(pin_a0)==0)
{
delay_ms(80);
configuracion+=1;
if(configuracion>1)
{
configuracion=0;
}
while(input(pin_a0)==0)
{
}
}
If (configuracion==1)
{
if(input(pin_a1)==0)
{
delay_ms(80);

posicion-=1;
if(posicion==0)
{
posicion=6;
}
while(input(pin_a1)==0)
{
}
}
if(input(pin_a2)==0)
{
delay_ms(80);
posicion+=1;
if(posicion>6)
{
posicion=1;
}
while(input(pin_a2)==0)
{
}
}
if(input(pin_a3)==0)
{
delay_ms(80);
sw=1;
while(input(pin_a3)==0)
{
}
}
switch(posicion)
{
case 1:
printf(lcd_putc,"\f");

lcd_gotoxy(4,1);
printf(lcd_putc,"_

MENU");

if(sw==1)
{
hora-=1;
sw=0;
}
break;
case 2:
printf(lcd_putc,"\f");
lcd_gotoxy(6,1);
printf(lcd_putc,"_

MENU");

if(sw==1)
{
min1-=1;
sw=0;
}
break;
case 3:
printf(lcd_putc,"\f");
lcd_gotoxy(7,1);
printf(lcd_putc,"_

MENU");

if(sw==1)
{
min2-=1;
sw=0;
}
break;
case 4:
printf(lcd_putc,"\f");
lcd_gotoxy(9,1);
printf(lcd_putc,"_ MENU");
if(sw==1)

{
seg1-=1;
sw=0;
}
break;
case 5:
printf(lcd_putc,"\f");
lcd_gotoxy(10,1);
printf(lcd_putc,"_ MENU");
if(sw==1)
{
seg-=1;
sw=0;
}
break;
case 6:
printf(lcd_putc,"\f");
lcd_gotoxy(12,1);
printf(lcd_putc,"_MENU");
if(sw==1)
{
horario+=1;
if(horario>1)
{
horario=0;
}
sw=0;
}
break;
default:
break;
}
if(seg>9)

{
seg=9;
}
if(seg1>5)
{
seg1=5;
}
if(min2>9)
{
min2=9;
}
if(min1>5)
{
min1=5;
}
if(hora==0)
{
hora=12;
}
if(horario==0)
{
if(hora<10)
{
lcd_gotoxy(4,2);
printf(lcd_putc,"%d:%d%d:%d%d am",hora,min1,min2,seg1,seg);
delay_ms(100);
}
else
{
lcd_gotoxy(3,2);
printf(lcd_putc,"%d:%d%d:%d%d am",hora,min1,min2,seg1,seg);
delay_ms(100);
}

}
else
{
if(hora<10)
{
lcd_gotoxy(4,2);
printf(lcd_putc,"%d:%d%d:%d%d pm",hora,min1,min2,seg1,seg);
delay_ms(100);
}
else
{
lcd_gotoxy(3,2);
printf(lcd_putc,"%d:%d%d:%d%d pm",hora,min1,min2,seg1,seg);
delay_ms(100);
}
}
}
else
{
printf(lcd_putc,"\f");
lcd_gotoxy(1,1);
printf(lcd_putc," .Parcial No 2. ");
if(horario==0)
{
if(hora<10)
{
lcd_gotoxy(4,2);
printf(lcd_putc,"%d:%d%d:%d%d am",hora,min1,min2,seg1,seg);
delay_ms(100);
}
else
{
lcd_gotoxy(3,2);

printf(lcd_putc,"%d:%d%d:%d%d am",hora,min1,min2,seg1,seg);
delay_ms(100);
}
}
else
{
if(hora<10)
{
lcd_gotoxy(4,2);
printf(lcd_putc,"%d:%d%d:%d%d pm",hora,min1,min2,seg1,seg);
delay_ms(100);
}
else
{
lcd_gotoxy(3,2);
printf(lcd_putc,"%d:%d%d:%d%d pm",hora,min1,min2,seg1,seg);
delay_ms(100);
}
}
if(seg>9)
{
seg=0;
seg1+=1;
}
if(seg1>5)
{
seg1=0;
min2+=1;
}
if(min2>9)
{
min2=0;
min1+=1;

}
if(min1>5)
{
min1=0;
hora+=1;
if(hora==12)
{
horario+=1;
if(horario>1)
{
horario=0;
}
}
}
if(hora>12)
{
hora=1;
}
}
}
}

También podría gustarte