Tutorial Prático: Comunicação I²C entre PIC e Periféricos
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 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áticas
Uso 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 displays
Uso 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 PIC
Exemplos 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õ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 registradores
Arquitetura 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).
- TRISx: Define se o pino é entrada (bit = 1) ou saída (bit = 0).
- PORTx: Registra o valor lido no pino, quando configurado como entrada.
- LATx (em alguns modelos de PIC
Exemplos 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.): Define o valor que sai no pino, quando configurado como saída.
Em microcontroladores PICPrimeiros 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í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 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í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í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 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 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ígito | g f e d c b a (binário) | Hex (exemplo) | Seg. acesos |
---|---|---|---|
0 | 0 1 1 1 1 1 1 | 0x3F | a, b, c, d, e, f |
1 | 0 0 0 0 1 1 0 | 0x06 | b, c |
2 | 1 0 1 1 0 1 1 | 0x5B | a, b, d, e, g |
3 | 1 0 0 1 1 1 1 | 0x4F | a, b, c, d, g |
4 | 1 1 0 0 1 1 0 | 0x66 | b, c, f, g |
5 | 1 1 0 1 1 0 1 | 0x6D | a, c, d, f, g |
6 | 1 1 1 1 1 0 1 | 0x7D | a, c, d, e, f, g |
7 | 0 0 0 0 1 1 1 | 0x07 | a, b, c |
8 | 1 1 1 1 1 1 1 | 0x7F | a, b, c, d, e, f, g |
9 | 1 1 0 1 1 1 1 | 0x6F | a, 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 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:
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 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 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 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 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 desacoplamento
Desenvolvimento 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 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õ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 display
Uso 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 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🔗
- Datasheet do PIC16F877A – essencial para detalhes técnicos sobre os registradores e a manipulação das portas de I/O, importante para a implementação prática com LEDs, botões e displays: ww1.microchip.com/downloads/en/DeviceDoc/39582b.pdf
- Documentação de suporte para PIC16F1xxx – relevante para entender a configuração dos pinos e os registradores de I/O utilizados no tutorial: microchipdeveloper.com/8bit:pic16f1xxx
- Tutoriais e exemplos práticos para PIC – oferece referências complementares e exemplos de aplicações práticas que se alinham com a manipulação de I/O mostrada no tutorial: microcontrollerslab.com/category/pic-microcontroller/
- Visão geral dos microcontroladores PIC – útil para compreender a família PIC e as funcionalidades das portas de I/O: www.microchip.com/design-centers/8-bit/pic-mcus