Nội Dung Bài Viết
Bài viết hôm nay sẽ giới thiệu Phương pháp 1: Chống dội nút nhấn bằng delay thủ công (Simple Delay Debounce) – một giải pháp đơn giản, dễ triển khai, phù hợp cho người mới bắt đầu làm quen với STM32F103.
Trong quá trình lập trình STM32F103 bằng thanh ghi, một trong những vấn đề thường gặp là hiện tượng dội nút nhấn (button bounce). Khi người dùng nhấn hoặc thả nút, tiếp điểm cơ học không đóng/mở ngay lập tức mà dao động trong vài mili giây, khiến hệ thống có thể hiểu sai thành nhiều lần nhấn. Để giải quyết vấn đề này, có nhiều phương pháp khác nhau, từ phần mềm đến phần cứng. Trong chuỗi bài viết này, chúng ta sẽ lần lượt tìm hiểu từng cách tiếp cận.
Phương pháp 1: Chống dội nút nhấn bằng delay thủ công (Simple Delay Debounce)
Đây là cách chống dội nút nhấn đơn giản nhất: sau khi phát hiện tín hiệu nhấn, chương trình sẽ chèn một khoảng trễ cố định (ví dụ vài ms) để bỏ qua các dao động cơ học của nút.
Dao động từ nút nhấn có thể khiến hệ thống nhầm lẫn, đặc biệt khi đọc tín hiệu ngay sau khi nhấn. Độ trễ giúp “bỏ qua” thời gian dao động để chỉ phản hồi khi tín hiệu ổn định.
Nguyên lý hoạt động phương pháp chống dội bằng delay thủ công (simple delay debounce)
Sau khi phát hiện nút được nhấn, chương trình chờ một khoảng thời gian cố định (ví dụ 30 ms) để bỏ qua dao động. Sau đó kiểm tra lại trạng thái nút:
Nếu vẫn nhấn → xác nhận sự kiện
Sơ đồ (flow chart) phương pháp chống dội dùng simple delay debounce:

Cách hoạt động phương pháp chống đội bằng delay
Phiên bản cơ bản
Phiên bản cải tiến (phát hiện cạnh)
Chương trình main chống dội nút nhấn bằng delay + phát hiện cạnh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | int main(void) { SystemClock_Config(); // Initialize system clock GPIO_LED_Config(); GPIO_Button_Config(); uint32_t lastKeyState = 0; while (1) { // Check if PC1 is low (button pressed) uint32_t ButtonState = !((GPIOC->IDR.reg >> 1) & 1U); if ((ButtonState) & (lastKeyState == 0)) // Detect edge { Delay_Approx(30); // Debounce delay 0.03s if (!((GPIOC->IDR.reg >> 1) & 1U)) // Check the button still pressed after delay { LED_Toggle(); } } lastKeyState = ButtonState; // Save last key state } } |
Chương trình chống dội nút nhấn bằng delay, kết hợp phát hiện cạnh hoạt động như sau:
- Bước 1: Phát hiện cạnh lên (từ thả sang nhấn).
- Bước 2: Chờ 30ms.
- Bước 3: Kiểm tra lại, nếu vẫn nhấn, thực hiện hành động.
- Ví dụ: Khi nhấn nút, hệ thống chờ 30ms để đảm bảo dao động kết thúc trước khi bật LED.
Link github: Download chương trình chống dội nút nhấn bằng simple delay debounce
Ưu điểm phương pháp chống dội nút nhấn bằng delay
- Dễ triển khai: chỉ cần thêm một hàm
delay()sau khi phát hiện tín hiệu. - Không cần phần cứng bổ sung: chỉ dùng phần mềm, không cần tụ điện hay mạch RC.
- Phù hợp cho ứng dụng nhỏ: thích hợp khi số lượng nút ít và không yêu cầu tốc độ cao.
- Trực quan: dễ hiểu cho người mới học lập trình vi điều khiển.
Nhược điểm phương pháp chống dội nút nhấn bằng delay
- Chặn CPU: trong thời gian delay, vi điều khiển không làm việc khác → giảm hiệu suất.
- Không linh hoạt: nếu delay quá ngắn thì vẫn lọt nhiễu, quá dài thì gây trễ phản hồi.
- Khó mở rộng: khi có nhiều nút hoặc hệ thống phức tạp, cách này không hiệu quả.
- Ảnh hưởng trải nghiệm: người dùng có thể cảm thấy nút phản hồi chậm nếu delay lớn.
- Không phù hợp cho hệ thống đa nhiệm hoặc real-time → làm giảm khả năng đáp ứng nhanh và xử lý đồng thời.
Kết luận
Phương pháp chống dội nút nhấn bằng delay thủ công (Simple Delay Debounce) là giải pháp cơ bản và dễ tiếp cận nhất khi lập trình STM32F103 bằng thanh ghi. Với ưu điểm đơn giản, dễ hiểu và không cần phần cứng bổ sung, nó rất phù hợp cho các ứng dụng nhỏ hoặc người mới bắt đầu. Tuy nhiên, hạn chế lớn của phương pháp này là gây blocking CPU, làm giảm hiệu suất và không thích hợp cho hệ thống đa nhiệm hoặc yêu cầu real-time.
Trong thực tế, khi hệ thống trở nên phức tạp hơn, các kỹ thuật khác như debounce bằng Timer hoặc debounce bằng phần cứng (RC, Schmitt Trigger) sẽ mang lại hiệu quả cao hơn. Vì vậy, bạn có thể xem phương pháp delay thủ công như một bước khởi đầu để hiểu nguyên lý chống dội, trước khi tiến tới các giải pháp tối ưu hơn.
