TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Lord_Duran en 28 de Septiembre de 2010, 17:44:41

Título: Ayuda con Switch(Case) y Funciones en CCS
Publicado 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.

Código: [Seleccionar]
#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)
Título: Re: Ayuda con Switch(Case) y Funciones en CCS
Publicado por: sander en 29 de Septiembre de 2010, 17:12:13
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
Título: Re: Ayuda con Switch(Case) y Funciones en CCS
Publicado por: f-traxx en 30 de Septiembre de 2010, 03:26:54
Creo que lo que te ha dicho sander es la mejor opcion, una pregunta, que hace lo de #zero_ram?
Título: Re: Ayuda con Switch(Case) y Funciones en CCS
Publicado por: sander en 30 de Septiembre de 2010, 09:46:45
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.
Título: Re: Ayuda con Switch(Case) y Funciones en CCS
Publicado por: f-traxx en 01 de Octubre de 2010, 05:06:13
gracias por tu respuesta, como dicen... nunca te acostaras sin saber una cosa mas... y aun mas si andas por este foro!! :) ;-)
Título: Re: Ayuda con Switch(Case) y Funciones en CCS
Publicado por: robotic en 01 de Octubre de 2010, 18:17:47
yo creo que no funciona porque lcd_putc("prueva del menu"); es con b
jejejeje :)
Título: Re: Ayuda con Switch(Case) y Funciones en CCS
Publicado por: underwol2 en 09 de Junio de 2011, 11:26:56
//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;
   
   }
   
   
}