PIC do Zero

Programação em C para Microcontroladores PIC

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.

Em microcontroladores, cada pino, cada entrada, cada saída e muitos recursos internos são controlados por bits dentro de registradores. Por isso, entender bits é essencial para programar PIC com segurança.

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;
O operador | é chamado de OR bit a bit. Ele é usado para colocar um bit em 1 sem obrigatoriamente alterar os outros bits.

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.
Na próxima aula vamos entrar em registradores do PIC, entendendo melhor TRIS, PORT, LAT e como o microcontrolador define entradas e saídas digitais.