Ir ao conteúdo
  • Cadastre-se

PIC ligar e desligar led por botao , 5 conjuntos de led


Posts recomendados

ola boa noite, sou novato no site , e estou comecando a aprender sobre programacao pic. e estou precisando de fazer um circuito que um botao ao pressionar acenda o led, e ao pressionar novamente apague o mesmo, ate ai consegui, so que no projeto contem 5 botões e 5 leds um para cada. e nao consegui fazer funcionar, se alguem puder me ajudar agradeco muito.

pic 16f628a. 4mhz

 

 

char variavel = 0; //DECLARA UMA VARIÁVEL DE VALOR 0

void main()
{
  TRISB.B0 = 1;//DEFINE O PINO RB0 COMO ENTRADA
  TRISB.B1 = 0;//DEFINE O PINO RB1 COMO SAÍDA
  PORTB.B1 = 0;//DEFINIMOS UM VALOR INICIAL PARA A SAÍDA RB1 0


        while(1)// LOOP INFINITO OU LAÇO INFINITO
  {
        if (PORTB.B0 == 1)// SE O BOTÃO FOI PRECIONADO
    {
    variavel = 1; //INDICA QUE O BOTÃO FOI PRECIONADO
    }
        if( PORTB.B0 == 0 && variavel == 1)//SOLTEI O BOTÃO
     {
        PORTB.B1 =~ PORTB.B1;//INVERTE O ESTADO DA SAÍDA
        variavel = 0;//VARIAVEL RETORNA AO VALOR 0
    }

   }
}

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

tenta algo como...
 

#define botões (PORTA&0b00011111) //5 botões RA4...0
#define leds PORTB //em RB4...0
//...setup do hw PORTB=saída, PORTA=entrada
while(1)
{
leds^=botões;//só inverte o que estiver em 1
while(~botões);//aperte botão
while(botões);//tira o dedinho do botão (!) ... ou solte o botão (!!)
}

Botões pro vcc com pulldowm 1K ou (-) pro gnd. Claro dá pra inverter se quiser. Tente no proteus. Na prática hás de ser apresentado ao bouncing - repique do botão. Um delay no loop resolve.

 

Digitei sem pensar muito...se é que penso...

  • Haha 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá @welton_udi fiz um micro ajuste e  funcionou sim:
 

#include <pic.h>
__CONFIG( CP_OFF  &  FOSC_INTOSCIO & PWRTE_ON &  WDTE_OFF   & BOREN_ON & MCLRE_OFF & LVP_OFF);

#define botões (PORTA&0b00011111)
#define leds PORTB

void main (void)
{
TRISA=0b11111111;//botões
TRISB=0x00;//leds
CMCON=0xff;//entradas digitais

for(;;)
{
leds^=botões;//só inverte o que estiver em 1
while(botões);//aperte botão
while(!botões);//tira o dedinho do botão (!) ... ou solte o botão (!!)
}

}

Anexo projeto completo com simulação e etc. Adapte pro teu compilador.

abç

 

Pisca5leds.zip

pisca5leds.png

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

muitiiisssimo obrigado,tava estudando um pouco mas e muito complicado rsrsr. o tem muito comando dificeis de interpretar, obrigado..

obrigado.

 

adicionado 1 minuto depois

@Isadora Ferraz  deixa ti fazer mais uma pergunta, o arquivo .hex tem alguma forma de eu ler ele? tipo abrir no proteus pra ver os comandos. eoutra coisa,.se conhecer algum grupo de programacao que aceitem novato . se puder me indicar ti agradeco. 34 99903-6885.

 

obrigado....

Link para o comentário
Compartilhar em outros sites

  • Membro VIP
10 horas atrás, welton_udi disse:

o arquivo .hex tem alguma forma de eu ler ele

Sim você pode carregar no proteus mas sugiro carregar o .cof (também no anexo) pois com ele você vê o código fonte e roda passo a passo através dele.

 

10 horas atrás, welton_udi disse:

pra ver os comandos

os comandos estão todos no .c mas se quiser ir + fundo e ver em assembly você pode recompilar e... peraí.. vou ver se tenho.... ...  depois eu vejo

 

Sorry não conheço tal grupo

abç

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois...

ola boa noite, to fazendo um strobo com 8 leds, e 1 botao, ao apertar o botao ele pisca sequencial da direita pra esquerda, ao apertar de novo pisca da esquerda pra direita, apertando de novo, pisca 2 em 2 por ai. sao 6 tipos diferentes na 7 ele desliga. nao consegui fazer com que o botao mude pro proximo sequencia. tem como me ajudar  , obrigado.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Claro... vejamos...

Use tabela. Algo como
 

unsigned char const tabela_efeito[]=
{
0b10000000, //efeito 1
0b01000000,
0b00100000,
0b00010000,
0b00001000,
0b00000100,
0b00000010,
0b00000001, //a cada 8, próximo efeito:
//esq p dir
0b00000001, 
0b00000010, 
//...
0b10000000,
//...efeito 2
0b11000000,//de 2 em 2
0b00110000, 

//e por aí vai
0b10101010, //efeito x
//...
0b01010101
}

E coloque os dados no port
 

#define numero_de_efeitos 6
unsigned char i=0,n=0;
for(;;)
{
i=0;
while(i++>7)
{
PORTB=tabela_efeito[i+n];//localiza o efeito
delay (1000);//intervalo
if (botao) n+=8;//próximo efeito
if (n>=numero_de_efeitos*8) n=0;//volta no 1º efeito
}
}

Entendeu? Então me explica...

Link para o comentário
Compartilhar em outros sites

ola, agora que confundi tudo mesmo, :tw_astonished:. mas vou tentar entender esse codigo ai, vou tenta joga no mikroc e volto pra ve se consegui entender e por pra funcionar, obrigado.mtos codigos ai num vi nem na apostila que to estudando ainda .

3 horas atrás, Isadora Ferraz disse:

Claro... vejamos...

Use tabela. Algo como
 


unsigned char const tabela_efeito[]=
{
0b10000000, //efeito 1
0b01000000,
0b00100000,
0b00010000,
0b00001000,
0b00000100,
0b00000010,
0b00000001, //a cada 8, próximo efeito:
//esq p dir
0b00000001, 
0b00000010, 
//...
0b10000000,
//...efeito 2
0b11000000,//de 2 em 2
0b00110000, 

//e por aí vai
0b10101010, //efeito x
//...
0b01010101
}

E coloque os dados no port
 


#define numero_de_efeitos 6
unsigned char i=0,n=0;
for(;;)
{
i=0;
while(i++>7)
{
PORTB=tabela_efeito[i+n];//localiza o efeito
delay (1000);//intervalo
if (botao) n+=8;//próximo efeito
if (n>=numero_de_efeitos*8) n=0;//volta no 1º efeito
}
}

Entendeu? Então me explica...

 

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois...

ol boa noite, infelizmente nao consegui entender totalmente o codigo, as tabelas eu entendi mas por pra funcionar, nao deu. eu fiz um de uma outra forma mas nao rodou bem nao,  olha ai

 

#define bot ra0_bit
#define led1 rb0_bit
#define led2 rb1_bit
#define led3 rb2_bit
#define led4 rb3_bit
#define led5 rb4_bit
#define led6 rb5_bit

int x;


void main() {

     trisa = 0b11111111;
     trisb = 0b00000000;
     portb = 0;


while(1)
 {

   
   if(bot==1)
   {
   x=x+1;
   delay_ms(200);

   if(x==1){led6=1;delay_ms(100);
            led5=1;delay_ms(100);
            led4=1;delay_ms(100);
            led3=1;delay_ms(100);
            led2=1;delay_ms(100);
            led1=1;delay_ms(100);
            led6=0;led5=0;led4=0;
            led3=0;led2=0;led1=0;
            delay_ms(200);
            }
   if(x==2){led1=1;delay_ms(100);
            led2=1;delay_ms(100);
            led3=1;delay_ms(100);
            led4=1;delay_ms(100);
            led5=1;delay_ms(100);
            led6=1;delay_ms(100);
            led6=0;led5=0;led4=0;
            led3=0;led2=0;led1=0;
            delay_ms(200);
            }
   if(x==3){led3=1;led4=1;delay_ms(100);
            led2=1;led5=1;delay_ms(100);
            led1=1;led6=1;delay_ms(100);
            led6=0;led5=0;led4=0;led3=0;
            led2=0;led1=0; delay_ms(200);
            }
   if(x==4){led6=1;led4=1;led2=1;delay_ms(200);
            led6=0;led4=0;led2=0;
            led1=1;led3=1;led5=1;delay_ms(200);
            led1=0;led3=0;led5=0;

            }
   if(x==5){led6=1;delay_ms(50);
            led6=0;led5=1;delay_ms(100);
            led5=0;led4=1;delay_ms(100);
            led4=0;led3=1;delay_ms(100);
            led3=0;led2=1;delay_ms(100);
            led2=0;led1=1;delay_ms(100);
            
            led1=0;led2=1;delay_ms(100);
            led2=0;led3=1;delay_ms(100);
            led3=0;led4=1;delay_ms(100);
            led4=0;led5=1;delay_ms(100);
            led5=0;led6=1;delay_ms(100);
            led6=0;
            }
   if(x==6){led1=0;led2=0;led3=0;led4=0;
            led5=0;led6=0;
             x=0;
            }


   }

nao funcionou bem nao , tem hr que aperta nao muda o tipo de piscada.

 

obrigado

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Paulão @aphawk está correto mas vi que você já colocou

12 horas atrás, welton_udi disse:

if(x==6){led1=0;led2=0;led3=0;led4=0;
            led5=0;led6=0;
             x=0;

Mas vai que x cria vida própria e vai a 7 então vai demorar a voltar a ser 6. Por isso eu (eu) gosto de colocar p.ex. if (x>5).

 

você pode ter esquecido de pullup no botão. Publique o circuito... Capacitor no botão cai bem.

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP
3 horas atrás, welton_udi disse:

se você apertar o botao sem ter terminado o delay da sequencial ele nao muda, dai tem que segurar um pouco o botao pra ele mudar

Aí sim amigo. Realmente se estiver dentro do delay ele não lê o botão. Pra contornar isso, uma (01) maneira é :

você deve criar uma interrupção por mudança de estado de pino e dentro dela fazer o x=x+1; e também aguardar a soltura do botão. Assim sendo cada vez que apertar, vai esperar acabar o efeito e partir pro próximo.

 

Vai ter que dar uma estudadela no recurso de interrupt do seu mc ok?

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

pense como o mc. Faz de conta que você é ele. Algo como
 

-preparo o chip
-zero a saída dos leds

->-começo:
^
| espero apertar e soltar o botão
| coloco o próximo padrão de leds na saída
^
|-volto ao começo

Espero não ter que desenhar pois é muito simples. E olha que até fiz pra você

Não desista...

Link para o comentário
Compartilhar em outros sites

@welton_udi ,

 

Bom, algo mais simples do que você usar interrupção seria criar a sua própria rotina de delay um pouco diferente...

 

Por exemplo, em vez de ficar chamando a função Delay() , crie uma função sua, por exemplo delaycomteste(), e dentro dela você fica chamando a função delay() original a cada 5 milissegundos , e faz um teste do botão logo após os 5 milissegundos. Caso o botão tenha sido acionado, você incrementa o X e volta ao seu loop ....

Caso o botão não tenha sido acionado, você repete o delay de 5 milissegundos, e vai fazendo isto até o tempo total ultrapassar o período chamado na função ! Simples....

 

Algo assim :

 

Se você chamar a função desta maneira : delaycomteste(100) ,  vai ocorrer 20 vezes o delay de 5 milissegundos e o teste do botão, e se nada acontecer a função simplesmente termina e retorna sem fazer nada ....

 

Não consigo te ajudar nessa linguagem C, então quem sabe a @Isadora Ferraz dá um esqueleto de código prá você fazer ....

 

Paulo

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

1 hora atrás, Isadora Ferraz disse:

delaycomteste(unsigned char i)
{
while (i--)
	{
	delay(20);
	if (bot==1) return; //se apertar o botão, termina
	}
}

@aphawk me arruma pra cabeça ... literalmente

 

Isso que eu chamo de um código simples e elegante !

 

Mas ainda não vai resolver o problema, o ideal é que esse Return voltasse para o loop do While(1) .... aí sim fica perfeito !

Tem jeito, @Isadora Ferraz ?

 

Ah, e claro, faltou o meu obrigado pela ajuda !

 

Paulo

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

@aphawk confessa vai.. você tem uma quedinha pelo c (linguagem de programação!)

 

47 minutos atrás, aphawk disse:

que esse Return voltasse para o loop do While(1)

de fato ele volta sim. delaycomteste(unsigned char i) é uma função que deve ser colocada dentro do loop de onde não consegue sair. Ou seja o return sai da função e volta pro loop. É como se fosse sua 'interrupção virtual'.....-  inventei isso agora

Perdão se é óbvio d+ mas me deu vontade comentar
 

while(1)
{
delaycomteste(200);//200*5mS = 1segundo
outras_funcoes();
e_etc();
}

em basic me lembro vagamente que era o tal gosub . Sim ja tive queda pelo basic a ponto de ficar a noite no serviço pra concluir trabalhos. O tempo voava. Hormônios à flor da pele.Era um apple alguma coisa. Em casa não tinha computador... .. saudade...

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois...

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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...