Construa um código em C para um registrador de deslocamento que é acionado sempre que a leitura do terminal 8 do ATMega328P fornecer nível alto (isso simula um botão de pull-down). Para cada vez que o botão for pressionado, um bit alto deve deslocar do LSB no sentido do MSB do registrador. Quando o bit alto atingir o bit 7, o próximo bit em deslocamento só poderá se deslocar até o bit 6. Esse processo deve se repetir até que todos os bits do registrador estejam em nível alto.

Passo 1

Beleza, vamos dar uma olhada no que você precisa fazer. Você quer criar um código em C para o microcontrolador ATMega328P que controla um registrador de deslocamento. O objetivo é que, toda vez que um botão conectado ao terminal 8 for pressionado (com nível alto), um bit alto (1) seja deslocado do LSB (bit menos significativo) em direção ao MSB (bit mais significativo) do registrador. Quando o bit alto chegar ao bit 7, os próximos deslocamentos só poderão ir até o bit 6, e esse processo se repete até que todos os bits do registrador estejam em nível alto. Para resolver isso, vamos precisar entender como manipular portas de E/S no ATMega328P, trabalhar com registradores de deslocamento e gerenciar interrupções ou verificações de botão.

Passo 2

Primeiro, precisamos definir qual porta do ATMega328P está conectada ao registrador de deslocamento e ao botão. Vamos supor que o registrador de deslocamento esteja conectado à porta PORTB e o botão esteja conectado ao PORTD, PIND0 (que é o terminal 8). Precisamos configurar essas portas como entrada ou saída.
DDRB = 0xFF; // Configura PORTB como saída
DDRD &= ~(1 << PD0); // Configura PD0 (botão) como entrada

Passo 3

Agora, vamos criar uma variável que representa o registrador de deslocamento. Inicialmente, todos os bits estão em 0.
uint8_t registrador = 0x00; // Registrador de 8 bits iniciado em 0

Passo 4

Precisamos detectar quando o botão é pressionado. Vamos fazer isso verificando o estado do botão em um loop contínuo. Para evitar registrar múltiplas pressões rápidas, podemos implementar uma pequena espera após detectar uma pressão.
while(1) {
    if (PIND & (1 << PD0)) { // Verifica se o botão está pressionado
        // Aqui vai a lógica de deslocamento
        _delay_ms(200); // Pequena espera para debouncing
    }
}

Passo 5

Dentro da verificação do botão, vamos implementar a lógica de deslocamento dos bits. A cada pressão, um 1 será deslocado do LSB para o MSB. Quando o bit 1 atingir o bit 7, os próximos deslocamentos só até o bit 6, e assim por diante até todos os bits serem 1.
if (registrador < 0xFF) { // Enquanto nem todos os bits estão em 1
    if ((registrador & 0x80) == 0) { // Se o bit 7 ainda não está em 1
        registrador <<= 1; // Desloca para a esquerda
        registrador |= 0x01; // Adiciona um 1 no LSB
    } else {
        // Se bit 7 já está 1, limitar o deslocamento até o bit 6
        registrador = (registrador << 1) | 0x01;
        registrador &= 0x7F; // Garante que o bit 7 volte a 0
    }
    PORTB = registrador; // Atualiza o registrador de deslocamento
}

Resposta

Prontinho! Com esse código, cada vez que o botão for pressionado, um 1 será deslocado do LSB para o MSB no registrador de 8 bits conectado ao PORTB do ATMega328P. Quando o 1 alcançar o bit 7, os próximos deslocamentos se limitarão até o bit 6, e assim por diante, até que todos os bits estejam em nível alto (1).

Exercícios relacionados