Página 1 de 1

menus+lcd 20x4

MensagemEnviado: 08 Set 2008 08:44
por David Henrique
Senhores,

Preciso desenvolver uma interface com o usuário de forma a ter um menu principal com 8 opções, e cada uma destas opções leva à um submenu que leva a outro submenu... Ou seja, uma arvore. Quero criar uma estrutura robusta e funcional de fácil modificação futura. Alguém tem um exemplo?

MensagemEnviado: 08 Set 2008 09:42
por tcpipchip
Num lcd 4x20 ?

MensagemEnviado: 08 Set 2008 09:48
por David Henrique
20 COLUNAS E 4 LINHAS...
SÃO VÁRIAS TELAS. POR EX.
1. CONFIGURAÇÃO -> 1.1 CONF. SENSOR
-> 1.2 CONF. SAIDA
-> 1.2 CONF. RS232

2. RELÓGIO -> 2.1 HORA:MIN:SEG
-> 2.2 ALTERAR RELOGIO
-> 2.3 CRONOMETRO 2.3.1 -> INICIAR
2.3.2 -> PARAR

3. MEDIÇÕES
4. DESLIGAR

SENDO QUE CADA UM DESTES MENUS IRÁ CHARMAR UMA ROTINA...

MensagemEnviado: 08 Set 2008 10:09
por Vonnilmam
Caro David,


Eu já passei por essa situação e sofri abeça, porque eu estava programando em assembler um baita menu...

Minha sugestão é voce fazer/implentar essa tarefa em C, ficará muito mais facil e inteligivel essa função...

Apesar de eu ser fanatico por assembler tenho que confessar que para funções onde há comunicação direta com o usuário a melhor opção é C....

Boa sorte,
Von

MensagemEnviado: 08 Set 2008 10:41
por ze
cód prontim como exemplo pra isso é difícil. é como pedir prum vizinho ensinar boas maneiras (sw) pra teus filhos (hw). Afinal VOCÊ é que os conhece melhor. Mas nada impede dele dar uns palpites.
palpite:
2 opções por linha e em cada subopção, 1 de voltar. mas isso não é +- óbvio não?
abs

MensagemEnviado: 08 Set 2008 11:59
por helton
sugestão:
crie uma máscara, por exemplo
-menu 1 -> mask: 0x10000
submenu1 -> mask: 0x1100
submenu1 do submenu1 -> mask: 0x1110
etc...
crie uma estrutura da arvore de navegacao:

Código: Selecionar todos
struct menu{
  char *message;
  int mask;
 void * procedure();
};

const struct menu tree[]=
{
  {"menu1", 0x10000, NULL},
    {"submenu1",0x1100,foobar()},
  {"menu2", 0x20000,NULL},
    {"submenu2",0x2100,NULL},
  {"menu3", 0x30000,NULL},
    {"submenu3",0x3100,NULL},
};

//aqui e interessante criar uns ponteiros para navegacao do menu:
//que aponta para o primeir menu...

struct menu * actual =*(struct menu*) &tree[0];
struct menu * next = actual;

//daí é so criar algoritmos para percorrer essa arvore, confome as mascaras:

void enter(void)
{
  next++;
  if ( next->mask & actual->mask ) {
    actual = next;
    show_message(actual->message);
    if ( actual->procedue != NULL) {
      actual->procedure(); //executando funcao
   }
 }
}



é uma maneira "facil"de fazer..o problema é só encontrar a logica correta para as mascaras...

MensagemEnviado: 08 Set 2008 15:41
por Djalma Toledo Rodrigues
Sugestão:
Programa estruturado , cada opção um Case

Pincipal
//// ________Case0_______Case1________Case2____...___ CaseN-1______CaseN

Case0
///// _____SubCase0______SubCase1, assim por diante

Cada um com opção Voltar como disse o Lellis.

Então ficaria assim:
Principal

1. CONFIGURAÇÃO

2. RELÓGIO

3. MEDIÇÕES

4. DESLIGAR

-----------------------------------
Case0 (Configuração)]
1 CONF. SENSOR
2 CONF. SAIDA
3 Voltar
---------------------------------
SubCase0(Config. Sensor)
1 xxxxxx
2 yyyyyy
3 Voltar ; Assim por diante
Você ficará com diversos prog. pequenos que inclusive podem ser implementado por diversos programadores.

MensagemEnviado: 15 Set 2008 08:52
por David Henrique
Aí galera, depois de uma inspiração divina, criei a seguinte estrutura:
o vetor MENU[5] controla a opção que o usuário escolhe...

SWITCH (MENU[0])
{
CASE 00:{MENU_PRINCIPAL(); }BREAK;
CASE 01:{IMPRIME_MEDICAO(); }BREAK;
CASE 02:{MENU_CONFIGURACAO(); }BREAK;
CASE 03:{IMPRIMIR_CARGA_BATERIA(); }BREAK;
CASE 04:{MENU_CALIBRACAO(); }BREAK;
}

//--------------------------------------------------------------------------------
VOID MENU_PRINCIPAL()
{
PRINTF(LCD_PUTC,"\f");
IF ((BTN_DOWN)&&(POS_SETA<6)){POS_SETA++;}//CONTROLA INCREMENTO DA SETA
IF ((BTN_UP )&&(POS_SETA>1)){POS_SETA--;}

IF(POS_SETA>4)//CONTROLA A ROLAGEM DA PÁGINA
{OFFSET_MENU=3;lcd_gotoxy(20,1);lcd_send_byte(1,0x00);}//DESENHA SETA PARA CIMA
ELSE {OFFSET_MENU=1;lcd_gotoxy(40,2);lcd_send_byte(1,0x01);}//DESENHA SETA PARA BAIXO

PRINTF(LCD_PUTC,"\1");

FOR(I=0;I<=3;I++)
{
IF(POS_SETA==(I+OFFSET_MENU)){LCD_PUTC(0x7E);}//IMPRIME A SETA
ELSE{LCD_PUTC(' ');}

SWITCH (I+OFFSET_MENU)//(I+OFFSET_MENU)
{
CASE 01:{PRINTF(LCD_PUTC,"1.MEDICAO\p");BREAK;}
CASE 02:{PRINTF(LCD_PUTC,"2.CONFIGURACAO\p");BREAK;}
CASE 03:{PRINTF(LCD_PUTC,"3.CARGA BATERIA\p");BREAK;}
CASE 04:{PRINTF(LCD_PUTC,"4.CALIBRACAO\p");BREAK;}
}
}
IF (BTN_OK_PRESS())
{MENU[0]=POS_SETA;INDEX_MENU++;POS_SETA=1;}
}

COMO EU TENHO MUITAS OPÇÕES, O PROGRMA FICOU MUITO GRANDE E NÃO DÁ PARA POSTAR TODO ELE... MAS TÁ FUNCIONANDO MUITO BEM

OBRIGADO

MensagemEnviado: 19 Set 2008 09:06
por tcpipchip
Voce olhou a lib LCD da RABBIT SEMICONDUCTOR ? (MENUS)

Re: menus+lcd 20x4

MensagemEnviado: 20 Set 2008 13:10
por Djalma Toledo Rodrigues
Esta funcionando, esta bom, esta bem, mas...
David Henrique escreveu:Quero criar uma estrutura robusta e funcional de fácil modificação futura.

Este objetivo parece que não foi alcançado não é ?
Você teve dificuldade de Extruturar o Programa?

MensagemEnviado: 22 Set 2008 07:55
por David Henrique
Sinceramente não conhecia a RABBIT e fui no site e não encontrei a lib sobre menus... você tem o link?

De qualquer forma, a etrutura do programa ficou muito boa e tá funcionando melhor que eu esperava...