/*
Escreva um programa que troque o estado de um LED em PB7, quando uma chave ideal
é pressionada. A chave é ligada em PCINT0. A troca de estado do LED é realizada na
sub-rotina de interrupção da chave
*/
//Bibliotecas:
#define __ATmega2560__
#define __AVR_ATmega2560__
#ifndef F_CPU
#define F_CPU 16000000UL
#endif
#include <avr/io.h>
#include <avr/interrupt.h>
// Definindo os pinos para o LED e a chave
#define LED PB7
#define CHAVE PB0
// Função para alternar o estado do LED
void led() {
PORTB ^= (1 << LED); // Inverte o estado do LED em PB7
}
int main(void) {
// Configura o pino do LED como saída
DDRB |= (1 << LED);
// Configura o pino da chave como entrada com pull-up
DDRB &= ~(1 << CHAVE); // Define PB0 como entrada
PORTB |= (1 << CHAVE); // Habilita o pull-up interno para PB0
// Habilita interrupções de mudança de pino para o PCINT0
PCICR |= (1 << PCIE0); // Habilita interrupções para pinos PCINT[7:0]
PCMSK0 |= (1 << PCINT0); // Habilita a interrupção para PCINT0 (PB0)
// Habilita interrupções globais
sei();
// Loop principal vazio, pois o controle é feito via interrupção
while (1) {
// O código principal pode realizar outras tarefas aqui
}
}
// Sub-rotina de interrupção para PCINT0 (PB0)
ISR(PCINT0_vect) {
led(); // Alterna o estado do LED
}