Página 1 de 1

Menu estruturado,usando o conceito de arvore. Saiba com faze

MensagemEnviado: 10 Ago 2009 15:54
por HC908
bom pessoal abaixo tem o codigo de manipular menu que eu fiz utilizando o conceito de arvore e ponteiro para função. + não totalmente completo + daqui a uns dia vou colocar todo comentado.
Código: Selecionar todos
#include <p18cxxx.h>
#define in delay.h
#pragma config WDTEN = OFF,FOSC = HS,STVREN = ON,CP0 = OFF,XINST = OFF
#include "typedef.h"
#include <string.h>
#include <stdlib.h>
#include <portb.h>
#include "main.h"
#include "isr.h"
#include "crc.h"
#include "drv_lcd.h"
#include "drv_keyboard.h"
#include "drv_smartcard.h"
#include "drv_rtc.h"
#include "menu.h"
#include "task_app.h"
#include "task_pulso.h"

struct Tlcd
{
   u8 linha;
    u8 coluna;
   u8 set_pos;
}slcd={4,16,0};

rom struct Tmenu
{
       rom u8  messagem[17];
       rom u8  numero_filhos;
       rom struct Tmenu* no;
       void (*event_enter)(void);
       void (*event_select)(void);
};
u8 count_numero_filhos=0;
rom struct Tmenu Menu[]={{"PRINCIPAL MENU",6,NULL,NULL,NULL},//0
                         {"*TERMINAL VENDA*",0,&Menu[0],NULL,NULL},//1
                         {" Consultar     ",4,&Menu[0],NULL,NULL},//2
                         
                            {"*MENU CONSULTA*",0,&Menu[2],NULL,NULL},
                              {" Matricula:   ",4,&Menu[2],NULL,NULL},
                             
                                  {"*MENU MATRICULA*",0,&Menu[4],NULL,NULL},
                                  {" Setor:     ",0,&Menu[4],NULL,NULL},
                                  {" Identidade:",0,&Menu[4],NULL,NULL},
                                  {" Voltar    :",0,&Menu[4],NULL,NULL},
                                 
                            {" Credito:     ",0,&Menu[2],NULL,NULL},
                            {" Sair   :     ",0,&Menu[2],NULL,NULL},
                           
                         {" Inserir Cred. ",4,&Menu[0],NULL,NULL},
                            {"*MENU IN CREDITO",0,&Menu[11],NULL,NULL},
                            {" Credito Atual: ",0,&Menu[11],NULL,NULL},
                            {" Novo Credito : ",0,&Menu[11],NULL,NULL},
                            {" Sair:          ",0,&Menu[11],NULL,NULL},
                   {" Configuracao   ",0,&Menu[0],NULL,NULL},
                   {" Configur Relogi",0,&Menu[0],NULL,NULL},
                         {" Sair           ",0,&Menu[0],NULL,NULL},

                       };                               
                                                           
rom struct Tmenu *pai=&Menu[0];
rom struct Tmenu *filho=NULL;
rom struct Tmenu *find_data=NULL;


rom struct Tmenu* next_filho(rom struct Tmenu *pai)
{
   while(find_data!=NULL)
   {
      find_data++;                 
      if(find_data->no==pai)return find_data;
   }       
}
rom struct Tmenu* back_filho(rom struct Tmenu *pai)
{
   while(find_data!=NULL)
   {
      find_data--;
      if(find_data->no==pai)return find_data;
   }       
}

void refresh_menu(void)
{
u8 count=0;
   
   lcd_escreve('\f');
   lcd_pos_xy(1,1);
   slcd.set_pos=0;
   for(;count<pai->numero_filhos;count++)
   {
     filho=next_filho(pai);
    slcd.set_pos++;
    if(slcd.set_pos>slcd.linha)break;
    lcd_pos_xy(1,slcd.set_pos);
     lcd_escreve_rom(filho->messagem);
   }
    count_numero_filhos=1;
   slcd.set_pos=2;
   lcd_pos_xy(1,2);
   lcd_escreve('>');
}

void menu_enter(void)
{
    if(filho->numero_filhos!=(u8)0)
    {
        pai=filho;
        find_data=pai;
        refresh_menu();
        find_data=pai;
        next_filho(pai);
        filho=next_filho(pai);
     }
}
void menu_up(void)
{
   if(count_numero_filhos==(u8)1)return;
   filho=back_filho(pai);
   count_numero_filhos--;
   slcd.set_pos--;

   if(slcd.set_pos>(u8)1)
   {
    lcd_pos_xy(1,slcd.set_pos+1);lcd_escreve(' ');
    lcd_pos_xy(1,slcd.set_pos);
    lcd_escreve('>');
   }else
      {
         slcd.set_pos=2;
         lcd_pos_xy(1,slcd.set_pos);
         lcd_escreve_rom(filho->messagem);
         lcd_pos_xy(1,slcd.set_pos);
         lcd_escreve('>');

         lcd_pos_xy(1,3);
         filho=next_filho(pai);
         lcd_escreve_rom(filho->messagem);
         lcd_pos_xy(1,4);
         filho=next_filho(pai);
         lcd_escreve_rom(filho->messagem);
         back_filho(pai);      
         filho=back_filho(pai);

      }
}
void menu_down(void)
{
rom struct Tmenu *filho_temp=NULL;

     if(count_numero_filhos==(pai->numero_filhos-1))return;
     
     slcd.set_pos++;
    count_numero_filhos++;
    filho=next_filho(pai);
     if(slcd.set_pos<=slcd.linha)
    {
       lcd_pos_xy(1,slcd.set_pos-1);lcd_escreve(' ');
       lcd_pos_xy(1,slcd.set_pos);
       lcd_escreve('>');
    }else
       {
         slcd.set_pos=4;
         lcd_pos_xy(1,slcd.linha);
         lcd_escreve_rom(filho->messagem);
         lcd_pos_xy(1,slcd.linha);
         lcd_escreve('>');
         filho_temp=back_filho(pai);
         lcd_pos_xy(1,3);
         lcd_escreve_rom(filho_temp->messagem);
         filho_temp=back_filho(pai);
         lcd_pos_xy(1,2);
         lcd_escreve_rom(filho_temp->messagem);
         next_filho(pai);
         next_filho(pai);
       }
     
     
}
void menu_back(void)
{
     if(pai->no!=NULL)pai=pai->no;
     else {find_data=filho; return;}
     find_data=pai;
     refresh_menu();
     find_data=pai;
     next_filho(pai);
     filho=next_filho(pai);
}
void menu_init(void)
{
      find_data=pai;
      refresh_menu();   
      find_data=pai;
      next_filho(pai);
      filho=next_filho(pai);
}
void setup_timer0(void)
{
   INTCON=0xF0;
   T0CON=0XC5;
   INTCONbits.TMR0IE=0;
}

void setup_timer1(void)
{
   T1CON=0xB5;
   TMR1H=0x0B;
   TMR1L=0xE1;
   PIR1bits.TMR1IF=0x00;
   PIE1bits.TMR1IE=0x01;
   INTCON2=0xB5;
   DDRBbits.RB0=1;
}
void setup_analogico(void)
{
   ADCON0=0;
   ADCON1=0x0F;
   CMCON=0x07;
}


void main(void)
{



/***** INICIALIZAÇÃO DOS PERIFERICOS EXTERNOS******/
   drv_keyboard_init();
   drv_init_ext_eeprom();
   drv_lcd_ini();
   lcd_escreve('\f');
   menu_init();
/***** INICIALIZAÇÃO DOS PERIFERICOS INTERNOS******/   
    setup_timer0();
   setup_timer1();
   setup_analogico();
   OpenRB0INT( PORTB_CHANGE_INT_ON & FALLING_EDGE_INT);

   for(;;)
   {

      if(flg_key_down==TRUE)
      {
         flg_key_down=FALSE;
         switch(bufferkey[0])
         {
            case 'E': menu_enter();
                    break;

            case up : menu_up();//menu_up();
                    break;

            case down: menu_down();
                     break;

            default: menu_back();break;
   
         }

      }

//      task_app();
      task_keyboard();
   }
}

MensagemEnviado: 10 Ago 2009 18:20
por xultz
Coloca o código fonte entre tags Code (tem o botãozinho code acima na hora de entrar a mensagem) assim ele mantém as identações e não coloca smiles no código.

MensagemEnviado: 10 Ago 2009 22:44
por HC908
xultz escreveu:Coloca o código fonte entre tags Code (tem o botãozinho code acima na hora de entrar a mensagem) assim ele mantém as identações e não coloca smiles no código.



esta ai conforme orientado

MensagemEnviado: 11 Ago 2009 22:02
por HC908
bom pessoal aceito criticas e sugestoes relacionao a arvore menu.

MensagemEnviado: 12 Ago 2009 00:01
por tcpipchip
HC

Gostei do ver a sua Alocação Dinâmica :)

Parabens!

TCPIPCHIP

MensagemEnviado: 12 Ago 2009 09:23
por HC908
obg. mestre. Aceito sugestões dos amigos do forum.

MensagemEnviado: 23 Ago 2009 22:33
por malaquias
Qual compilador você usa?

MensagemEnviado: 24 Ago 2009 09:29
por HC908
C18

MensagemEnviado: 24 Ago 2009 10:02
por Ander_sil
Legal sua implementação, ainda não analizei, sabe como é tenho que me concentrar hehe...

Mas tem esse link que achei legal, usa com display grafico de celular Nokia 6100.

A implementação do menu achei bem legal vale a pena dar uma analizada, foi compilada no C18.

http://reifel.org/PICUserInterface/

falow!!!

MensagemEnviado: 24 Ago 2009 10:57
por HC908
achei legal. VALEUUUUUUUUUU;.