#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
volatile uint8_t mode = 0; // 0: Standby, 1: Mode 1, 2: Mode 2
ISR(TIMER0_OVF_vect) {
// Interrupt saat pushbutton ditekan
if (TCNT0 == 1) {
mode = 1; // Mode 1 setelah satu kali tekanan
} else if (TCNT0 == 2) {
mode = 2; // Mode 2 setelah dua kali tekanan
TCNT0 = 0; // Reset TCNT0 setelah masuk ke mode 2 untuk kembali ke mode 1 pada tekanan berikutnya
}
}
void standby_mode() {
// Fungsi untuk mode standby
PORTB &= ~(1 << PB7); // Matikan LED pada mode standby
}
void mode_1() {
// Fungsi untuk mode 1
PORTB |= (1 << PB7); // Nyalakan LED pada mode 1
}
void mode_2() {
// Fungsi untuk mode 2
PORTB ^= (1 << PB7); // Toggle LED pada mode 2 (berkedip)
_delay_ms(500); // Delay untuk efek toggle
}
int main(void) {
DDRB |= (1 << PB7); // Set PB0 sebagai output (untuk LED)
DDRD &= ~(1 << PD7); // Set PD7 sebagai input (untuk pushbutton)
// Setup Timer 0 untuk menggunakan clock eksternal pada T0 (PD7)
TCCR0A = 0; // Normal mode
TCCR0B |= (1 << CS02) | (1 << CS01); // External clock on T0 pin, falling edge
TIMSK0 |= (1 << TOIE0); // Enable overflow interrupt untuk Timer 0
sei(); // Enable global interrupts
while (1) {
if (mode == 0) {
standby_mode(); // Mode standby
} else if (mode == 1) {
mode_1(); // Mode 1
} else if (mode == 2) {
mode_2(); // Mode 2
}
}
}