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.
Para este projeto, vamos utilizar o seguinte material :
- PIC 16F628A
- Push button
- 3 resistores de 1 K
- 2 leds
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:
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.
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.
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
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,
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
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
Ola professor, gostaria de saber porque que esse programa não fucionou corretamente no meu ccs? ou so fuciona no mplab?
Olá, Daniel!
O CCS é um compilador, que inclusive é usado no MPLab, então na teoria deveria funcionar.
Abraços!
Diogo – Equipe MakerHero
Boa tarde!
Vocês não tem PIC16F690, para compra pela internet.
Att, Marcio Pires.
Olá Marcio!
Infelizmente, só temos esse:
https://www.makerhero.com/produto/microcontrolador-pic-16f630/
Abraços!
André Rocha – Equipe MakerHero
obigado ja comprei mercado livre
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
Olá Marcio!
Parece problema na memória dele, seu PIC parece defeituoso.
Abraços!
André Rocha – Equipe MakerHero
obrigado!!
Vou comprar um outro pic a fazer alguns testes
abraço!!
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
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
Olá, onde consigo esse arquivo 16F628A.h, com essas funções que você chamou na sua main?
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!
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.
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.
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!!!
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?
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?
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.
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?
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?
Boa noite Octavio,
Minha sugestão é utilizar um contador, que ao chegar ao 6o. toque desliga todas as portas.
Abraço.
Adilson – Equipe MakerHero
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 ???
Olá! onde posso conseguir a biblioteca desse PIC?
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
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?
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
Olá ! Como faço para usar esse processo com cinco ledes?