// 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;
}