Utilizando PIC 16F628A com push-button e leds 32

Nos testes deste post vamos utilizar o PIC 16F628A em conjunto com um botão/chave tipo push-button e um led para demonstrar como definir uma porta do microcontrolador como entrada e usar esses dados para acionar outras saídas do chip. Se você está começando com microcontroladores da família PIC, recomendamos ler primeiramente este post de Como gravar seu 1º programa com PIC.

Todos os componentes utilizados nesse post você encontra na loja MakerHero, como protoboard, leds, resistores e outros componentes.

Loja MakerHero

Para este projeto, vamos utilizar o seguinte material :

Ligamos os 2 leds às portas 0 e 1 (pinos 17/RA0 e 18/RA1 do PIC 16F628A, respectivamente), e o botão será ligado à porta 3 (pino 2/RA3 do PIC 16F628A). A alimentação do CI é feita pelo pino 5 (GND), e pino 14 (Vcc/5V). A pinagem do PIC 16F628A segue o esquema abaixo:

Pinagem 16F628A A cada toque no botão, a variável Status será atualizada, e as saídas correspondentes aos leds serão acionadas alternadamente : 1 toque no botão acende o led1, o 2o. toque acende o led2, o 3o. toque acende o led1 novamente, e assim por diante.

Os dois resistores ligados aos leds são limitadores de corrente, e o resistor ligado ao push-button funciona como um resistor pull-up, evitando acionamentos incorretos da porta 3.

No programa, usamos BOTAO para nos referirmos à porta 3, PINO_LED1 para a porta 0 e PINO_LED2 para a porta 1. A variável Status recebe os valores 0 ou 1, conforme o acionamento do botão, e tem o seu valor invertido à cada acionamento, por meio do comando status=!status.

Para efetuarmos a leitura de uma determinada porta, simplesmente usamos o comando INPUT_STATE(PORTA), e para escrita, usamos o comando OUTPUT_BIT(PORTA, VALOR).

//Programa : PIC16F628A com push-button e leds
//Autor : MakerHero

#include <16F628A.h>

//Configuracao FUSES
#FUSES NOWDT
#FUSES INTRC_IO
#FUSES NOPUT
#FUSES NOPROTECT
#FUSES NOBROWNOUT
#FUSES NOMCLR
#FUSES NOLVP
#FUSES NOCPD

//Definicoes portas
#define BOTAO PIN_A3
#define PINO_LED1 PIN_A0
#define PINO_LED2 PIN_A1

//Define clock
#use delay(clock=4000000)

void main()
{
unsigned int status=0;
while(1)
    {
    //Verifica se o botao foi pressionado
    if(input_state(BOTAO) == 0)
        {
            //Altera status led1
            output_bit(PINO_LED1, status);
            //Altera Status led2
            output_bit(PINO_LED2, !status);
            delay_ms(500);
            //Inverte o valor da variável status
            status=!status;
        }
    }
}

 Gostou? Deixe seu comentário logo abaixo.

Faça seu comentário

Acesse sua conta e participe

32 Comentários

  1. Bom dia !
    Gostaria de saber como faço , nessa mesma logica. Essa logica 1º ao pressionar o botão e o manter pressionado acende o led1, 2° ao soltar o botão apaga o led1, 3°. ao pressionar o botão e o manter pressionado acende o led2, 4° ao soltar o botão apaga o led2. e assim por diante em um loop infinito.

    1. Olá Leonardo,

      Uma forma simples de realizar isso é fazer colocar vários “if” encadeados, assim você poderá colocar as condições que deseja.

      Abraço!
      Rosana – Equipe MakerHero

  2. Olá Adilson, muito obrigado pelos ensinamentos. Uma dúvida, é possível fazer algo assim no arduino? Precisava que, quando apertasse botao1, led1 acendesse, quando apertasse botao2, led1 desligasse, quando apertasse botao1 novamente led2 acendesse e assim sucessivamente, tem como me ajudar? Grato,

    1. Fabio,

      É possível sim. Dê uma olhada aqui: https://www.makerhero.com/universidade/kit-maker-arduino/projeto-5-interruptor-de-luz/

      Explicamos como acender um LED com um botão, então basta ir mexendo na programação para ajustar como você quiser 😉

      Abraços!
      Diogo – Equipe MakerHero

  3. ola adilson bom dia por favor estou te enviado umas funções que deve ser gravado no pic 16f628-a para uma lampapada RGB
    15 Funções de Cores:
    RGB COM PIC16F628-A POR PULSO CONTROLE REMOTO 433
    3 IRFZ 44N
    MODULO RF 433
    CI 7805
    CONTOLE DO PIC 16f628-A
    SEQUENCIAL

    1 -TOK LIGA
    no mesmo botão

    PARA AS 14 FUNÇÕES

    AS CORES CONFORME AS SEQUENCIAS A BAIXO

    2º Azul

    3º Vermelha

    4º VERDE

    5º Azul e Vermelha

    6º Azul e Verde

    7º Verde e Vermelha

    8º Vermelha, Verde e Azul

    9º Flash’s piscando (Uma cor de cada vez)

    10º Flash’s piscando (Vermelho, Verde e Azul)

    11º Vermelha (Piscando) Verde Azul permanecem acesas

    12º Azul (Piscando) Verde e Vermelha permanecem acesas

    13º Vermelha Piscando

    14. salto tricolor

    15º Desliga
    SEFOR POSSIVEL ME ENVIAR O PREÇO DE SEU TRABALHO

  4. Ola professor, gostaria de saber porque que esse programa não fucionou corretamente no meu ccs? ou so fuciona no mplab?

    1. Olá, Daniel!

      O CCS é um compilador, que inclusive é usado no MPLab, então na teoria deveria funcionar.

      Abraços!
      Diogo – Equipe MakerHero

  5. Boa tarde!

    Vocês não tem PIC16F690, para compra pela internet.

    Att, Marcio Pires.

    1. Olá Marcio!

      Infelizmente, só temos esse:
      https://www.makerhero.com/produto/microcontrolador-pic-16f630/

      Abraços!

      André Rocha – Equipe MakerHero

      1. obigado ja comprei mercado livre

  6. boa tarde
    Estou com problema no pic 16f690 quando desligo alimentacao e ligo novamente nao funciona mas quando tiro pic da protobord e coloco de novo funciona perfeitamente .Alguem poderia me dar uma dica do que pode ser obrigado

    1. Olá Marcio!

      Parece problema na memória dele, seu PIC parece defeituoso.

      Abraços!

      André Rocha – Equipe MakerHero

      1. obrigado!!

        Vou comprar um outro pic a fazer alguns testes

        abraço!!

  7. Preciso de uma ajuda em fazer um programa em pic c para 16f628a com dois displays efetuando os displays efetuarem uma contagem ate 10 e uma recontagem ate zero ai ligar uma buzina

    1. Olá Maurício!

      Você pode colocar esse problema com mais detalhes no nosso fórum? Lá o pessoal pode te ajudar melhor nisso.

      https://www.makerhero.com/forum/

      Abraços!

      André – Equipe MakerHero

  8. Olá, onde consigo esse arquivo 16F628A.h, com essas funções que você chamou na sua main?

  9. Olá!

    Estou com uma dúvida em uma programação.
    preciso acionar um Buzzer mandando 0 na saida do pic16F84A, com eu faria isso?

    Desde já agradeço!

    Lucas Lage Marques Fernandes
  10. Olá amigos.

    Estudei programação de microcontroladores há alguns anos atrás e por falta de prática, resolvi re-estudar os assuntos. Quando usei um programa para escrever o código, e comparando o que usei com esses que vocês sugerem, vi que há algumas diferenças em sintaxe (posso estar enganado). Por exemplo, quando estudei programação usava TRISA = 0b00000000; para definir os pinos do PORTA como saídas, porém não consigo fazer o mesmo com o MPLAB, sempre aparece uma mensagem de erro dizendo TRISA é um identificador não definido. Estou cometendo algum erro? Há algum material que mostre como expressar as funções no MPLAB?

    Desde já agradeço pela atenção.

    1. Ah, esqueci de falar que quando tento acessar as interrupções pelo método que conhecia, tbm é gerado um erro. O engraçado é que quando fiz o curso, tbm era em linguagem C.

    2. Vocês poderiam mostrar um exemplo usando interrupções com o TIMER0, por favor? Isto está me deixando maluco! Os modos que costumava fazer não funcionam, nem os que encontro na internet.

      SOCORROOO!!!

  11. boa noite
    eu posso colocar o botão com dois terminais ao invés de 4?
    se eu colocar o de duas pernas como fica o esquema?

  12. Professor Bruno tem como fazer um led acender com duas entradas de um pic 16f628a.ex . pinto b1 e pino b2 sendo acionado juntos por um button …no caso curtocircuitando os dois com um button e acendendo o led em b5 no caso?

  13. Professor Fernando desculpe incomodar vc, mas é que eu to começando agora em microcontroladores e to com um projeto que queria transformar. Será que vc pode me ajudar? é um projeto que ja funciona com lcd mas eu quero transformar ele !! se o senhor professor Fernando puder me ajudar eu fico agradecido.

  14. ESTOU COM UM PROBLEMA NO CIRCUITO DO PIC16F628A NÃO ESTA SAINDO 25MA NOS PINOS NA SIMULAÇAO VIA PROTEUS, ESTOU FAZENDO UMA SEQUENCIA DE PISCA DE 8 LEDS COM RESISTORES 330 OHMS SAI 5 VOLTS MAS A CORRENTE SAI 0,000005A, PQ?

  15. Boa, gostei muito!
    Uma pergunta, Se eu quiser fazer uma sequencia (tipo 5 leds) e que no ultimo 6º toque do botão ele apaga-se todos os leds, como eu faço?

    1. Boa noite Octavio,

      Minha sugestão é utilizar um contador, que ao chegar ao 6o. toque desliga todas as portas.

      Abraço.

      Adilson – Equipe MakerHero

  16. Legal, tava procurando esse circuito, só q qdo ligo, no proteus, os leds fica piscando, acende um e outro e ficam assim, qdo aciono o botton eles para e fica um acesso direto, o que fiz de errado.
    To querendo usar no 16f877, pois preciso de 27 portas.
    Obrigado,
    e meus parabens.
    ps voce mandaria os pics gravados ???

  17. Olá! onde posso conseguir a biblioteca desse PIC?

    1. Bom dia Fernando,

      Na nossa instalação do MPLab e do compilador, a biblioteca dos dispositivos fica na pasta C:Program Files (x86)PICCDevices

      Abraço

      Adilson – Equipe MakerHero

  18. Olá amigo se por um acaso eu quisesse que ao rodar o programa um led já comesse aceso e o outro apagado e ao acionar o botão o aceso apagaria e o apagado acendece e ao acionar denovo voltasse a primeira situação?

    1. Boa tarde Bruno,

      Você pode fazer isso colocando esses 2 comandos imediatamente antes da linha com o “While” :

      output_bit(PINO_LED1, 1);
      output_bit(PINO_LED2, 0);

      Abraço.

      Adilson – Equipe MakerHero

      1. Olá ! Como faço para usar esse processo com cinco ledes?