hola a todos, bueno como abran dado cuenta en mis reiteradas preguntas que ago en el foro, se podrán percatar que esto de tener este hobbys de los pic da para mucho, y es por ello que yo creo que todo los días ago algo distinto, antes de acostarme como terapia de relajación, bueno y es por esto que me pareció algo cómico, y yo creo que a mas de alguien le va a venir bien para ayudar en esos momentos de pelea con la señora o pareja. bueno se trata de un reloj que cada día de la semana te entrega un mensaje por pantalla LCD de 2x20 bastante enamoradizo.
bueno esto lo vengo asiendo desde el domingo, para poder presentarlo ahora, ya que mi señora me estaba pidiendo uno, y que mejor que pedirle ayuda a nuestro amigo pic, el que nonos abandona nunca a la hora de dar sorpresas. bueno les describo este reloj enamoradizo.
el reloj cuenta con 7 teclas las cuales 2 son para el cambio de minutos, otras 2 para el cambio de hora, una para la luz de la LCD 2x20, otra como RESET y la ultima para definir el tipo de formato si de 12 o 24 horas.
esto lo trabaje con un pic 16f876A, el cual en la primera línea de la lcd entrega la hora y el día de la semana, en la segunda línea entrega mensajes amorosos de una persona muy pero muy enamorada el cual va corriendo por esta línea de forma infinita asta que pasa al otro día y cambie de mensaje.
además cuenta con la función de poder ponerle una alarma a la hora que deseemos, pero esto con la limitante que solo se puede hacer con el formato de 24 horas. el cual para acceder a esta, se tiene que presionar los botones de incremento, tanto de minutos como el de la hora, estos empedando con el de los minutos y seguidos de forma inmediata el de la hora, dando como resultado de esta acción la configuración de la hora de activación de la alarma, el cual una vez dentro de la función se tiene que activar la alarma con el botón de decremento de la hora (-), luego configuramos esta misma con los 2 botones de minutos y el de solo incremento de la hora (+), una vez puesta la hora presionamos el botón de luz el cual sale de esta función, para seguir viendo la hora y los mensajes.
bueno espero que les guste, y aquí les dejo todo, el proteus (simulación) y el HEX, ademas del código en CCS C.
bueno saludos.
#include <16f876a.h> //pic a utilizar
#fuses HS,NOWDT,NOPROTECT,PUT,NOLVP //ordenes para el programador
#use delay (clock=4000000) //clock=4Mhz
#define use_portb_lcd TRUE //definir portb lcd
#include<lcd.c> //libreria manejo lcd
//FUNCIONES DE MENSAJES CADA DIA
void dia_lunes(void);
void dia_martes(void);
void dia_miercoles(void);
void dia_jueves(void);
void dia_viernes(void);
void dia_sabado(void);
void dia_domingo(void);
void activar_alarma(void);
//VARIABLES GLOVALES
char tabNum[10]={'0','1','2','3','4','5','6','7','8','9'},i=0,j=0,h=0,g=0,z=0,w=0; //tabla y variable definida
char flag=0,var=20, SEMA[7]={'L','M','M','J','V','S','D'},m; //variables globales
char SEMAA[8]={'U','A','I','U','I','A','O'},n;
char SEMAAA[7]={'N','R','E','E','E','B','M'},r;
int x=20, y=20, b=20, c=0 , p=20;
int dias=0,incre=0,min=0,min1=0,hora=0,hora1=0,a=0,e=0; //indice filas
///LLAMADA FUNCION INTERRUPCION
#INT_TIMER0
void interrupcion()
{
if(flag>var){ //¿ya es 1 segundo?
var--; //SI -> decremento var...
if(var<18)
var=20; //...ajuste fino de 1s
flag=0; //reset flag para contar 1s
if(i>8){ //¿se ha mostrado digito 9?
i=0; //SI -> restaura valor indice(para mostrar digito 0)
j++;
if(j>5){j=0;
h++;}
if(h>9){h=0;
g++;}
if(g>5){g=0;
z++;}
if(z>9){z=0;
w++;}
if(w>2){w=0;}}
else{ //(*) NO -> incrementa i
i++;}
}
set_timer0(61); //reset TMR0
flag++; //incremento variable flag
}
void main(void)
{
lcd_init(); //inicializa lcd
enable_interrupts(INT_TIMER0); //interrupcion TIMER0 activada
setup_counters(RTCC_INTERNAL,RTCC_DIV_256); //configuracion interrupcion TMR0
set_timer0(61); //carga TMR0
enable_interrupts(GLOBAL); //activadas interrupciones
while(TRUE){
lcd_gotoxy(1,1);
printf(lcd_putc,"Hora=%c%c:%c%c:%c%c %c%c%c ",tabNum[w],tabNum[z],tabNum[g],tabNum[h],tabNum[j],tabNum[i],SEMA[m],SEMAA[n],SEMAAA[r]);
printf(lcd_putc,"\b\b\b\b\b\b\b\b"); //retrasa el cursor una posicion(escribe encima)
/////////LLAMA A FUNCION ALARMA///////////////
if(hora1==w && hora==z && min1==g && min==h && a==1){//comprueva hora alarma
if(e==0){
output_high(PIN_C0);// pin que activa la alarma
}else {output_low(PIN_C0);}// desactiva alarma
}else{
e=0;
output_low(PIN_C0);}// desactiva alarma
if(!input(PIN_A0)){//para este caso se tiene que presionar boton A0 y A1 para
if(!input(PIN_A2)){// acceder a configurar alarma
activar_alarma();// llama a la funcion alarma
}}
///////////TERMINO FUNCION ALARMA//////////////
if(!input(PIN_A5)){//ensiende luz de la pantalla
output_high(PIN_C1);
e++;//desactiva alarma cuando se activa
}else{
output_low(PIN_C1);}//apaga luz pantalla
/////////CORRECCION DE MINUTOS/////////
if(!input(PIN_A0)){ //¿se ha pulsado el boton?
do{ //SI -> eliminar...
}while(!input(PIN_A0)); //...rebotes del boton
h++;
if(h>9){h=0;
g++;}
if(g>5){g=0;}
}
if(!input(PIN_A1)){ //¿se ha pulsado el boton?
do{ //SI -> eliminar...
}while(!input(PIN_A1)); //...rebotes del boton
if(g==0){
g=5;
if(h==0){
h=9;
}
h--;
}
else{
g--;
}}
/////////TERMINO DE CORRECCION DE MINUTOS/////////
/////////CORRECCION DE HORAS/////////
if(!input(PIN_A2)){ //¿se ha pulsado el boton?
do{ //SI -> eliminar...
}while(!input(PIN_A2)); //...rebotes del boton
z++;
if(z>9){z=0;
w++;}
if(w>2){w=0;}
}
if(!input(PIN_A3)){ //¿se ha pulsado el boton?
do{ //SI -> eliminar...
}while(!input(PIN_A3)); //...rebotes del boton
z--;
if(z<=0){z=9;}
}
/////////TERMINO DE CORRECCION DE HORA/////////
/////////MODO DE 24 O 12 HORAS/////////
if(input(PIN_A4)){
if(z>3 && w==2){
z=0;
w=0;
dias++;
}
}else{
if(z>1 && w==1 ){
z=0;
w=0;
incre++;
if(incre==2){
incre=0;
dias++;}
}
}
if(dias==7){dias=0;}
/////////TERMINO DE MODO DE 24 O 12 HORAS/////////
////////////PASODE MENSAJES POR DIA///////////
switch( dias )
{
case 0:
dia_lunes();
break;
case 1:
dia_martes();
break;
case 2:
dia_miercoles();
break;
case 3:
dia_jueves();
break;
case 4:
dia_viernes();
break;
case 5:
dia_sabado();
break;
case 6:
dia_domingo();
break;
}
}}
void dia_lunes(void){
m=0;n=0;r=0;
if(c<=40){
x--;
lcd_gotoxy(x,2); //cursor para escribir mensaje
printf(lcd_putc,"TE AMO BEBE HERMOZA ");
}else{x=20;}
if(c>=20 && c<=60){
y--;
lcd_gotoxy(y,2) ; //cursor para escribir mensaje
printf(lcd_putc,"CON TODO MI CORAZON ");
}else{y=20;}
if(c>=40 && c<=80){
b--;
lcd_gotoxy(b,2) ; //cursor para escribir mensaje
printf(lcd_putc,"ERES LO MEJOR DE MI ");
}else{b=20;}
if(c>=60 && c<=100){
p--;
lcd_gotoxy(p,2) ; //cursor para escribir mensaje
printf(lcd_putc,"VIDA. TE AMO MUCHOO ");
}else{p=20;}
if(c==100){
c=0;
}else{
c++;
delay_ms(185);
}}
void dia_martes(void){
m=1;n=1;r=1;
if(c<=40){
x--;
lcd_gotoxy(x,2) ; //cursor para escribir mensaje
printf(lcd_putc,"AMOR TE AMO, TE AME ");
}else{x=20;}
if(c>=20 && c<=60){
y--;
lcd_gotoxy(y,2) ; //cursor para escribir mensaje
printf(lcd_putc,"Y TE AMARE TODA MI ");
}else{y=20;}
if(c>=40 && c<=80){
b--;
lcd_gotoxy(b,2) ; //cursor para escribir mensaje
printf(lcd_putc,"VIDA ERES TODO PARA ");
}else{b=20;}
if(c>=60 && c<=100){
p--;
lcd_gotoxy(p,2) ; //cursor para escribir mensaje
printf(lcd_putc,"MI, AMOR MIO.. ");
}else{p=20;}
if(c==100){
c=0;
}else{
c++;
delay_ms(185);
}}
void dia_miercoles(void){
m=2;n=2;r=2;
if(c<=40){
x--;
lcd_gotoxy(x,2) ; //cursor para escribir mensaje
printf(lcd_putc,"ERES LA LUZ QUE ILUM");
}else{x=20;}
if(c>=20 && c<=60){
y--;
lcd_gotoxy(y,2) ; //cursor para escribir mensaje
printf(lcd_putc,"INA MI CAMINO EN LOS");
}else{y=20;}
if(c>=40 && c<=80){
b--;
lcd_gotoxy(b,2) ; //cursor para escribir mensaje
printf(lcd_putc," MOMENTOS DE TRISTEZ");
}else{b=20;}
if(c>=60 && c<=100){
p--;
lcd_gotoxy(p,2) ; //cursor para escribir mensaje
printf(lcd_putc,"...TE AMO DEMASIADO ");
}else{p=20;}
if(c==100){
c=0;
}else{
c++;
delay_ms(185);
}}
void dia_jueves(void){
m=3;n=3;r=3;
if(c<=40){
x--;
lcd_gotoxy(x,2) ; //cursor para escribir mensaje
printf(lcd_putc,"DESDE AHORA JURO SER");
}else{x=20;}
if(c>=20 && c<=60){
y--;
lcd_gotoxy(y,2) ; //cursor para escribir mensaje
printf(lcd_putc,"VIRTE, HACERTE FELIZ");
}else{y=20;}
if(c>=40 && c<=80){
b--;
lcd_gotoxy(b,2) ; //cursor para escribir mensaje
printf(lcd_putc,", DESDE AHORA TE AMO");
}else{b=20;}
if(c>=60 && c<=100){
p--;
lcd_gotoxy(p,2) ; //cursor para escribir mensaje
printf(lcd_putc," Y AMARTE SERA MI VIDA ");
}else{p=20;}
if(c==100){
c=0;
}else{
c++;
delay_ms(185);
}}
void dia_viernes(void){
m=4;n=4;r=4;
if(c<=40){
x--;
lcd_gotoxy(x,2) ; //cursor para escribir mensaje
printf(lcd_putc,"SI YO FUERA EL MAR, ");
}else{x=20;}
if(c>=20 && c<=60){
y--;
lcd_gotoxy(y,2) ; //cursor para escribir mensaje
printf(lcd_putc,"Y TU UNA ROCA, HARIA");
}else{y=20;}
if(c>=40 && c<=80){
b--;
lcd_gotoxy(b,2) ; //cursor para escribir mensaje
printf(lcd_putc," SUBIR LA MAREA, PAR");
}else{b=20;}
if(c>=60 && c<=100){
p--;
lcd_gotoxy(p,2) ; //cursor para escribir mensaje
printf(lcd_putc,"A BESAR TU BOCA.. ");
}else{p=20;}
if(c==100){
c=0;
}else{
c++;
delay_ms(185);
}}
void dia_sabado(void){
m=5;n=5;r=5;
if(c<=40){
x--;
lcd_gotoxy(x,2) ; //cursor para escribir mensaje
printf(lcd_putc,"TE AMO NO SOLO POR C");
}else{x=20;}
if(c>=20 && c<=60){
y--;
lcd_gotoxy(y,2) ; //cursor para escribir mensaje
printf(lcd_putc,"OMO ERES, SINO POR C");
}else{y=20;}
if(c>=40 && c<=80){
b--;
lcd_gotoxy(b,2) ; //cursor para escribir mensaje
printf(lcd_putc,"OMO SOY YO CUANDO ES");
}else{b=20;}
if(c>=60 && c<=100){
p--;
lcd_gotoxy(p,2) ; //cursor para escribir mensaje
printf(lcd_putc,"TOY CONTIGO.... ");
}else{p=20;}
if(c==100){
c=0;
}else{
c++;
delay_ms(185);
}}
void dia_domingo(void){
m=6;n=6;r=6;
if(c<=40){
x--;
lcd_gotoxy(x,2) ; //cursor para escribir mensaje
printf(lcd_putc,"PROMETO AMARTE ASTA ");
}else{x=20;}
if(c>=20 && c<=60){
y--;
lcd_gotoxy(y,2) ; //cursor para escribir mensaje
printf(lcd_putc,"QUE MI CORAZON SE DE");
}else{y=20;}
if(c>=40 && c<=80){
b--;
lcd_gotoxy(b,2) ; //cursor para escribir mensaje
printf(lcd_putc,"TENGA POR NUESTRO AM");
}else{b=20;}
if(c>=60 && c<=100){
p--;
lcd_gotoxy(p,2) ; //cursor para escribir mensaje
printf(lcd_putc,"OR ETERNO.... ");
}else{p=20;}
if(c==100){
c=0;
}else{
c++;
delay_ms(185);
}}
void activar_alarma(void){
lcd_gotoxy(1,1) ; //cursor para escribir mensaje
printf(lcd_putc,"CONFIGURACION ALAMRA");
delay_ms(2000);
while(TRUE){
if(!input(PIN_A4)){
lcd_gotoxy(1,1) ; //cursor para escribir mensaje
printf(lcd_putc,"SOLO MODO 24 HORA ");
}else{
lcd_gotoxy(1,1) ; //cursor para escribir mensaje
printf(lcd_putc,"INGRESE HORA ALARMA:");
if(a==1){
lcd_gotoxy(1,2) ; //cursor para escribir mensaje
printf(lcd_putc,"ALARMA=%i%i:%i%i OK ",hora1,hora,min1,min);
}else{
lcd_gotoxy(1,2) ; //cursor para escribir mensaje
printf(lcd_putc,"ALARMA=%i%i:%i%i OFF",hora1,hora,min1,min);
a=0;
}
if(!input(PIN_A0)){ //¿se ha pulsado el boton?
do{ //SI -> eliminar...
}while(!input(PIN_A0)); //...rebotes del boton
min++;
if(min>9){
min=0;
min1++;
if(min1>5){
min1=0;
}}}
if(!input(PIN_A1)){ //¿se ha pulsado el boton?
do{ //SI -> eliminar...
}while(!input(PIN_A1)); //...rebotes del boton
if(min1==0){
min1=5;
if(min==0){
min=9;
}
min--;
}
else{
min1--;
}}
if(!input(PIN_A2)){ //¿se ha pulsado el boton?
do{ //SI -> eliminar...
}while(!input(PIN_A2)); //...rebotes del boton
hora++;
if(hora>9){
hora=0;
hora1++;
if(hora1>1){
hora=0;
}}
else if(hora1==2 && hora>3){
hora=0;
hora1=0;
}}
}
if(!input(PIN_A3)){ //¿se ha pulsado el boton?
do{ //SI -> eliminar...
}while(!input(PIN_A3)); //...rebotes del boton
a++;}
if(!input(PIN_A5)){ //¿se ha pulsado el boton?
break;
}
}}