Aula 08 - Manipulação de Bits
Nesta aula vamos estudar um dos assuntos mais importantes para programação de microcontroladores PIC: a manipulação de bits.
1. O que é um bit?
Um bit é a menor unidade de informação em um sistema digital. Ele só pode assumir dois valores:
- 0 - desligado, falso ou nível baixo.
- 1 - ligado, verdadeiro ou nível alto.
Quando ligamos ou desligamos um pino do PIC, normalmente estamos alterando o valor de um bit.
2. O que é um byte?
Um byte é formado por 8 bits.
Bit: 7 6 5 4 3 2 1 0
Valor: 0 0 0 0 0 0 0 0
No PIC, muitos registradores possuem 8 bits. Um exemplo comum é o registrador PORTB.
PORTB = 0b00000000;
Esse comando coloca todos os bits do PORTB em zero.
3. Representação binária
Na linguagem C usada no compilador XC8, podemos escrever valores binários usando o prefixo 0b.
unsigned char valor = 0b00001111;
Nesse exemplo, os quatro bits menos significativos estão em 1.
4. Representação hexadecimal
Também é muito comum usar valores em hexadecimal, principalmente na configuração de portas e registradores.
PORTB = 0xFF;
O valor 0xFF equivale a:
0b11111111
Ou seja, todos os 8 bits em nível alto.
5. Ligando todos os bits de uma porta
PORTB = 0xFF;
Esse comando liga todos os pinos do PORTB.
6. Desligando todos os bits de uma porta
PORTB = 0x00;
Esse comando desliga todos os pinos do PORTB.
7. Ligando apenas um bit
Para ligar apenas o bit 0 sem alterar os demais bits, usamos o operador OR bit a bit:
PORTB = PORTB | 0b00000001;
Forma mais comum:
PORTB |= 0b00000001;
8. Desligando apenas um bit
Para desligar apenas o bit 0, usamos o operador AND bit a bit junto com o complemento:
PORTB = PORTB & 0b11111110;
Forma mais comum:
PORTB &= 0b00000001;
O símbolo ~ inverte os bits. Assim, o bit desejado vira 0 e os demais permanecem em 1.
9. Invertendo um bit
Para inverter o estado de um bit, usamos o operador XOR:
PORTB ^= 0b00000001;
Se o bit 0 estiver desligado, ele liga. Se estiver ligado, ele desliga.
10. Testando um bit
Para verificar se um bit está em 1, usamos o operador AND:
if(PORTB & 0b00000001)
{
// O bit 0 está ligado
}
Esse tipo de teste é muito usado para verificar entradas digitais, flags de interrupção e estados internos do microcontrolador.
11. Operadores bit a bit
Os principais operadores usados na manipulação de bits são:
- & - AND bit a bit.
- | - OR bit a bit.
- ^ - XOR bit a bit.
- ~ - inversão dos bits.
- << - deslocamento para a esquerda.
- >> - deslocamento para a direita.
12. Usando deslocamento de bits
O deslocamento facilita a criação de máscaras.
PORTB |= (1 << 0); // Liga o bit 0
PORTB |= (1 << 1); // Liga o bit 1
PORTB |= (1 << 2); // Liga o bit 2
A expressão 1 << 2 significa deslocar o número 1 duas posições para a esquerda.
1 << 2 = 0b00000100
13. Criando nomes para os bits
Para deixar o código mais legível, podemos usar #define.
#define LED1 0
#define LED2 1
#define RELE 2
Agora podemos controlar os bits pelo nome:
PORTB |= (1 << LED1); // Liga LED1
PORTB &= (1 << LED1); // Desliga LED1
PORTB ^= (1 << RELE); // Inverte RELE
14. Exemplo prático com PIC
Exemplo ligando e desligando LEDs conectados ao PORTB:
#include <xc.h>
#define _XTAL_FREQ 4000000
#define LED1 0
#define LED2 1
void main()
{
TRISB = 0x00;
PORTB = 0x00;
while(1)
{
PORTB |= (1 << LED1); // Liga LED1
delay_ms(500);
PORTB &= ~(1 << LED1); // Desliga LED1
delay_ms(500);
PORTB ^= (1 << LED2); // Inverte LED2
delay_ms(500);
}
}
15. Forma simplificada usando bits do PIC
Em muitos modelos de PIC, também podemos acessar os bits diretamente pelo nome.
PORTBbits.RB0 = 1; // Liga RB0
PORTBbits.RB0 = 0; // Desliga RB0
Essa forma é mais simples para iniciantes, mas entender a manipulação com máscaras é importante para configurar registradores mais avançados.
16. Aplicação em registradores
A manipulação de bits não serve apenas para ligar LED. Ela é usada para configurar recursos internos do PIC, como:
- Direção dos pinos com TRIS.
- Leitura e escrita em PORT.
- Controle de interrupções.
- Configuração de timers.
- Configuração de ADC.
- Controle de comunicação serial.
17. Exercício prático
Considere que um LED está conectado ao bit 3 do PORTB. Escreva os comandos para ligar, desligar e inverter esse LED.
Resposta sugerida:
PORTB |= (1 << 3); // Liga bit 3
PORTB &= ~(1 << 3); // Desliga bit 3
PORTB ^= (1 << 3); // Inverte bit 3
Resumo da Aula
- Um bit pode valer 0 ou 1.
- Um byte possui 8 bits.
- Registradores do PIC normalmente são controlados bit a bit.
- O operador | liga bits.
- O operador & testa ou limpa bits.
- O operador ^ inverte bits.
- O operador ~ inverte todos os bits.
- O deslocamento << ajuda a criar máscaras.