Guia Prático: Manipulação de I/O no PIC com LEDs e Botões

Este tutorial aborda como manipular portas de I/O do microcontrolador PICEvolução dos PIC: Tendências, Desafios e Perspectivas FuturasEvolução dos PIC: Tendências, Desafios e Perspectivas FuturasDescubra a evolução dos microcontroladores PIC, desde os modelos 8 bits até as avançadas soluções de 32 bits, destacando tendências e desafios. em aplicações práticasUso das Portas I/O: Controlando LEDs, Displays e SensoresUso das Portas I/O: Controlando LEDs, Displays e SensoresAprenda a configurar portas, CDs, LEDs, displays, ADC e muito mais em sistemas PIC, com dicas de segurança, depuração e integração de sensores. com LEDs, botões e displaysUso das Portas I/O: Controlando LEDs, Displays e SensoresUso das Portas I/O: Controlando LEDs, Displays e SensoresAprenda a configurar portas, CDs, LEDs, displays, ADC e muito mais em sistemas PIC, com dicas de segurança, depuração e integração de sensores. de 7 segmentos. A ideia é mostrar, de forma simples e direta, como configurar os pinos do PICExemplos Práticos em Assembly: Quando Vale a Pena Programar em Baixo NívelExemplos Práticos em Assembly: Quando Vale a Pena Programar em Baixo NívelExplore como a programação Assembly em PIC maximiza controle de hardware com alta eficiência, ideal para sistemas críticos e dispositivos de baixa energia. para acionamento de componentes externos.

Visão Geral do Controle de I/O no PIC🔗

A maioria dos microcontroladores PICPrimeiros Passos com PIC: Entendendo o Microcontrolador e suas VersõesPrimeiros Passos com PIC: Entendendo o Microcontrolador e suas VersõesAprenda sobre microcontroladores PIC com este guia completo. Conheça a teoria, as práticas de otimização e casos reais para aplicações embarcadas de sucesso. possui portas de entrada e saída digitais, denominadas com letras (por exemplo: PORTA, PORTB, PORTC...). Cada porta pode ter vários pinos (RA0, RA1, RB0, RB1, etc.). Para configurar um pino como entrada ou saída, utilizamos registradoresArquitetura Básica: Registradores, Memória e Organização de DadosArquitetura Básica: Registradores, Memória e Organização de DadosDomine a arquitetura PIC com este guia prático. Aprenda concepções avançadas, manipulação de registradores e otimização para sistemas embarcados. de direção (os famosos TRISx, onde x é a letra da porta).

Em microcontroladores PICPrimeiros Passos com PIC: Entendendo o Microcontrolador e suas VersõesPrimeiros Passos com PIC: Entendendo o Microcontrolador e suas VersõesAprenda sobre microcontroladores PIC com este guia completo. Conheça a teoria, as práticas de otimização e casos reais para aplicações embarcadas de sucesso. mais antigos, em vez de LATx, usa-se diretamente PORTx tanto para leitura quanto escrita. Em muitos modelos recentes (PIC16F, PIC18F, etc.), recomenda-se escrever em LATx quando se deseja alterar o estado das saídas.

Acionando LEDs🔗

Ligando um LED na prática

Para acender um LED usando um pino do PICExemplos Práticos em Assembly: Quando Vale a Pena Programar em Baixo NívelExemplos Práticos em Assembly: Quando Vale a Pena Programar em Baixo NívelExplore como a programação Assembly em PIC maximiza controle de hardware com alta eficiência, ideal para sistemas críticos e dispositivos de baixa energia., conectamos uma extremidade do LED ao pino (por meio de um resistor) e a outra extremidade ao VCC ou GND, dependendo se queremos controlar o LED em nível alto (ativo em 1 lógico) ou nível baixo (ativo em 0 lógico). O resistor (geralmente entre 220 Ω e 1 kΩ) limita a corrente, prevenindo danos ao LED e ao microcontrolador.

Um exemplo simples:

  • Pino RB0 configurado como saída.
  • LED conectado de RB0 → Resistor → GND.
  • Para acender o LED: escrevemos RB0 = 1 (nível lógico alto).
  • Para apagar o LED: escrevemos RB0 = 0 (nível lógico baixo).

Exemplo de Código em C

A seguir, um código básico para piscarmos um LED no pino RB0 de um PIC16F (a estruturaOtimização de Código em C: Aproveitando Estruturas e Funções InlineOtimização de Código em C: Aproveitando Estruturas e Funções InlineAprenda técnicas para otimizar firmware em C para PIC utilizando estruturas de dados e funções inline, melhorando performance e organização. é semelhante para outras famílias PIC):

#include <xc.h>
// Configurações de Fuses e clock já definidas em outro lugar do projeto
// (não abordadas aqui para evitar repetição de assuntos).
#define _XTAL_FREQ 4000000  // Frequência de operação (exemplo com 4 MHz)
void main(void) {
    // Configurando pino RB0 como saída
    TRISBbits.TRISB0 = 0;   // 0 = saída
    while(1) {
        LATBbits.LATB0 = 1; // Acende LED
        __delay_ms(500);    // Aguarda 500 ms
        LATBbits.LATB0 = 0; // Apaga LED
        __delay_ms(500);    // Aguarda 500 ms
    }
}

Leitura de Botões🔗

Configuração de um Botão

Para ler um botão (push-button), normalmente conectamos o botão de forma que, ao ser pressionado, ele aplique um nível lógico no pino de entrada. Podemos fazê-lo de duas maneiras gerais:

1. Pull-up interno: Configuramos o resistor de pull-up interno (para pinos que têm essa funcionalidade), e ligamos o botão ao GND. Assim, quando o botão é pressionado, o pino lê ‘0’. Quando solto, o pino lê ‘1’.

2. Pull-down externo: Utilizamos um resistor externo para GND e ligamos o botão ao VCC. Assim, quando pressionado, o pino lê ‘1’; quando solto, lê ‘0’.

Exemplo de Código em C

A seguir, um exemplo de como ler o estado de um botão no pino RB1, usando pull-up interno do PICExemplos Práticos em Assembly: Quando Vale a Pena Programar em Baixo NívelExemplos Práticos em Assembly: Quando Vale a Pena Programar em Baixo NívelExplore como a programação Assembly em PIC maximiza controle de hardware com alta eficiência, ideal para sistemas críticos e dispositivos de baixa energia. (caso suportado pelo modelo escolhido):

#include <xc.h>
#define _XTAL_FREQ 4000000
void main(void) {
    // Configura pino RB1 como entrada
    TRISBbits.TRISB1 = 1;
    // Habilita pull-up interno (apenas em alguns PICs; em outros, pode ser por registrador WPU ou OPTION_REG)
    // Em PIC16, por exemplo, OPTION_REGbits.nRBPU = 0; // Pull-ups habilitados
    // WPUBbits.WPUB1 = 1; // Para habilitar o pull-up em RB1 (varia conforme o modelo)
    // Configura RB0 como saída para teste: acender LED quando botão for pressionado
    TRISBbits.TRISB0 = 0;
    while(1) {
        // Se pino RB1 == 0, significa botão pressionado (pull-up puxa para 1, pressionado vai a 0)
        if (PORTBbits.RB1 == 0) {
            LATBbits.LATB0 = 1; // LED aceso
        } else {
            LATBbits.LATB0 = 0; // LED apagado
        }
    }
}

Caso seu PICExemplos Práticos em Assembly: Quando Vale a Pena Programar em Baixo NívelExemplos Práticos em Assembly: Quando Vale a Pena Programar em Baixo NívelExplore como a programação Assembly em PIC maximiza controle de hardware com alta eficiência, ideal para sistemas críticos e dispositivos de baixa energia. não possua pull-ups internos em determinados pinos, será necessário usar um resistor de pull-up externo.

Controle de Display de 7 Segmentos🔗

Estrutura do Display

Um displayUso das Portas I/O: Controlando LEDs, Displays e SensoresUso das Portas I/O: Controlando LEDs, Displays e SensoresAprenda a configurar portas, CDs, LEDs, displays, ADC e muito mais em sistemas PIC, com dicas de segurança, depuração e integração de sensores. de 7 segmentos é composto por 7 LEDs internos (segmentos ‘a’ até ‘g’), além de um ponto decimal (segmento ‘dp’). Cada LED interno deve ser acionado individualmente para formar os números de 0 a 9 ou letras específicas.

Existem dois tipos principais de 7 segmentos:

  • Ânodo Comum (AC): Todos os anodos dos segmentos estão conectados em um ponto comum ao VCC. Para acender um segmento, escreve-se nível baixo (0) no pino correspondente.
  • Cátodo Comum (CC): Todos os cátodos dos segmentos estão conectados em um ponto comum ao GND. Para acender um segmento, escreve-se nível alto (1) no pino correspondente.

Mapa de Bits para Dígitos

Supondo um displayUso das Portas I/O: Controlando LEDs, Displays e SensoresUso das Portas I/O: Controlando LEDs, Displays e SensoresAprenda a configurar portas, CDs, LEDs, displays, ADC e muito mais em sistemas PIC, com dicas de segurança, depuração e integração de sensores. de cátodo comum, podemos montar uma tabela que mostre quais segmentos precisam ser ligados para cada dígito. Aqui está um exemplo simplificado (assumindo que o bit menos significativo controla o segmento ‘a’ e o bit mais significativo controla o segmento ‘g’ – a ordem pode variar):

Dígitog f e d c b a (binário)Hex (exemplo)Seg. acesos
00 1 1 1 1 1 10x3Fa, b, c, d, e, f
10 0 0 0 1 1 00x06b, c
21 0 1 1 0 1 10x5Ba, b, d, e, g
31 0 0 1 1 1 10x4Fa, b, c, d, g
41 1 0 0 1 1 00x66b, c, f, g
51 1 0 1 1 0 10x6Da, c, d, f, g
61 1 1 1 1 0 10x7Da, c, d, e, f, g
70 0 0 0 1 1 10x07a, b, c
81 1 1 1 1 1 10x7Fa, b, c, d, e, f, g
91 1 0 1 1 1 10x6Fa, b, c, d, f, g
Observação: Sempre consulte o datasheet do display e do microcontrolador para adequar a pinagem, pois o mapeamento dos bits pode variar.

Exemplo de Conexão

Supondo que usaremos 8 pinos de um PORT para acionar o displayUso das Portas I/O: Controlando LEDs, Displays e SensoresUso das Portas I/O: Controlando LEDs, Displays e SensoresAprenda a configurar portas, CDs, LEDs, displays, ADC e muito mais em sistemas PIC, com dicas de segurança, depuração e integração de sensores. (7 segmentos + ponto decimal). Podemos imaginar algo como:

%% Apenas para ilustrar a conexão resumida graph LR A[Microcontrolador PIC<br/>(Port B)] -->|RB0 até RB6| B[(Display 7-Segmentos CC)] A --> C[LED] A --> D[BOTÃO]

No caso acima, cada bit de PORTB é ligado a um segmento do display, com resistores de limitação de corrente apropriados (ou em cada segmento ou no comum, dependendo do tipo de displayUso das Portas I/O: Controlando LEDs, Displays e SensoresUso das Portas I/O: Controlando LEDs, Displays e SensoresAprenda a configurar portas, CDs, LEDs, displays, ADC e muito mais em sistemas PIC, com dicas de segurança, depuração e integração de sensores.).

Exemplo de Código em C

Exemplo de como exibir os dígitos de 0 a 9, alterando o padrão no PORTBEstrutura de Código em C para PIC: Definições e Convenções EssenciaisEstrutura de Código em C para PIC: Definições e Convenções EssenciaisDescubra técnicas avançadas de programação em C para microcontroladores PIC. Aprenda otimização de memória, gestão de interrupções e depuração eficaz.:

#include <xc.h>
#define _XTAL_FREQ 4000000
// Valores necessários para acender cada dígito (exemplo para cátodo comum)
const unsigned char digitos[10] = {
    0x3F, // 0
    0x06, // 1
    0x5B, // 2
    0x4F, // 3
    0x66, // 4
    0x6D, // 5
    0x7D, // 6
    0x07, // 7
    0x7F, // 8
    0x6F  // 9
};
void main(void) {
    // Configura PORTB como saída
    TRISB = 0x00;
    unsigned char i = 0;
    while(1) {
        // Exibe o dígito atual
        LATB = digitos[i];
        // Avança para o próximo dígito (0 a 9)
        i++;
        if(i > 9) i = 0;
        __delay_ms(1000);   // Aguarda 1 segundo
    }
}

Dicas para Projetos Práticos🔗

1. Dimensionamento de Resistores: Cada segmento do displayUso das Portas I/O: Controlando LEDs, Displays e SensoresUso das Portas I/O: Controlando LEDs, Displays e SensoresAprenda a configurar portas, CDs, LEDs, displays, ADC e muito mais em sistemas PIC, com dicas de segurança, depuração e integração de sensores. e cada LED individual devem possuir resistores adequados para limitar corrente (típico: 220 Ω ou 330 Ω).

2. Ruído e FiltrosProteção e Filtragem de Sinais: Dicas de Circuito para SucessoProteção e Filtragem de Sinais: Dicas de Circuito para SucessoDescubra práticas essenciais para proteger e filtrar sinais em microcontroladores PIC, garantindo desempenho e confiabilidade para seus projetos.: Para evitar leituras incorretas de botões, considere adicionar capacitores de desacoplamentoDesenvolvimento de Placas e Layouts para PIC: Passo a PassoDesenvolvimento de Placas e Layouts para PIC: Passo a PassoEste tutorial detalhado orienta sobre o design de PCBs e layouts para microcontroladores PIC, abordando esquemáticos, roteamento e testes de montagem. e implementar técnicas de debouncing por software ou hardware.

3. Organização do Código: É boa prática criar funções específicas para acender/apagar LEDs e para escrever dígitos no displayUso das Portas I/O: Controlando LEDs, Displays e SensoresUso das Portas I/O: Controlando LEDs, Displays e SensoresAprenda a configurar portas, CDs, LEDs, displays, ADC e muito mais em sistemas PIC, com dicas de segurança, depuração e integração de sensores., melhorando a legibilidade do firmware.

4. Consumo de Corrente: Lembre-se que cada porto tem limites de corrente. Esteja atento para não exceder a capacidade do microcontrolador.

Conclusão🔗

Este tutorial apresentou conceitos fundamentais para manipular portas de I/O em microcontroladores PICPrimeiros Passos com PIC: Entendendo o Microcontrolador e suas VersõesPrimeiros Passos com PIC: Entendendo o Microcontrolador e suas VersõesAprenda sobre microcontroladores PIC com este guia completo. Conheça a teoria, as práticas de otimização e casos reais para aplicações embarcadas de sucesso., demonstrando na prática como acionar LEDs, ler botões e controlar um displayUso das Portas I/O: Controlando LEDs, Displays e SensoresUso das Portas I/O: Controlando LEDs, Displays e SensoresAprenda a configurar portas, CDs, LEDs, displays, ADC e muito mais em sistemas PIC, com dicas de segurança, depuração e integração de sensores. de 7 segmentos. Essas habilidades são essenciais para criar protótipos e aplicações mais elaboradas, servindo de base para projetos futuros com esses microcontroladores.

Em resumo, agora você tem a visão geral de como configurar e acionar os pinos do PIC para tarefas típicas de interface homem-máquina (LEDs e botões) e de exibição de valores numéricos básicos (displayUso das Portas I/O: Controlando LEDs, Displays e SensoresUso das Portas I/O: Controlando LEDs, Displays e SensoresAprenda a configurar portas, CDs, LEDs, displays, ADC e muito mais em sistemas PIC, com dicas de segurança, depuração e integração de sensores. de 7 segmentos). Esse conhecimento abre caminho para projetos criativos e funcionais com ferramentas simples e resultados imediatos.

Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.

Referências🔗

Compartilhar artigo

Artigos Relacionados