Si te dieran la tarea de clavar un clavo con un martillo y te dan el martillo, creo que hubieras agarrado una tenaza, un serrucho, una forga, tratado de crear un martillo y recien alli tratar de clavarlo.
Me refiero a esto:
#byte port_A=0x05
#byte port_B=0x06
#byte port_C=0x07
#byte port_D=0x08
bit_test(port_C,4)
set_tris_c(0xF0);
Hubieras puesto:
y tenias para usar sin que se cambie a entrada:
-----------------------------------------
if(Prog==1)Programar();else Normal();
Y luego dentro preguntas nuevamente por prog ?
void Normal()
{
if(Prog==0)
{
lcd_gotoxy(6,1);
}
Es obvio que se va a ejecutar, por que entro alli ya con Prog == 0
----------------------------------------
Miremos la funciones de actualizacion:
void ActualizarPrograma()
{
disable_interrupts(int_ext);
void ActualizaHora()
{
enable_interrupts(int_ext);
Estas son llamadas desde la interrupcion int_ext, una ves ejecutado el Actualizar_Programa, nunca mas podes ejecutar el ActualizaHora! por que estan deshabilitadas!
------------------------------------------------------------
Esto es un asesinato:
if((!(bit_test(port_D,3)))&&(Seleccion==1))
{
DHora++;
if(DHora=3)DHora=0;
}
if((!(bit_test(port_D,3)))&&(Seleccion==2))
{
UHora++;
if(UHora=10)UHora=0;
}
if((!(bit_test(port_D,3)))&&(Seleccion==3))
{
DMinutos++;
if(DMinutos=6)DMinutos=0;
}
if((!(bit_test(port_D,3)))&&(Seleccion==4))
{
UMinutos++;
if(UMinutos=10)UMinutos=0;
Problemas en ese solo pedazo de texto:
- repetir 4 veces el bit_test
- Todos los if de adentro no son igualdades sino asignaciones, les falta un =.
- Todos if separados lo cual es ilogico, ya que si Seleccion tiene un valor va a entrar en el que corresponda y no deberia preguntar por los demas.
Usando el FAST_IO
if(!input(PIN_D3)
{
switch(Seleccion)
{
case 1:
DHora++;
if(DHora==3) DHora=0;
break;
case 2:
UHora++;
if(UHora==10) UHora=0;
break;
case 3:
DMinutos++;
if(DMinutos==6) DMinutos=0;
break;
case 4:
UMinutos++;
if(UMinutos==10) UMinutos=0;
break;
case 5:
// Aca codigo
break;
default:
break;
}
}
---------------------------------------------------------
void TIMER1_isr(void)//Función de interrupción por desbordamiento TMR1
{
if(!(bit_test(port_C,4)))Prog=!Prog;
if(!(bit_test(port_D,2)))
No existe ninguna restriccion para que esto se ejecute o no, si tenes presionado el PIN_C4 , cada 200ms va a estar cambiando Prog, dije 200ms por lo que pusiste en comentarios.
-------------
El loop while esta continuamente escribiendo el LCD unos espacios y signos de pregunta, sin ninguna necesidad.
El codigo de tu while, con el Normal y el Programacion juntos:
while(1)
{
lcd_gotoxy(6,1);
if(Prog==1)
{
}
else
{
}
lcd_gotoxy(1,2);
switch(Seleccion)
{
case 1:
break;
case 2:
break;
case 3:
break;
case 4:
break;
case 5:
break;
default:
break;
}
}
Aunque no lo haria asi, solo escribiria cuando fuese necesario en el LCD, pero bueno es para que te des cuenta toda la informacion redundante que hay
-------------
Finalmente. Esta todo como muy rebuscado para hacer las cosas, podria hacerse mucho mas claro todo. Y eso ya depende de vos.