menu

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

menu

Mensagempor fernandor » 31 Mar 2009 09:14

to tentando fazer um menu e um lcd da seguinte forma.

quando o programa entrar no laco while este chama uma funcao chamada menu e apos ler uma tecla este sai da funcao menu para o laco while..

o codigo fonte que estou tentando implementar é:

#include <16F877.h>
#use delay(clock=4000000)
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP,NOBROWNOUT
#include <ds1307.c>
#include <flex_lcd420.c>
#include <flex_kbd.c>

char menu(byte sec,int antigo,int status,char k){



kbd_init();
port_b_pullups(TRUE);

sec=read_ds1307(0);
delay_ms(100);
if (antigo != sec){
lcd_gotoxy(1,1);
printf(lcd_putc,"%2X",sec);
delay_ms(100);
lcd_gotoxy(1,2);
printf(lcd_putc,("1 - A"));
lcd_gotoxy(1,3);
printf(lcd_putc,("2 - B"));
delay_ms(100);
lcd_gotoxy(1,4);
printf(lcd_putc,("3 - C"));
antigo = sec;
}


while (true){
k = kbd_getc();
}

return (k);
}



void main() {
char k,sair;
byte hora,min,sec,dia,mes,ano;
int status = 1;
byte antigo = 0;
kbd_init();
port_b_pullups(TRUE);
lcd_init();
delay_ms(200);
init_ds1307();
sec=write_ds1307(0,0x00);


while (1)
{
menu(sec,antigo,status,k);


printf(lcd_putc,"ESCOLHEU OPCAO : %c",k); // estou colocando isso so para ver se esta retornando k
}
}

obrigado

Fernando
fernandor
Bit
 
Mensagens: 29
Registrado em: 12 Mar 2009 15:01

mais simples

Mensagempor fernandor » 31 Mar 2009 18:09

pessoal...gostaria de fazer esse codigo retornar o valor lido K para a funcao main.
Nao estou conseguindo ler o valor de k

#include <16F877.h>
#use delay(clock=4000000)
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP,NOBROWNOUT
#include <ds1307.c>
#include <flex_lcd420.c>
#include <flex_kbd.c>

char menu(){

char k;

lcd_gotoxy(1,2);
printf(lcd_putc,("1 - A"));
lcd_gotoxy(1,3);
printf(lcd_putc,("2 - B"));
delay_ms(100);
lcd_gotoxy(1,4);
printf(lcd_putc,("3 - C"));

while (true){
k = kbd_getc();
if (k=='1'){
}
}
return (k); //retornar k para a funcao main
}

void main() {

kbd_init();
port_b_pullups(TRUE);
lcd_init();
delay_ms(200);

while (1)
{
menu();

}

}
fernandor
Bit
 
Mensagens: 29
Registrado em: 12 Mar 2009 15:01

Mensagempor fabim » 31 Mar 2009 18:51

while (true){ // ENQUANTO VERDADEIRO O QUE ?
k = kbd_getc();
if (k=='1'){
}
}
return (k); //retornar k para a funcao main
}


**************
while (!kbd_getc(); //ENQUANTO NÃO CHEGA NADA
k = kbd_getc();//CHEGOU K = DADO SERIAL
return (k); //retornar k para a funcao main

NÃO SEI EXATAMENTE O QUE É ESSE kbd_getc(); , MAIS A LÓGICA SERIA +/- ISSO..
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 KILB » 31 Mar 2009 20:47

Opa,

Tenta este aqui:

Menu.c


////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///// MENU CON 3 BOTONES (T.OK, T.MAS, T.MENOS) /////
///// /////
///// En este programa se muestra el funcionamiento de un menú controlable /////
///// mediante tres pulsadores, tecla ok, tecla mas, tecla menos;Se accede /////
///// al menú atraves de la interrupción en la pata RB0(T.OK), y se sale /////
///// de el seleccionando la opción 0, o habiendo transcurridos 5 segundos /////
///// sin pulsar ninguna tecla.Se acompaña de una simulación en Proteus /////
///// para mostrar su funcionamiento, en condiciones normales no haría /////
///// falta utilizar el WDT, pero si para su correcto funcionamiento en /////
///// Proteus /////
///// /////
///// por: Jaime Fernández-Caro Belmonte /////
///// /////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
#include <18F2520.h>

#fuses WDT1024, XT, NOPROTECT, BROWNOUT, BORV45, NOPUT, NOCPD
#fuses NOSTVREN, NODEBUG, NOLVP, NOWRT, NOWRTD, NOIESO, NOFCMEN, NOPBADEN
#fuses NOWRTC, NOWRTB, NOEBTR, NOEBTRB, NOCPB, NOLPT1OSC, MCLR, NOXINST

#use delay(clock=4000000)

#byte pb =0xF81
#bit t_ok =pb.0 // RB0, pin21
#bit t_mas =pb.1 // RB1, pin22
#bit t_mns =pb.2 // RB2, pin23

#byte intcon =0xFF2
#bit intf =intcon.1

#include <lcd420.h>
#include <menu.h>

void main()
{
port_b_pullups(true);
setup_adc_ports(NO_ANALOGS);

setup_wdt(WDT_ON);

lcd_init();

intf=0;
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);

while(true)
{
restart_wdt();

lcd_gotoxy(1,1);
printf(lcd_putc,"Prueba Menu");
}
}



Menu.h


////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///// MENU CON 3 BOTONES (T.OK, T.MAS, T.MENOS) /////
///// /////
///// En este programa se muestra el funcionamiento de un menú controlable /////
///// mediante tres pulsadores, tecla ok, tecla mas, tecla menos;Se accede /////
///// al menú atraves de la interrupción en la pata RB0(T.OK), y se sale /////
///// de el seleccionando la opción 0, o habiendo transcurridos 5 segundos /////
///// sin pulsar ninguna tecla.Se acompaña de una simulación en Proteus /////
///// para mostrar su funcionamiento, en condiciones normales no haría /////
///// falta utilizar el WDT, pero si para su correcto funcionamiento en /////
///// Proteus /////
///// /////
///// por: Jaime Fernández-Caro Belmonte /////
///// /////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

void menu_uno(void);
void menu_dos(void);
void menu_tres(void);

static unsigned int8 testado, i, tok, tmas, tmns;

#INT_EXT
menu()
{
disable_interrupts(GLOBAL);
disable_interrupts(INT_EXT);
delay_ms(300);
testado=0;
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("1 Opcion Uno");
lcd_gotoxy(1,2);
lcd_putc("2 Opcion Dos");
lcd_gotoxy(1,3);
lcd_putc("3 Opcion Tres");
lcd_gotoxy(1,4);
lcd_putc("OPCION :");
for(i=0;i!=255;i++) // 5 segundos para pulsar alguna tecla
{
delay_ms(20);

restart_wdt();

lcd_gotoxy(11,4);
printf(lcd_putc,"%u",testado);
if (!t_ok){delay_ms(300); break;}
else if (!t_mas){i=0; delay_ms(300); testado++; if(testado>3){testado=0;};}
else if (!t_mns){i=0; delay_ms(300); testado--; if(testado==255){testado=3;};}
};
if(testado==0) // si la opcion seleccionada es la 0, salimos del menú
{
intf=0;
enable_interrupts(GLOBAL);
enable_interrupts(INT_EXT);
lcd_putc("\f");
break;
}
else if(testado==1){menu_uno(); lcd_putc("\f");}
else if(testado==2){menu_dos(); lcd_putc("\f");}
else if(testado==3){menu_tres(); lcd_putc("\f");}
}


////////////////////////////////////////////////////////////////////////////////
// Submenu 1
//
///////////////////////////////////////////////////////////////////////////////

void menu_uno(void)
{
restart_wdt();

lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("Opcion1 Seleccionada");

delay_ms(2000);

intf=0;
enable_interrupts(GLOBAL);
enable_interrupts(INT_EXT);
}


////////////////////////////////////////////////////////////////////////////////
// Submenu 2
//
///////////////////////////////////////////////////////////////////////////////

void menu_dos(void)
{
restart_wdt();

lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("Opcion2 Seleccionada");

delay_ms(2000);

intf=0;
enable_interrupts(GLOBAL);
enable_interrupts(INT_EXT);
}


////////////////////////////////////////////////////////////////////////////////
// Submenu 3
//
///////////////////////////////////////////////////////////////////////////////

void menu_tres(void)
{
restart_wdt();

lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("Opcion3 Seleccionada");

delay_ms(2000);

intf=0;
enable_interrupts(GLOBAL);
enable_interrupts(INT_EXT);
}


Faça o projeto no MPLab e teste tambem no Proteus, e se servir é só correr pro abraço.


Valeu :P
VENDO BRASILIA 78 - AZUL CALCINHA - RODA GAIUCHA, PNEU TALA LARGA E TOCA FITA RODSTAR, TRATAR NO BUTECO
KILB
Byte
 
Mensagens: 103
Registrado em: 17 Fev 2007 21:52

menu

Mensagempor fernandor » 01 Abr 2009 06:58

muuuuito obrigado pelo arquivo...

gostaria de saber porque no codigo abaixo nao esta retornando a variavel x para o laco while da funcao main...

obrigado



#include <16F877.h>
#use delay(clock=4000000)
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP,NOBROWNOUT
#include <ds1307.c>
#include <flex_lcd420.c>
#include <flex_kbd.c>



char menu(){

char x;
lcd_gotoxy(1,2);
printf(lcd_putc,("1 - A"));
lcd_gotoxy(1,3);
printf(lcd_putc,("2 - B"));
delay_ms(100);
lcd_gotoxy(1,4);
printf(lcd_putc,("3 - C"));

while (true){
x = kbd_getc();
if (x=='1'){
break;
}
continue;
}

return (x);
}




void main() {
char x;
kbd_init();
port_b_pullups(TRUE);
lcd_init();
delay_ms(200);

while (1)
{

menu();
printf(lcd_putc,"choice %c", x);
}

}
fernandor
Bit
 
Mensagens: 29
Registrado em: 12 Mar 2009 15:01

Re: menu

Mensagempor fabim » 01 Abr 2009 08:41

fernandor escreveu:muuuuito obrigado pelo arquivo...

gostaria de saber porque no codigo abaixo nao esta retornando a variavel x para o laco while da funcao main...

obrigado



#include <16F877.h>
#use delay(clock=4000000)
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP,NOBROWNOUT
#include <ds1307.c>
#include <flex_lcd420.c>
#include <flex_kbd.c>



char menu(){

char x;
lcd_gotoxy(1,2);
printf(lcd_putc,("1 - A"));
lcd_gotoxy(1,3);
printf(lcd_putc,("2 - B"));
delay_ms(100);
lcd_gotoxy(1,4);
printf(lcd_putc,("3 - C"));

while (true){//////// você esta prendendo o laço eternamente aqui
/////// ele nunca vai sair daqui nem retornar nada
/////// o while deve ser utilizado neste caso, para testar algo
////// e nao para bater um prego na execução
x = kbd_getc();
if (x=='1'){
break;
}
continue;
}

return (x);
}




void main() {
char x;
kbd_init();
port_b_pullups(TRUE);
lcd_init();
delay_ms(200);

while (1)
{

menu();
printf(lcd_putc,"choice %c", x);
}

}
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 xultz » 01 Abr 2009 09:13

Eu não sei o motivo de você ter feito assim, mas somente de o kbg_getc receber um caracter '1' ele vai retornar o carater '1' para main, o que faz do menu algo inutil. Você dá três opções, mas só deixa o usuári usar uma...
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

menu

Mensagempor fernandor » 01 Abr 2009 09:14

muito obrigado fabim...mas como poderia ler uma tecla do teclado sem usar o while??

fernando
fernandor
Bit
 
Mensagens: 29
Registrado em: 12 Mar 2009 15:01

Mensagempor fabim » 01 Abr 2009 09:57

explique exatamente o que você quer fazer, que eu monto a estrutura pro Sr, e comento o porque podi e não podi..

fabim
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!!!?

menu

Mensagempor fernandor » 01 Abr 2009 13:09

seguinte fabim....

chama a funcao menu e escolho uma opcao...... de acordo com a opcao escolhida chama funcao setup...se eu sair da funcao setup eu volto para a funcao menu...

entendeu???

obrigado

fernando
fernandor
Bit
 
Mensagens: 29
Registrado em: 12 Mar 2009 15:01


Voltar para PIC

Quem está online

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

x