Página 1 de 1
Como fazer uma rotina para botão?

Enviado:
28 Jun 2008 15:58
por alexhnunes
Caros amigos, tenho desenvolvido alguns programas no MikroC e tenho gostado muito, tenho tido muito menos problemas do que quando fazia com o CCS, além de ser uma linguagem mais fácil e objetiva (pelo menos para mim). Quando incluo acionamento de botão, porém, não estou conseguindo fazer uma rotina em que por exemplo a ação ocorra somente quando eu solto o botão (fazendo com que o desvio da rotina seja feito somente uma vez). O artifício que utilizo é um delay de alguns milissegundos. Porém acontece que, se o tempo em que o botão fica pressionado for maior, a rotina é desviada várias vezes, coisa que eu não desejo em algumas condições. Tenho utilizado alguns flags para habilitar/desabilitar esses desvios, porém sem sucesso. Existe alguma rotina em especial para este caso?

Enviado:
28 Jun 2008 16:39
por fabim
use a função test button(porta,bit,tempo em ms);
Se o botão precionado => tempo, entra
{ enquanto botão precionado nop;
soltou botão FAZ {
}
}

Enviado:
28 Jun 2008 20:08
por alexhnunes
Seria este exemplo do Help?
do {
if (Button(&PORTB, 0, 1, 1)) oldstate = 1; *****
if (oldstate && Button(&PORTB, 0, 1, 0)) {
PORTD = ~PORTD;
oldstate = 0;
}
} while(1);
Onde **** ==> unsigned short Button(unsigned short *port, unsigned short pin, unsigned short time, unsigned short active_state);
Estou perguntando porque usei exatamente esta função q vc sugeriu, "test button(porta,bit,tempo em ms); ", porém o programa não aceitou a palavra "test".

Enviado:
29 Jun 2008 00:22
por fabim
intão amigo, é esse exemplo mesmo..
Mais raciocine o seguinte, conforme a função que voce adentra com este teste, pode ser tão rapido que você ainda não soltou o botão e ela ja voltou de novo... agora observe o seguinte"não programop em c" o exemplo que eu vou colocar e tente compreender como ele funca.
if (Button(&PORTB, 0, 1, 1)) {//pressionou por 1ms, passou no teste condicional
while portb,0=0 do{ nop; } // enquanto precionado fica preso
soltou o botão FAZ o que esta daqui pra baixo.
}
No pascal eu so faço assim ó.
IF TESTBUTTON(PORTB,0,0,5) THEN
Begin
While (portb,0)=0 do nop; //enquanto precionado faz nada
// soltou botão executa pra baixo..
End;

Enviado:
29 Jun 2008 18:31
por alexhnunes
Ah, sim, entendi. É que eu não sabia que vc utilizava Pascal, eu utilizei o MikroPascal uma vez para programar alguns microcontroladores AVR e vi que existem algumas diferenças na descrição dos comandos em relação ao C.
Quanto ao entendimento do comando, ficou bem mais claro agora...
Muito obrigado, Fabim.

Enviado:
01 Jul 2008 09:47
por lpagano
Outro dia eu fiz o seguinte código, que deu certo e consumiu menos memória:
- Código: Selecionar todos
** EXEMPLO **
// o botão está em RC0 e é ativado colocando esse pino em GROUND
// o pino RC4 indicará se o botão foi ativado ou não
if (PORTC.F0 == 0) { // caso o botão pressionado esteja em RC0
delay_ms(30);
while (PORTC.F0 == 0) { // enquanto o botão estiver pressionado não acontece nada
}
PORTC.F4 = 1; // caso RC0 não esteja mais em 0, RC4 vai para 1
}
O pino RC4 só será ativado quando você soltar o botão.
Isso depende de cada aplicação, mas no meu caso deu certo pois a função Button ocupa muito espaço na memória ROM do PIC.

Enviado:
01 Jul 2008 10:38
por alexhnunes
Lpagano, foi exatamente o que eu fiz além da rotina do botão, agora está funcionando corretamente. Muito obrigado!

Enviado:
01 Jul 2008 10:40
por ze
hitech C zip
- Código: Selecionar todos
while(!RC0);