- 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();
}
}