// Khai báo chân nút bấm
const int buttonPin = 2;  // Sử dụng chân D2 cho ngắt ngoài INT0

// Khai báo biến đếm
volatile bool buttonPressed = false;
volatile bool timerFlag = false;

void setup() {
  // Thiết lập Serial Monitor
  Serial.begin(9600);
  
  // Thiết lập chân nút bấm
  pinMode(buttonPin, INPUT_PULLUP);
  
  // Thiết lập ngắt nút bấm (INT0)
  attachInterrupt(digitalPinToInterrupt(buttonPin), buttonISR, FALLING);
  
  // Thiết lập Timer1
  noInterrupts();  // Tắt ngắt toàn bộ hệ thống
  
  TCCR1A = 0;  // Thiết lập thanh ghi điều khiển A của Timer1
  TCCR1B = 0;  // Thiết lập thanh ghi điều khiển B của Timer1
  TCNT1  = 0;  // Thiết lập giá trị khởi tạo của bộ đếm Timer1
  
  // Thiết lập giá trị so sánh cho ngắt Timer1 Compare Match A
  OCR1A = 15624;  // 1s (16MHz / 1024 prescaler / 1Hz)
  
  // Bật CTC mode và thiết lập prescaler thành 1024
  TCCR1B |= (1 << WGM12);
  TCCR1B |= (1 << CS12) | (1 << CS10);
  
  // Cho phép ngắt Timer1 Compare Match A
  TIMSK1 |= (1 << OCIE1A);
  
  interrupts();  // Bật ngắt toàn bộ hệ thống
}

void loop() {
  if (buttonPressed) {
    Serial.println("Hello Interrupt From Button");
    buttonPressed = false;
  }
  
  if (timerFlag) {
    Serial.println("Hello World");
    timerFlag = false;
  }
}

// ISR cho ngắt nút bấm
void buttonISR() {
  buttonPressed = true;
}

// ISR cho ngắt Timer1 Compare Match A
ISR(TIMER1_COMPA_vect) {
  timerFlag = true;
}