TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Lord_Duran en 28 de Septiembre de 2010, 17:44:41
-
Saludos.
tengo este código, lo que hace es llamar a una funcion, y ésta llama a otra, pero no regresa al codigo principal, desde donde se llamo a la primera funcion.
supongo que por defecto debería regresar al lugar de donde se le llama !!!!!
Que estoy haciendo mal????
El código es éste.
#include <16F877A.h>
#device adc = 10
#FUSES XT, NOWDT, NOPROTECT, NOPUT, NOBROWNOUT
#use delay(clock=4000000)
#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#use fast_io(D)
#bit enter = 6.1
#bit arriba = 8.6
#bit abajo = 8.7
#include <LCD4x20.C>
#use fast_io(B)
#use fast_io(D)
void vDibujaPuntero(int puntero);
void OpcionSelect(int puntero);
void testeo(void);
int puntero = 0;
#zero_ram
void main()
{
//int puntero = 0;
set_tris_b(0x03);
set_tris_d(0xC0);
lcd_init();
while(true)
{
lcd_putc("\f");
lcd_putc(" Este es una");
lcd_gotoxy(1,2);
lcd_putc("prueva del menu");
lcd_gotoxy(1,3);
lcd_putc("espero salga");
lcd_gotoxy(1,4);
lcd_putc("bien....!");
if (enter == 1)
{
lcd_putc("\f");
lcd_gotoxy(1,2);
lcd_putc("SELECCIONE");
lcd_gotoxy(1,3);
lcd_putc("PLANTACION");
delay_ms(2000);
//lcd_putc("\f");
testeo();
}
delay_ms(300);
}
//delay_ms(300);
}
void testeo()
{
puntero = 1;
vDibujaPuntero(puntero);
while (true)
{
if (abajo == 1)
{
delay_ms(300);
puntero++;
if (puntero == 5)
{
puntero = 1;
}
vDibujaPuntero(puntero);
}
if (arriba == 1)
{
delay_ms(300);
puntero--;
if (puntero == 0)
{
puntero = 4;
}
vDibujaPuntero(puntero);
}
if (enter == 1)
{
OpcionSelect(puntero);
}
}
}
void vDibujaPuntero (int puntero)
{
lcd_putc("\f");
lcd_gotoxy(3,1);
lcd_putc("1 opcion uno");
lcd_gotoxy(3,2);
lcd_putc("2 opcion dos");
lcd_gotoxy(3,3);
lcd_putc("3 opcion tres");
lcd_gotoxy(3,4);
lcd_putc("4 opcion cuatro");
lcd_gotoxy(1,puntero);
lcd_putc("->");
}
void OpcionSelect(int puntero)
{
switch(puntero)
{
case 1:lcd_putc("\f");
lcd_putc("opcion 1");
lcd_gotoxy(1,2);
lcd_putc("seleccionada");
delay_ms(300);
break;
case 2:lcd_putc("\f");
lcd_putc("opcion 2");
lcd_gotoxy(1,2);
lcd_putc("seleccionada");
delay_ms(300);
break;
case 3:lcd_putc("\f");
lcd_putc("opcion 3");
lcd_gotoxy(1,2);
lcd_putc("seleccionada");
delay_ms(300);
break;
case 4:lcd_putc("\f");
lcd_putc("opcion 4");
lcd_gotoxy(1,2);
lcd_putc("seleccionada");
delay_ms(300);
break;
}
}
tambien pongo los archivos para la simulacion y el compilado (proteus)
-
Hola Lord_Duran, por lo que pude ver en la funcion void testeo() utilizas un while(1), esto evita que salgas de esa funcion, por lo que el programa se queda dando vueltas ahi, lo que puedes hacer es usar una bandera (flag), y hacer un while(flag), y flag lo pones en cero cuando quieras salir de la funcion testeo.
Saludos
-
Creo que lo que te ha dicho sander es la mejor opcion, una pregunta, que hace lo de #zero_ram?
-
Creo que lo que te ha dicho sander es la mejor opcion, una pregunta, que hace lo de #zero_ram?
Hola f-traxx, #zero_ram no es una funcion , es una directiva de preprocesado y lo que hace es inicializar en zero las posiciones de la RAM que uses como variables.
Saludos.
-
gracias por tu respuesta, como dicen... nunca te acostaras sin saber una cosa mas... y aun mas si andas por este foro!! :) ;-)
-
yo creo que no funciona porque lcd_putc("prueva del menu"); es con b
jejejeje :)
-
//estube modificando tucodigo no funciona como querias y sedemora en en tomar el enter espero que te allude en algo
#include <16F877A.h>
#device adc=8
#FUSES NOWDT, XT, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT, RESERVED
#use delay(clock=4000000)
#include <LCD.C>
#use fast_io(B)
#bit enter = 6.4
#bit arriba = 6.5
#bit abajo = 6.6
void vDibujaPuntero(int puntero);
void OpcionSelect(int puntero);
void testeo(void);
int puntero = 0;
//#zero_ram
void main()
{
//int puntero = 0;
set_tris_b(0x03);
//set_tris_d(0xC0);
lcd_init();
while(true)
{
if (enter == 1)
{
testeo();
}
delay_ms(300);
}
}
void testeo()
{
puntero = 0;
vDibujaPuntero(puntero);
while (true)
{
if (arriba == 1)
{
delay_ms(300);
puntero++;
if (puntero == 5)
{
puntero = 1;
}
vDibujaPuntero(puntero);
}
if (abajo == 1)
{
delay_ms(300);
puntero--;
if (puntero == 5)
{
puntero = 256;
}
vDibujaPuntero(puntero);
}
if (enter == 1)
{
OpcionSelect(puntero);
}
}
}
void vDibujaPuntero (int puntero)
{
lcd_putc("\f");
if(1==puntero)
{
lcd_putc("1opcion uno");
delay_ms(300);
lcd_putc("\f");
return;
}
if(2==puntero)
{
lcd_putc("2 opcion dos");
delay_ms(300);
lcd_putc("\f");
return;
}
if(3==puntero)
{
lcd_putc("3 opcion tres");
delay_ms(300);
lcd_putc("\f");
return;
}
if(4==puntero)
{
lcd_putc("4 opcion cuatro");
delay_ms(300);
lcd_putc("\f");
}
}
void OpcionSelect(int puntero)
{
switch(puntero)
{
case 1:lcd_putc("\f");
lcd_putc("opcion 1");
lcd_gotoxy(1,2);
lcd_putc("seleccionada");
delay_ms(300);
lcd_putc("\f");
break;
case 2:
lcd_putc("opcion 2");
lcd_gotoxy(1,2);
lcd_putc("seleccionada");
delay_ms(300);
lcd_putc("\f");
break;
case 3:
lcd_putc("opcion 3");
lcd_gotoxy(1,2);
lcd_putc("seleccionada");
delay_ms(300);
lcd_putc("\f");
break;
case 4:
lcd_putc("opcion 4");
lcd_gotoxy(1,2);
lcd_putc("seleccionada");
delay_ms(300);
lcd_putc("\f");
break;
}
}