Autor Tema: Ayuda con Switch(Case) y Funciones en CCS  (Leído 16518 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Lord_Duran

  • PIC12
  • **
  • Mensajes: 76
Ayuda con Switch(Case) y Funciones en CCS
« 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)

Desconectado sander

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 624
Re: Ayuda con Switch(Case) y Funciones en CCS
« Respuesta #1 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
« Última modificación: 30 de Septiembre de 2010, 09:43:21 por sander »
La electrónica es el arte de manipular señales eléctricas que transportan información
Jan Davidse

Visita mi blog
Visita mi canal de youtube

Desconectado f-traxx

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 116
Re: Ayuda con Switch(Case) y Funciones en CCS
« Respuesta #2 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?

Desconectado sander

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 624
Re: Ayuda con Switch(Case) y Funciones en CCS
« Respuesta #3 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.
La electrónica es el arte de manipular señales eléctricas que transportan información
Jan Davidse

Visita mi blog
Visita mi canal de youtube

Desconectado f-traxx

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 116
Re: Ayuda con Switch(Case) y Funciones en CCS
« Respuesta #4 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!! :) ;-)

Desconectado robotic

  • PIC12
  • **
  • Mensajes: 55
Re: Ayuda con Switch(Case) y Funciones en CCS
« Respuesta #5 en: 01 de Octubre de 2010, 18:17:47 »
yo creo que no funciona porque lcd_putc("prueva del menu"); es con b
jejejeje :)

Desconectado underwol2

  • PIC12
  • **
  • Mensajes: 53
Re: Ayuda con Switch(Case) y Funciones en CCS
« Respuesta #6 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;
   
   }
   
   
}
« Última modificación: 09 de Junio de 2011, 13:30:58 por underwol2 »