Hola soy nuevo en esto de los temas de los micros. Bien planteo lo que quiero hacer. Es un reloj despertador con el pic 16F84A, el despliegue de la hora sera con display de 7 segmentos multiplexados. El codigo lo muestro el cual tome de la pagina de REDPIC, me ha dado bastante idea o casi toda de como hacer algunas funciones del reloj, aunque necesito hacer algunas modificaciones como en la directiva del pic y agregarle la parte de la Hora ya que en este codigo solo usa y despliega segundos y minutos, y en mi caso pretendo desplegar horas y minutos.
Otra cosa que me faltaria modificar es poner el codigo para poder ajustar la hora del reloj como cualquier otro y ademas de poner la hora de alarma para disparar un buzzer, al momento de ajustar la alarma quiero que como cualqueir reloj se despliegue en ese momento la hora de la alarma y se vea el cambio al presionar un push boton. Pues en pocas palabras hacer lo tipico de un reloj despertador jejeje. No estoy seguro si el programa en CCS para el reloj despertador pueda ser almacenado en el pic 16F84A. Una cosilla mas el despertador en vez de ser desactivado por pushboton quiero que se desactive por laser con un ldr o algun dispositivo optoelectronico, jejeje como vi por ahi en internet a un reloj que le disparaban a un blanco con una pistolita con laser para desactivar la alarma
.
No se si los botones para modificar la hora del reloj y la hora de alarma las pudiera hacer con interrupciones, Ademas usar tres botones, uno que fuera para entrar al cambio de hora de reloj y otro para el cambio de hora de alarma y el tercero para incrementar minuto a minuto la hora tanto del reloj como de la alarma o usar mas botones.
Aqui dejo el link donde tome el codigo
http://picmania.garcia-cuervo.net/picc.php#CRONOPIC1
#include <16f876a.h> // Selecciona el PIC
#fuses XT,NOWDT,NOPROTECT,PUT,BROWNOUT // Opciones de configuración
#use delay(clock=4000000) // Velocidad del Cristal : 4 Mhz
#use standard_io(B) // PORTB en estandar IO digital
#use fixed_io(b_outputs=PIN_B0,PIN_B1,PIN_B2,PIN_B3,PIN_B4,PIN_B5,PIN_B6,PIN_B7)
char const RTCCxS=15; // Número de RTCC's para 1 segundo con 4 Mhz / 1:256.
// VARIABLES GLOBALES
int nRTCC=0x00; // Contador de interrupciones RTCC completas
int segundo=0x0; // Segundos del Reloj
int minuto=0x0; // Minutos del Reloj
int D1=0x00; // Contenido de los Displays
int D2=0x00;
int D3=0x00;
int D4=0x00;
int l_digit, h_digit; // Resultado de la conversión bin2bcd
int i; // index general
void testdisplays(void); // Función que testea los displays
void display_reloj(void); // Función que muestra el contenido del reloj
void time2bcd(void); // Función que convierte minutos y segundos a 4 x BCD
void bin2bcd(int valor); // Función que convierte de Binario a BCD
#int_RTCC // Interrupción por desbordamiento
RTCC_isr() { // del TIMER0 RTCC
if(++nRTCC==RTCCxS){
nRTCC=0x00;
if(++segundo>59){
segundo=0;
if(++minuto>59){
minuto=0;
}
}
}
}
void main(void) {
int ksegundo=0x00;
setup_counters(RTCC_INTERNAL,RTCC_DIV_256); // TIMER0: Clock Interno y Preescaler
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
enable_interrupts(INT_RTCC);// Habilito Interrupción RTCC
enable_interrupts(global); // Habilito Interrupciones
do{ // Bucle infinito
if(segundo!=ksegundo){ // si cambia el segundo actualizo las
time2bcd(); // variables con lo que hay que mostrar
ksegundo=segundo;
}
display_reloj(); // Muestra constantemente
}While(TRUE);
}
void display_reloj(void){ // Función que muestra el contenido del reloj
output_b(D1); // Muestro 1er carácter de segundo
output_high(PIN_B4);
delay_us(30);
output_b(D2); // Muestro 2do carácter de segundo
output_high(PIN_B5);
delay_us(30);
output_b(D3); // Muestro 1er carácter de minuto
output_high(PIN_B6);
delay_us(30);
output_b(D4); // Muestro 2do carácter de minuto
output_high(PIN_B7);
delay_us(30);
}
void time2bcd(void){ // Función convierte minutos y segundos a 4 x BCD
bin2bcd(segundo); // Paso de binario a BCD el segundo y actualizo
D1 = l_digit; // contenido a mostrar
D2 = h_digit;
bin2bcd(minuto); // Paso de binario a BCD el minuto y actualizo
D3 = l_digit; // contenido a mostrar
D4 = h_digit;
}
void bin2bcd(int valor){ // Función que convierte de Binario a BCD
h_digit=0;
if (valor>=10){
do{
valor-=10;
h_digit++;
} while (valor>=10);
}
l_digit=valor;
}