Ir ao conteúdo
  • Cadastre-se

Apertar botao e incrementar apenas 1 vez a variavel


arh

Posts recomendados

boa noite, to brincado aqui com o lcd, quero colocar ele pra rolar de um lado pro outro apertando 2 botão, o problema é que apos apertar o botao, a variavel esta sendo incrementada aos monte, fazendo o nome correr para o lado ou para o outro.

 #include <16f628a.h>
#fuses intrc_io, nomclr, nowdt
#use delay (clock = 4000000)



#use fast_io (a)
#use fast_io (
#include <lcd_flex.c>


int x;
void main ()
{
set_tris_a (0b1100000);
set_tris_b (0x00);
setup_comparator (nc_nc_nc_nc);
lcd_init ();

while (true)
{


if (input(pin_a6) == 0) // apertando botao 1 incrementa x
{delay_ms(10);
if (input(pin_a6) == 0)
x = x+1;
lcd_putc ("\f");
}



if (input(pin_a7) == 0) // apertando botao 2 decrementa x
{delay_ms(10);
if (input(pin_a7) == 0)
x = x-1;
lcd_putc ("\f");
}


lcd_gotoxy (x,1);
lcd_putc ("ola mundo");
delay_ms (1);



}
}

Link para o comentário
Compartilhar em outros sites

deu certinho mateus, coloque pra 75 ai melhoro, ai coloquei em 100 e ficou perfeito. o problema agora é fazer um que mesmo com o botao pressionado ele so incremente uma vez

uai, sumiu aquele opção de "resposta util"

tive uma ideia, vou criar uma variavel booleana, e incrementar e decrementar ela.

Link para o comentário
Compartilhar em outros sites

Editando: Escrevi bobagem antes.

Para você segurar o botao e ele incrementar uma única vez, faça assim:

if (input(pin_a6) == 0) // apertando botao 1 incrementa x{x = x+1;lcd_putc ("\f");do {}while (input(pin_a6));}

O marcado em vermelho que faz isso que você quer. Aí nem precisa mais de delay.

Devem ter desativado a mao verde....

Falou
Link para o comentário
Compartilhar em outros sites

if (input(pin_a6) == 0)   // apertando botao 1 incrementa x
{
x = x+1;
lcd_putc ("\f");

[B][COLOR="Red"]do {}
while (input(pin_a6));[/COLOR][/B]
}

MatheusLPS, gostei dessa parada do

do {}

while (input(pin_a6));

Como isso funciona mesmo?

Sei que Do While seria mais ou menos testar a condição ao final, executando ela pelo menos uma vez. Mas nesse caso ai ele vai incrementar a variável e depois..... ?

Fiquei meio confuso ai no DO{} sem nada dentro

E o while (input(pin_a6)) ele testa se a tecla tá apertada e depois? faz o que?

Comenta essa parte de báixo do código ai, quero usar essas instruções em meus códigos, não gosto muito de delays.

Pode usar essas instruções em vários locais de um código?

Só aproveitando aqui a dúvida, qual o delay mínimo que tenho que colocar numa conversão A/D?

Falou

Link para o comentário
Compartilhar em outros sites

bom dia senhores rs.

bom, tentei aqui usar o

 if (input(pin_a6) == 0)   // apertando botao 1 incrementa x
{
x = x+1;
lcd_putc ("\f");

do {}
while (input(pin_a6));
}

e nao funcionou, nao esta dando um disparo por vez.

Agora conseguiiiiiiiiiiii, hehehe, o codigo é o mesmo so falto uma coisinha

fiz assim aqui e deu certo, fico assim

  do {}
while (input(pin_a6) == 0 )

== 0

valeu MatheusLPS

segue como ficou meu codigo pra mover caractere no display lcd

#include <16f628a.h>
#fuses intrc_io, nomclr, nowdt
#use delay (clock = 4000000)



#use fast_io (a)
#use fast_io (
#include <lcd_flex.c>

int x=1;
void main ()
{
set_tris_a (0b11100000);
set_tris_b (0x00);
setup_comparator (nc_nc_nc_nc);
lcd_init ();

while (true)
{

if (input(pin_a6) == 0) // apertando botao 1 incrementa x
{
x = x+1;
lcd_putc ("\f");
if(x>=8) x = 8;

do { }
while (input(pin_a6) == 0);
}



if (input(pin_a7) == 0) // apertando botao 2 decrementa x
{
x = x-1;
lcd_putc ("\f");
if(x<=1) x=1;

do { }
while (input(pin_a7) == 0);
}



lcd_gotoxy (x,1);
lcd_putc ("ola mundo");
delay_ms (1);



}
}

*************************************************************************

Link para o comentário
Compartilhar em outros sites

MatheusLPS, gostei dessa parada do

do {}

while (input(pin_a6));

Como isso funciona mesmo?

Só aproveitando aqui a dúvida, qual o delay mínimo que tenho que colocar numa conversão A/D?

Falou

A estrutura de repetição DO WHILE parte do princípio de que deve-se fazer algo primeiro e só depois comparar uma variável para saber se o loop será executado mais uma vez.

Nesse caso, queremos evitar que o incremento da variável ocorra mais de uma vez.

Bom, no início do bloco ele já começa assim:

if (input(pin_a6) == 0)

Ele testa para ver se a entrada é zero e entra no bloco de comandos incrementando a variável e logo em seguida vai para o do{} uma vez e testa logo em baixo de novo com if (input(pin_a6) == 0) *** Veja abaixo que eu fiz errado acima.

Se a tecla continua apertada ele volta no do {}. Ou seja, ele não faz nada. O programa fica travado enquanto a entrada for zero (nesse caso).

Só aproveitando aqui a dúvida, qual o delay mínimo que tenho que colocar numa conversão A/D?

Na verdade, você não precisa de delay. Mas o conversor AD tem um tempo mínimo para executar a conversão. Está no datasheet como título de A/D Acquisition Requirements

Lá ele explica exatamente como calcular o tempo (normalmente 16uS). Nesse caso, você precisa configurar o AD de acordo com o clock do PIC. Exemplo do datasheet do 16F877X:

tabala_AD_tempo_16F877.png

Aí lá no CCS, temos as seguintes opções de configuração da velocidade de conversao do AD:

////////////////////////////////////////////////////////////////// ADC
// ADC Functions: SETUP_ADC(), SETUP_ADC_PORTS() (aka SETUP_PORT_A),
// SET_ADC_CHANNEL(), READ_ADC()
// Constants used for SETUP_ADC() are:
#define ADC_OFF 0 // ADC Off
#define ADC_CLOCK_DIV_2 0x10000
#define ADC_CLOCK_DIV_4 0x4000
#define ADC_CLOCK_DIV_8 0x0040
#define ADC_CLOCK_DIV_16 0x4040
#define ADC_CLOCK_DIV_32 0x0080
#define ADC_CLOCK_DIV_64 0x4080
#define ADC_CLOCK_INTERNAL 0x00c0 // Internal 2-6us

Aí você escolhe e acordo com o cristal.

bom dia senhores rs.

nao funcionou, nao esta dando um disparo por vez.

Agora conseguiiiiiiiiiiii, hehehe, o codigo é o mesmo so falto uma coisinha

fiz assim aqui e deu certo, fico assim

  do {}
while (input(pin_a6) == 0 )

== 0

Me desculpe colega arh. Só percebi esse meu erro hoje depois de ver sua resposta. Mas você pegou o jeito e corrigiu.

Errei pois não costumo usar a condição if (input(pin_a6) == 0).

Uso a if (!input(pin_a6))

Viu a exclamaçao ali? Ela substitui o zero. :D

Se fosse para substituir if (input(pin_a6) == 1) só colocar if (input(pin_a6)) que o compilador já entende.

Resumindo:

if (input(pin_a6)) -------> Testa se o pino está em nível lógico alto.

if (!input(pin_a6)) -------> Testa se o pino está em nível lógico baixo.

Falou

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!