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

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

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

Mensagempor HC908 » 10 Ago 2009 15:54

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();
   }
}
Editado pela última vez por HC908 em 10 Ago 2009 22:42, em um total de 5 vezes.
HC908
Byte
 
Mensagens: 248
Registrado em: 26 Mar 2007 09:55

Mensagempor xultz » 10 Ago 2009 18:20

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.
98% das vezes estou certo, e não estou nem aí pros outros 3%.
Avatar do usuário
xultz
Dword
 
Mensagens: 3001
Registrado em: 13 Out 2006 18:41
Localização: Curitiba

Mensagempor HC908 » 10 Ago 2009 22:44

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
HC908
Byte
 
Mensagens: 248
Registrado em: 26 Mar 2007 09:55

Mensagempor HC908 » 11 Ago 2009 22:02

bom pessoal aceito criticas e sugestoes relacionao a arvore menu.
HC908
Byte
 
Mensagens: 248
Registrado em: 26 Mar 2007 09:55

Mensagempor tcpipchip » 12 Ago 2009 00:01

HC

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

Parabens!

TCPIPCHIP
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Mensagempor HC908 » 12 Ago 2009 09:23

obg. mestre. Aceito sugestões dos amigos do forum.
HC908
Byte
 
Mensagens: 248
Registrado em: 26 Mar 2007 09:55

Mensagempor malaquias » 23 Ago 2009 22:33

Qual compilador você usa?
malaquias
Bit
 
Mensagens: 5
Registrado em: 01 Dez 2006 23:43

Mensagempor HC908 » 24 Ago 2009 09:29

C18
HC908
Byte
 
Mensagens: 248
Registrado em: 26 Mar 2007 09:55

Mensagempor Ander_sil » 24 Ago 2009 10:02

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!!!
Anderson Chrispim da Silva
chrispimdasilva@gmail.com
Ander_sil
Byte
 
Mensagens: 368
Registrado em: 30 Out 2006 09:58
Localização: Campinas - SP

Mensagempor HC908 » 24 Ago 2009 10:57

achei legal. VALEUUUUUUUUUU;.
HC908
Byte
 
Mensagens: 248
Registrado em: 26 Mar 2007 09:55


Voltar para PIC

Quem está online

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

x