Página 1 de 5
Dúvida Subrotina

Enviado:
02 Dez 2009 23:20
por gilliard
Eu fiz uma subrotina, que é chamada dentro do void main, eu gostaria que ao terminar de executar, ela automaticamente retorne ao void main, qual a solução ?!?!?
- Código: Selecionar todos
void lcd(){
Lcd_custom_cmd(LCD_CLEAR);
Lcd_custom_cmd(LCD_CURSOR_OFF);
Lcd_Custom_out(1,2,"Seja Bem Vindo");
Delay_ms(500);
}
Valew

Enviado:
03 Dez 2009 02:16
por Sergio38br
Se vc imaginar que o que esta dentro de void main() é todo o seu programa , onde mesmo que vc quer retornar??Se for para o ponto de onde vc chamou a rotina, basta um return.
[ ]`s
Sergio

Enviado:
03 Dez 2009 07:28
por gilliard

Opa
Sérgio38br, beleza !!!!
Cara, então .... Dentro do void main eu chamei a rotina lcd(); dai eu queria, que quando terminar de executar a rotina com o delay que eu estipulei ai, voltasse pra dentro do void main !!!!
Então ficaria assim ?!?!?
- Código: Selecionar todos
void lcd(){
Lcd_custom_cmd(LCD_CLEAR);
Lcd_custom_cmd(LCD_CURSOR_OFF);
Lcd_Custom_out(1,2,"Seja Bem Vindo");
Delay_ms(500);
return;
}

Enviado:
03 Dez 2009 07:48
por proex
A função void lcd() esta dentro do Main?

Enviado:
03 Dez 2009 07:56
por gilliard
A subrotina lcd() esta fora do void main, mas dentro do void main, tem uma chamada para a subrotina lcd().
Eu gostaria que após terminar de executar, volte a rodar oque esta dentro do void main.
Obrigado proex !!!!

Enviado:
03 Dez 2009 08:35
por proex
Entao o problema deve ser outro pois quando vc fecha a chave na funçao LCD, o complilador automaticamente sabe que tem que retornar para o Main.
.

Enviado:
03 Dez 2009 08:44
por Jozias del Rios
Para que ponto do "void main" você deseja que lcd() retorne??

Enviado:
03 Dez 2009 08:55
por gilliard
Então... Faz de conta que o programa é esse ... Vamos simular uma situação aqui, não vou configurar lcd, nem nada, é só para simular mesmo, ok.
Imagina assim:
1- O Void Main inicio
2- O LED fica piscando por 1 segundo
3- Dai chama a rotina LCD();
4- O LCD exibe
Seja Bem Vindo, por 500 milisegundos
5- Acabou os 500 ms, então volta ao
Void Main, e começa tudo de novo....
- Código: Selecionar todos
void lcd(){
Lcd_custom_cmd(LCD_CLEAR);
Lcd_custom_cmd(LCD_CURSOR_OFF);
Lcd_Custom_out(1,2,"Seja Bem Vindo");
Delay_ms(500);
}
// ********** Programa principal **********//
void main (){
trisb = 1;
portb = 1;
portb.f7 =~ portb.f7;
delay_ms(1000);
lcd();
}
Deve ser simples, mas eu estou apanhando aqui. rrssss

Enviado:
03 Dez 2009 08:57
por Jozias del Rios
Altere:
- Código: Selecionar todos
void lcd(){
Lcd_custom_cmd(LCD_CLEAR);
Lcd_custom_cmd(LCD_CURSOR_OFF);
Lcd_Custom_out(1,2,"Seja Bem Vindo");
Delay_ms(500);
}
// ********** Programa principal **********//
void main ()
{
while (1)
{
trisb = 1;
portb = 1;
portb.f7 =~ portb.f7;
delay_ms(1000);
lcd();
};
}

Enviado:
03 Dez 2009 09:46
por gilliard
Então.... A rotina lcd() é chamada em varias partes do programa, as vezes é chamada em subrotinas, as vezes no void main, etc....
Eu precisaria achar uma solução, para inserir dentro da própria subrotina lcd(), assim, independente da onde ela for chamada, ela sempre volta para o void main, tem como fazer isso ?!?!?

Enviado:
03 Dez 2009 09:50
por Jozias del Rios
Não. Você quer quebrar a estrutura básica de um programa em C: sua compartimentação em funções.
Tem outro jeito de fazer o que vc precisa.
Mas basicamente, se o main() chama subrotinas, e estas chamam o lcd(), então quando o lcd() retornar, as subrotinas devem retornar ao main()

Enviado:
03 Dez 2009 10:05
por gilliard
Não, é assim amigo......
É tudo por if else, então dependendo do que acontecer dentro do void main, ou ela chama o lcd(), ou ela chama uma outra subrotina, tipow teclado(), dai dentro do teclado, dependendo do que eu apertar chama a mesma rotina lcd(), não é infinito, entendeu ???
Tudo depende do que eu fizer, ela não fica chamando, chamando chamando infinitamente, entendeu ?!?!?
Apenas preciso fazer o lcd() terminar de executar, e voltar para o void main, só isso... rssss de resto, me viro aqui......

Enviado:
03 Dez 2009 10:15
por Jozias del Rios
então, as subrotinas, por exemplo teclado() e porta() devem retornar ao main(), assim:
- Código: Selecionar todos
void lcd()
{
print_lcd( /* atualiza lcd */ );
}
void teclado()
{
char c = getch();
if (c == 27)
{
lcd();
}
else
{
print_lcd( c );
}
}
void porta()
{
if ( /* analisa a porta */ )
{
lcd();
}
}
void main()
{
/* setup */
while (1)
{
if ( teclado_tem_tecla() )
teclado();
if ( porta_mudou() )
porta();
delayms(1000);
lcd();
}
}
Perceba que as subrotinas teclado() e porta() ao acabarem retornam à quem as chamou, que foi o main(). O lcd() também é uma subrotina, e também retorna a quem a chamou, que pode ser o main(), pode ser o teclado() ou pode ser o porta().

Enviado:
03 Dez 2009 10:21
por fabim
void lcd_giliard(char *text){
}
void main(void){
while(1){
Seu programa aqui dentro.
}
}
O menininho complicado.
Veja que a sub rotina fica sobre o main certo ?
Suponha que dentro do main onde chama a rotinha.
if(butão 1){
lcd_giliard("complicado eim ?);
}else{
lcd_giliard("não precionado!);}
Observe esta sentença...
Quando o compilador enxergar o comando lcd_giliard, ele sabe que é uma chamada de sub rotina, ele vai dar o call a rotina, e quando a rotina acabar ou seja quando fazer tudo que tem que fazer.
Ele retorna para a linha que a chamou + 1.
Se for uma sentença conforme coloquei a cima, o compilador se vira, pra sair da sentença e fazer o que esta abaixo dela..
Agora, se quer chamar o lcd_giliard() e quando acabar ela voltar direto pra cá.
void main(void){
""""""""""aqui""""""""""
E não la linha abaixo ou sentença abaixo, a qual chamou o lcd_giliard ......
aí depende apenas do seu raciocinio.
Lembre-se que em linguagem de alto nivel, não é bom perder endereço de retorno e ser reescrito!!
Isto pode causar estouro da stack, pois ao gar um GOTO main tu não retornou uma casa de stack, e isto vai até estourar!!
Em asm não tem este problema, principalmente nos 12F e 16F..
Te aconselho,,,,
void main(void){
inicio: // isto é um label!!!!
X
X
X
X
X
X
X
X
if(tale e coisa coisa e tale){
lcd_giliard();
}
if(flag setado pela rotina lcd_giliard() )
_asm goto inicio;
E assim por diante!!
Adios Amigos !!

Enviado:
03 Dez 2009 11:08
por gilliard
Obrigado pelo " complicado " Fabim hehehehehe realmente sou mesmo rrssss
Então... Isso que vocês tão fazendo, e me explicando, eu ja fiz varias vezes, mas o problema, não é chamar a subrotina .....
O problema é que quando a subrotin lcd (), FAZ TUDO QUE TEM QUE FAZER, ele não esta voltando para o VOID MAIN, entendeu ?!?!?
Esse é meu unico problema.