Ya que estamos dejo el codigo fuente para que lo veais si quereis... No es lo mejor que he hecho en c pero era uno de mis primeros programas para pic... asi que sed comprensivos
Codigo:
/*********insoladora uControlada******************
Insoladora uControlada
----------------------
José Antonio Migens Gómez.
Octubre 2005
vital***********************elmasvital@yahoo.es***/
#include <16f628.h> //pic a utilizar
#fuses intrc_io,NOWDT,NOBROWNOUT,NOPROTECT,PUT,NOLVP,NOMCLR //ordenes para el programador
#use delay (clock=4000000) //Fosc=4Mhz
#define use_portb_lcd TRUE //definir portb lcd
#include<lcdmin.c> //libreria manejo lcd
#include<tones.c>
#use fast_io(a)
#rom 0x2100={3,15, 2,10, 0,0, 0,0, 1,20}
#define INTS_PER_SECOND 25 // preescaler del timer2 para 4 mhz
///DECLARACIONES DE FUNCIONES
int manejo_menu(int num_menu, int opc_min, int opc_max);
char mostrar_mensaje ( byte n_numero, byte n_submenu);
int pedir_tiempo (min_minutos, min_segundos);
void espera_ok();
void ver_estadisticas();
//DECLRACION DE CONSTANTE
char const mensajes[13][19] ={"{ Insolar Placa }",
"{Config. Insolado}",
"{Ver Estadisticas}",
"Tiempo manual",
"Tiempo programado",
"Tiempo 1",
"Tiempo 2",
"Tiempo 3",
"Config tiempo 1",
"Config tiempo 2",
"Config tiempo 3",
"Seguir insol. NO",
"Seguir insol. SI"};
byte const add_time[5] ={0,2,4,6,8}; // 0-2 tiempos programados 1,2,3; 3 tiempo de insolado 4 ultimo insolado.
/*
byte const add_time1 = 0; //constantes de los bancos de memoria donde se guardan los datos
byte const add_time2 = 2;
byte const add_time3 = 4;
byte const add_time = 6; //tiempo de la cuenta atrás... para detectar si se apagó insoladora sin terminar
//insolado
byte const add_last_time = 8; //tiempo del último insolado.
*/
//DECLARACIONES DE VARIABLES
int8 int_count; // contador de interrupciones hasta llegar al desbordamiento
int8 segundos, minutos;
/*********************************
INTERRUPCION TIMER2
**********************************/
#INT_TIMER2 // Interrupción del timer2
void clock_isr()
{ // Desbordamiento del timer 2 ~= 25 por segundo
if(--int_count==0)
{
if(segundos > 0) --segundos;
int_count = INTS_PER_SECOND;
}
}
/*********************************
CUENTA ATRÁS
Se le pasa un valor de minutos y segundos
activa el timer2 y lo para cuando haya terminado
la cuenta atrás.
El timer2 se encargará de ir decrementando los segundos
y cuenta_atras a controlar el paso de los minutos y de
activar y desactivar el reloj, también de imprimir
en el lcd la cuenta atrás.
**********************************/
void cuenta_atras ()//int8 segundos, int8 minutos)
{
boolean salir=0;
int8 contador=0;
//activamos reloj
setup_timer_2(T2_DIV_BY_16, 250, 10);
set_timer2(0);
enable_interrupts(INT_TIMER2);
enable_interrupts(GLOBAL);
int_count = INTS_PER_SECOND;
//activamos insoladora (bit del triac)
output_high(PIN_A2);
//lcd_putc ("CUENTA ATRAS"
;
while (!salir)
{
if (contador!=segundos)
{
if (segundos == 0)
{
if(minutos > 0)
{
segundos = 60;
minutos--;
output_toggle(PIN_A5);
}
}
if (segundos== 0 && minutos ==0) salir=true;
contador=segundos;
//guardamos el tiempo de insolado por si se apaga la insoladora sin terminar
write_eeprom(add_time[3],minutos);
write_eeprom(add_time[3]+1,segundos);
printf(lcd_putc, "fInsolando %u:%02d" ,minutos,segundos-1);
}
}
//desactivamos el reloj
disable_interrupts(INT_TIMER2);
//deactivamos insoladora (bit del triac)
output_low(PIN_A2);
lcd_putc("fInsolado completado"
;
for (contador=3;contador>0;contador--)
{
generate_tone(C_note[0],350);
delay_ms(100);
}
espera_ok();
}
void espera_ok()
{
while (!input(PIN_a6)); //Espera q pulsemos OK
delay_ms(200);
}
void main(void)
{
int opcion, tiempo;
int num_periods=30;
boolean salir=false;
set_tris_a(0b11000001);
lcd_init(); //inicializa lcd
while (true)
{
// set_tris_a(0b11110111);
output_high(PIN_A5);
lcd_putc("fInsoladora (c) ViTAL"
;
delay_ms(1000);
//comprobamos que no existe un insolado abortado
minutos=read_eeprom(add_time[3]);
segundos=read_eeprom(add_time[3]+1);
if (minutos >0 || segundos >0)
{
generate_tone(C_note[0],850);
lcd_putc("fError insolando"
;
espera_ok();
if (manejo_menu(11,11,12)==12)
{
pedir_tiempo(0,10);
cuenta_atras();
}
//borramos el error
write_eeprom(add_time[3],0);
write_eeprom(add_time[3]+1,0);
}
opcion = manejo_menu(0,0,1);
salir=false;
while (salir==false) //repetimos hasta que salgamos
{
switch (opcion)
{
case 0: //Insolar placa
opcion=manejo_menu (3,3,4);
break;
// case 2:
// ver_estadisticas();
// break;
case 3: //Tiempo manual
minutos=0;
segundos=10;
tiempo=pedir_tiempo(0,10);
//insolando...
cuenta_atras();
salir=true;
break;
case 4: //Tiempo programado
opcion=manejo_menu(5,5,7);
break;
case 6:
case 7:
case 5:
//insolando...
cuenta_atras();
salir=true;
break;
case 1:
opcion=manejo_menu(8,8,10);
break;
case 8:
case 9:
case 10:
minutos=read_eeprom(add_time[opcion-8]);
segundos=read_eeprom(add_time[opcion-8]+1);
pedir_tiempo(0,10);
write_eeprom(add_time[opcion-8],minutos);
write_eeprom(add_time[opcion-8]+1,segundos);
salir=true;
break;
}
}
}
}
int manejo_menu(int num_menu, int opc_min, int opc_max)
{
//esta function tiene como objetivo controlar los botones de la insoladora
//para poder navegar por los diferentes menús y funciones.
boolean salir=0;
byte refrescar;
byte opcion_num;
opcion_num=opc_min;
//forzamos la impresión de los menús
refrescar=true;
// printf(lcd_putc,"f%S", mensajes[opcion_num]);
//esperamos que se pulse algun boton
while (true)
{
if (input(PIN_a0)) //Boton -
{
if (opc_min !=opcion_num) opcion_num--;
delay_ms(200);
refrescar=true;
}
else
{
if (input(PIN_a7)) //Boton +
{
if (opc_max !=opcion_num) opcion_num++; //solo aumentamos si no estamos fuera de los límites
delay_ms(200);
refrescar=true;
}
else
{
if (input(PIN_a6)) //Boton OK
{
if (opcion_num >4 && opcion_num <
{
minutos=read_eeprom(add_time[opcion_num-5]);
segundos=read_eeprom(add_time[opcion_num-5]+1);
}
delay_ms(200);
return (opcion_num);
}
}
if (refrescar)
{
printf(lcd_putc,"f%S", mensajes[opcion_num]);
if (opcion_num >4 && opcion_num <
{
printf (lcd_putc," %02d:%02d }", read_eeprom(add_time[opcion_num-5]), read_eeprom(add_time[opcion_num-5]+1));
}
refrescar=false;
}
}
// mostrar_mensaje(num_menu, opcion_num); //Mostramos el mensaje correspondiente al menú seleccionado
}//while
}
int pedir_tiempo (min_minutos, min_segundos)
{
boolean refresca_lcd;
//minutos=min_minutos;
//segundos=min_segundos;
printf(lcd_putc, "fTiempo %02d:%02d",minutos, segundos);
while (true) // bucle infinito... se sale por el return del boto ok
{
refresca_lcd=false;
if (input(PIN_a0)) //Boton -
{
refresca_lcd=true;
if (segundos == 0)
{
if (minutos!=min_minutos)
{
segundos=59;
minutos--;
}
}
else
if (segundos!=min_segundos)segundos--;
delay_ms(151);
}
else
{
if (input(PIN_a7)) //Boton +
{
refresca_lcd=true;
if (minutos<99) //maximo 99 minutos
{
if (segundos==59) //transformamos segundos en minutos
{
segundos=0;
minutos++;
}
else segundos++;
}
delay_ms(151); //evitamos rebote
}
else
{
if (input(PIN_a6)) //Boton OK
{
delay_ms(151);
return;
}
}
}
if (refresca_lcd) printf(lcd_putc, "fTiempo %02d:%02d",minutos,segundos);
}
}
/*void ver_estadisticas ()
{
lcd_putc("Tiempo in. hhh:mm:ss"
;
lcd_putc("Isolado error. xxx"
;
lcd_putc("Numero insolados xxx"
;
espera_ok();
}*/