criaçao de menus

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

criaçao de menus

Mensagempor cristian » 27 Set 2010 16:16

rapazes , qual a logica vcs usan pra criar menus com submenus e etc ...eu utilizo o swtch mas tem hora q embaralha tudo , pq menus tem que ter

1- listar as opçoes do menu principal
2-aguardar pressionar os botoes para tomar açoes
3-apresentear tela do submenu escolhido
4-voltar ao menu anterior
5-alterar dados dos submenus

isso vou criando semre atraves de swatch com uma varivel contendo o indice ...mas quando o menu e submenu é grande ai faz uma bagunça

ouvir falar que é igual a maquina de estado é isso mesmo?
cristian
Word
 
Mensagens: 570
Registrado em: 03 Nov 2006 08:15
Localização: serrinha-ba

Mensagempor chrdcv » 27 Set 2010 19:19

Já ouviu falar em ponteiro de funções? Que tal criar um array de ponteiros para funções passando como parâmetro o que será exibido e quando será exibido?

Christian
Avatar do usuário
chrdcv
Dword
 
Mensagens: 1580
Registrado em: 13 Out 2006 14:13

Mensagempor Djalma Toledo Rodrigues » 27 Set 2010 19:45

Programação Extruturada

_______Menu Pricipal_________
|__________________________|
--Case1 Case2 Case3 ..... CaseN

Cada qual com sua rotina independente

Vale o mesmo para Submenu

Todos devem ter a opção de Retorno, claro

DJ
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor Red Neck Guy » 27 Set 2010 20:24

Uma idéia é assim. Pode-se criar uma biblioteca para o menu, depois criar um módulo onde é criada a tabela de opções e dessa forma usa-se sempre o mesmo .C e .H para todos os projetos. Ali dentro do menu dá pra fazer de forma mais legal ainda mas é um próximo passo....
(Eu queria ter um iate pra passar por aí viajando e tomando mate...)

Código: Selecionar todos

typedef struct{
  const char *string_opcao;
  unsigned char(*func_menu)(void); 
}sMenu;

#define NUM_OPCOES_MENU  4

const sMenu menuFuleiro[NUM_OPCOES_MENU] =
{
  {"Opcao 01",funcao_do_menu_01},
  {"Opcao 02",funcao_do_menu_02},
  {"Opcao 03",funcao_do_menu_03},
  {"Sair",NULL}
};

#define LCD_CLS()
#define WRITE_LCD(STRING)// função para enviar uma string para o LCD
#define LCD_GOTO(X,Y)//função para posicionar o cursor
#define CARACTER_SELECAO  ">"
#define LE_TECLADO()  //macro para leitura do teclado que retorna 0 quando não há tecla pressionada
#define TECLA_UP
#define TECLA_DOWN
#define TECLA_ENTER
#define TECLA_ESC

void menu_lcd(char *menuTitle){
  unsigned char ponteiroOpcao=0,tecla=0xFF,menu_loop=0;
 
  LCD_CLS();
  LCD_GOTO(0,0);
  WRITE_LCD( menuTitle);
 

  do{

     if(tecla){ 
        LCD_GOTO(0,1);
        WRITE_LCD(CARACTER_SELECAO);
        WRITE_LCD(menuFuleiro[ponteiroOpcao].string_opcao);           
     }
     tecla = LE_TECLADO();
     switch(tecla){
       case TECLA_UP      : ponteiroOpcao?(ponteiroOpcao--) : (NUM_OPCOES_MENU-1); 
                                     break;
       case TECLA_DOWN: ponteiroOpcao = (ponteiroOpcao+1)%NUM_OPCOES_MENU 
                                     break;
       case TECLA_ENTER: if(menuFuleiro[ponteiroOpcao].func_menu)
                                       menuFuleiro[ponteiroOpcao].func_menu();
                                     else
                                       menu_loop = 0xFF;
                                     break;
       case TECLA_ESC   : menu_loop = 0xFF; break;
     }

  }
  while(!menu_loop);


}
ASM51 descanse em paz!
Avatar do usuário
Red Neck Guy
Dword
 
Mensagens: 1968
Registrado em: 12 Out 2006 22:24

Mensagempor Silvio51 » 27 Set 2010 20:29

Aquino escreveu:
(Eu queria ter um iate pra passar por aí viajando e tomando mate...)




É meu amigo... tem gosto pra tudo... arrrrghhh...
Silvio51
Byte
 
Mensagens: 383
Registrado em: 02 Nov 2006 14:04
Localização: Brasil

Mensagempor chrdcv » 27 Set 2010 23:26

Silvio51 escreveu:
Aquino escreveu:
(Eu queria ter um iate pra passar por aí viajando e tomando mate...)




É meu amigo... tem gosto pra tudo... arrrrghhh...


Eu que sou minerim me contentaria com uma fábrica de queijim da roça e umas cachacinhas... êtra trem bão uai!
Avatar do usuário
chrdcv
Dword
 
Mensagens: 1580
Registrado em: 13 Out 2006 14:13

Mensagempor cristian » 28 Set 2010 14:16

estou montando um menu aqui qualquer coisa eu posto aqui
cristian
Word
 
Mensagens: 570
Registrado em: 03 Nov 2006 08:15
Localização: serrinha-ba

Mensagempor cristian » 29 Set 2010 09:21

esta funçao aqui da erro ,nuca tinha visto esta forma de declarar const
entao montei e testei mas da erro

Código: Selecionar todos
void funcao_do_menu_01(void)
{

}

void funcao_do_menu_02(void)
{

}

void funcao_do_menu_03(void)
{

}

typedef struct{
  const char *string_opcao;
  unsigned char(*func_menu)(void);
}sMenu;

#define NUM_OPCOES_MENU  4

const sMenu menuFuleiro[NUM_OPCOES_MENU] =
{
  {"Opcao 01",funcao_do_menu_01},
  {"Opcao 02",funcao_do_menu_02},
  {"Opcao 03",funcao_do_menu_03},
  {"sair"}

};

66 319 Cannot cast '' to ''
66 325 Too many initializers


mesmo declarando as funçoes deu erro e o NULL no mikroc nao aceitou

me explica esta funçao ai pode ser
cristian
Word
 
Mensagens: 570
Registrado em: 03 Nov 2006 08:15
Localização: serrinha-ba

Mensagempor fabim » 29 Set 2010 09:33

cris. é que a IDE não tem bola de cristal.

unsigned char(*func_menu)(void);

unsigned char(*func_menu "cade a definição de func_menu"?)(para nome que não enteressa a IDE que se dane pra entender);

você tem qeu definir o tipo (*func_menu).

você ta dizendo que é um ponteiro para algo desconhecido, mais o que é esse ponteiro ? Tem um nome, mais a IDE não sabe o qeu é.!!

Quando pegar estes exemplos, você deve ver as definições etc, e sempre observar para ver se acha os typedef ou struct ou #define. informando oq ue é esses nomes.

Abraços
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor cristian » 29 Set 2010 09:36

nao seria esse o caminho?

Código: Selecionar todos
void funcao_do_menu_01(void)
{

}



para utilizar ele usou

Lcd_chr(2,2,menuFuleiro[2].string_opcao);  // para escrever no display e

menuFuleiro[2].func_menu;// para chamar a funçao no indice [2] correto?



Código: Selecionar todos
isso aqui nao funciona diz q nao pode transformar ponteiros em int
Lcd_chr(2,2,menuFuleiro[2].string_opcao);  // para escrever no display e
cristian
Word
 
Mensagens: 570
Registrado em: 03 Nov 2006 08:15
Localização: serrinha-ba

Mensagempor Red Neck Guy » 29 Set 2010 10:21

cristian escreveu:esta funçao aqui da erro ,nuca tinha visto esta forma de declarar const
entao montei e testei mas da erro

Código: Selecionar todos
void funcao_do_menu_01(void)
{

}

void funcao_do_menu_02(void)
{

}

void funcao_do_menu_03(void)
{

}

typedef struct{
  const char *string_opcao;
  unsigned char(*func_menu)(void);
}sMenu;

#define NUM_OPCOES_MENU  4

const sMenu menuFuleiro[NUM_OPCOES_MENU] =
{
  {"Opcao 01",funcao_do_menu_01},
  {"Opcao 02",funcao_do_menu_02},
  {"Opcao 03",funcao_do_menu_03},
  {"sair"}

};

66 319 Cannot cast '' to ''
66 325 Too many initializers


mesmo declarando as funçoes deu erro e o NULL no mikroc nao aceitou

me explica esta funçao ai pode ser


Acho que é pq na estrutura o tipo do ponteiro para função é do tipo
unsigned char(*pFunc)(void), tu tens duas opções aqui. Alterar o tipo do ponteiro na estrutura para void(*pFunc)(void) ou alterar as tuas funções para serem do tipo unsigned char func(void).

Vou escrever em negrito só para frisar, não me entendam mal:
Em ANSI C o nome de uma função sem parenteses é um ponteiro para ela, ou seja sempre que uso algo do tipo
void *ponteiro = (void*)nomeFunc estou pegando o endereço de entrada da função. Logo posso usar somente o nome em qualquer lugar onde seja necessário o endereço, como no caso de uma inicialização de constante.
ASM51 descanse em paz!
Avatar do usuário
Red Neck Guy
Dword
 
Mensagens: 1968
Registrado em: 12 Out 2006 22:24

Mensagempor Red Neck Guy » 29 Set 2010 10:21

cristian escreveu:esta funçao aqui da erro ,nuca tinha visto esta forma de declarar const
entao montei e testei mas da erro

Código: Selecionar todos
void funcao_do_menu_01(void)
{

}

void funcao_do_menu_02(void)
{

}

void funcao_do_menu_03(void)
{

}

typedef struct{
  const char *string_opcao;
  unsigned char(*func_menu)(void);
}sMenu;

#define NUM_OPCOES_MENU  4

const sMenu menuFuleiro[NUM_OPCOES_MENU] =
{
  {"Opcao 01",funcao_do_menu_01},
  {"Opcao 02",funcao_do_menu_02},
  {"Opcao 03",funcao_do_menu_03},
  {"sair"}

};

66 319 Cannot cast '' to ''
66 325 Too many initializers


mesmo declarando as funçoes deu erro e o NULL no mikroc nao aceitou

me explica esta funçao ai pode ser


Acho que é pq na estrutura o tipo do ponteiro para função é do tipo
unsigned char(*pFunc)(void), tu tens duas opções aqui. Alterar o tipo do ponteiro na estrutura para void(*pFunc)(void) ou alterar as tuas funções para serem do tipo unsigned char func(void).

Vou escrever em negrito só para frisar, não me entendam mal:
Em ANSI C o nome de uma função sem parenteses é um ponteiro para ela, ou seja sempre que uso algo do tipo
void *ponteiro = (void*)nomeFunc estou pegando o endereço de entrada da função. Logo posso usar somente o nome em qualquer lugar onde seja necessário o endereço, como no caso de uma inicialização de constante.
ASM51 descanse em paz!
Avatar do usuário
Red Neck Guy
Dword
 
Mensagens: 1968
Registrado em: 12 Out 2006 22:24

Mensagempor Red Neck Guy » 29 Set 2010 10:21

cristian escreveu:esta funçao aqui da erro ,nuca tinha visto esta forma de declarar const
entao montei e testei mas da erro

Código: Selecionar todos
void funcao_do_menu_01(void)
{

}

void funcao_do_menu_02(void)
{

}

void funcao_do_menu_03(void)
{

}

typedef struct{
  const char *string_opcao;
  unsigned char(*func_menu)(void);
}sMenu;

#define NUM_OPCOES_MENU  4

const sMenu menuFuleiro[NUM_OPCOES_MENU] =
{
  {"Opcao 01",funcao_do_menu_01},
  {"Opcao 02",funcao_do_menu_02},
  {"Opcao 03",funcao_do_menu_03},
  {"sair"}

};

66 319 Cannot cast '' to ''
66 325 Too many initializers


mesmo declarando as funçoes deu erro e o NULL no mikroc nao aceitou

me explica esta funçao ai pode ser


Acho que é pq na estrutura o tipo do ponteiro para função é do tipo
unsigned char(*pFunc)(void), tu tens duas opções aqui. Alterar o tipo do ponteiro na estrutura para void(*pFunc)(void) ou alterar as tuas funções para serem do tipo unsigned char func(void).

Vou escrever em negrito só para frisar, não me entendam mal:
Em ANSI C o nome de uma função sem parenteses é um ponteiro para ela, ou seja sempre que uso algo do tipo
void *ponteiro = (void*)nomeFunc estou pegando o endereço de entrada da função. Logo posso usar somente o nome em qualquer lugar onde seja necessário o endereço, como no caso de uma inicialização de constante.
ASM51 descanse em paz!
Avatar do usuário
Red Neck Guy
Dword
 
Mensagens: 1968
Registrado em: 12 Out 2006 22:24

Mensagempor fabim » 29 Set 2010 10:26

Calma aquino, ja entendemos.. Não precisa exagerar.. hehehe..

Como disse, tem que saber exatamente qual é o tipo... E detalhe, o mikroC odeia isso, da um pau lascado. Pode testar a vontreeeeeeee.. hehehe
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor cristian » 29 Set 2010 10:31

vcs sao uma onda ....kkkkkkkkkkkkkkkkkkkkkkkkkkk , precisava postar 3 vezes

fabio
mikroC odeia isso ......quer dizer q ja vai dar pau



vouo alterar
cristian
Word
 
Mensagens: 570
Registrado em: 03 Nov 2006 08:15
Localização: serrinha-ba

Próximo

Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

cron

x