Projetos e Informações

Aqui apresentamos os projetos e informações sobre microcontroladores e sistemas embarcados

Leitura de chaves com o PIC16F628A e MPLAB XC8

ACEPIC Tecnologia

Fri, 21 Jun 2024

Leitura de chaves com o PIC16F628A e MPLAB XC8

A seguir temos mais um projeto simples que mostra como fazer a leitura das entradas digitais do microcontrolador PIC16F628A utilizando-se o compilador em linguagem C MPLAB XC8.

No caso, será realizada a leitura do estado do pino 4 da porta A e do pino 0 da porta B, onde estão conectadas as chaves S1 e S2, respectivamente.

O projeto deverá ser capaz de verificar o pressionamento das chaves e quando acontecer do pressionamento da chave S1, deve-se acionar o Led LED1 por 3 segundos e quando pressionada a chave S2, deve-se acionar o Led LED2 por também 3 segundos.

Segue abaixo o circuito utilizado para o projeto:


Criando o projeto para o compilador XC8 na IDE MPLAB X

Para este projeto deverá ser criado um projeto no MPLAB X conforme já verificado na postagem anterior.

Veja aqui como criar um projeto na IDE MPLAB X.

Projeto com o compilador MPLAB XC8 e o PIC16F628A – Parte 1

Projeto com o compilador MPLAB XC8 e o PIC16F628A – Parte 2

Para o nome do projeto e do código fonte, fique livre para escolher o que mais lhe agrada.

// CONFIG
#pragma config FOSC = HS     // Oscillator Selection bits (HS oscillator: High-speed
                             //crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN)
#pragma config WDTE = OFF    // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON    // Power-up Timer Enable bit (PWRT enabled)
#pragma config MCLRE = ON    // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin
                             //function is MCLR)
#pragma config BOREN = OFF   // Brown-out Detect Enable bit (BOD disabled)
#pragma config LVP = OFF     // Low-Voltage Programming Enable bit (RB4/PGM pin has
                             //digital I/O function, HV on MCLR must be used for programming)
#pragma config CPD = OFF     // Data EE Memory Code Protection bit (Data memory code
                             //protection off)
#pragma config CP = OFF      // Flash Program Memory Code Protection bit (Code protection off)

#include < xc.h >

#define _XTAL_FREQ 8000000

void main(void) {

  TRISAbits.TRISA4 = 1; //Direciona o pino 4 da porta A como entrada
  TRISBbits.TRISB0 = 1; //Direciona o pino 0 da porta B como entrada
  TRISBbits.TRISB6 = 0; //Direciona o pino 6 da porta B como saída
  TRISBbits.TRISB7 = 0; //Direciona o pino 7 da porta B como saída

  PORTBbits.RB6 = 0; //Atribui nível lógico 0 (0V) ao pino 6 da porta B
  PORTBbits.RB7 = 0; //Atribui nível lógico 0 (0V) ao pino 7 da porta B

  while(1)
  {
    if (PORTAbits.RA4 == 1)
    {
      PORTBbits.RB6 = 1;
      __delay_ms(3000);
    }

    if (PORTBbits.RB0 == 1)
    {
      PORTBbits.RB7 = 1;
      __delay_ms(3000);
    }

    PORTBbits.RB6 = 0;
    PORTBbits.RB7 = 0;
  }
}

Entendendo o código


Verificamos que, em grande parte, este código se assemelha ao anterior, porém na função principal (main), teremos agora o direcionamento dos pinos 4 da porta A (pino 3 do PIC16F628A) e 0 da porta B (pino 6 do PIC16F628A) como pinos de entrada.


TRISAbits.TRISA4 = 1; //Direciona o pino 4 da porta A como entrada
TRISBbits.TRISB0 = 1; //Direciona o pino 0 da porta B como entrada
TRISBbits.TRISB6 = 0; //Direciona o pino 6 da porta B como saída
TRISBbits.TRISB7 = 0; //Direciona o pino 7 da porta B como saída


No laço principal (loop infinito), devemos agora monitorar os estados destes pinos direcionados como entrada. Isso se faz através do comando if. O comando if é um comando de decisão e este é usado para determinar se uma expressão é verdadeira, no caso, devemos verificar se o estado de um determinado pino é igual a 1, ou seja, se este pino está em nível lógico alto.

if (PORTAbits.RA4 == 1)
{
  PORTBbits.RB6 = 1;
  __delay_ms(3000);
}

ou

if (PORTBbits.RB0 == 1)
  {
  PORTBbits.RB7 = 1;
  __delay_ms(3000);
}

Caso a condição da expressão seja verdadeira, deve-se executar os comandos que estão dentro do bloco if. Onde, no caso:

Se pressionado o botão S1, o nível lógico, que está em 0 (0V) no pino 4 da porta A deverá ser levado a 1 (5V) e assim, a condição do comando if (PORTAbits.RA4 == 1) será satisfeita, ou seja, será verdadeira. Então deverá ser atribuído nível lógico 1 (5V) ao pino 6 da porta B (pino 12 do PIC) e, em seguida, será gerado um atraso de 3000ms (3 segundos).

Caso seja pressionado o botão S2, o processo acima deverá ser o mesmo, assim, a condição if (PORTBbits.RB0 == 1) será verdadeira e será atribuído nível lógico 1 (5V) ao pino 7 da porta B (pino 13 do PIC) e, também, após, será gerado um atraso de 3000ms.

Ao final dos comandos condicionais, temos a atribuição de níveis lógico 0 (0V) aos pinos 6 e 7 da porta B e, assim, caso estejam acesos, serão apagados os LEDS conectados a estes pinos, conforme o esquema elétrico.

Perceba também que, caso seja pressionada uma chave, não será possível verificar o estado do outro pino que possui outra chave dentro dos 3 segundos em que o comando de atraso está sendo executado. Porém veremos como executar a ações enquanto não é finalizado o tempo de atraso estipulado em outra postagem.


Visite nossa Loja Online em www.acepic.com.br

Veja também todos os nossos cursos online disponíveis em www.acepictecnologia.com.br

0 Comentários

Deixe um comentário