Chống rung nút bấm

Kì trước, mình đã viết một bài về chống rung nút bấm bằng vertical counter. Thiệt tình là kĩ thuật đó về phần code khá là phức tạp. Nên giờ mình sẽ viết một đoạn code đơn giản hơn.

Giả sử ta có một nút bấm, và muốn chống rung cho nó, theo nguyên tắc, ta quy ước một khoảng thời gian, nếu sau khoảng thời gian đó nút bấm không thay đổi trạng thái thì ta trả về kết quả là trạng thái đó.

Đây là phần code:

Hàm này đọc tín hiệu nút nhấn được truyền vào, xem thử tín hiệu có thay đổi so với trạng thái nút đã chống rung lúc trước hay ko, và nếu đủ ba lần liên tiếp như vậy thì sẽ đưa ra trạng thái nút đã chống rung mới (biến state ).

Ta thường dùng hàm này trong các ngắt timer, ví dụ mình gọi hàm trong hàm ngắt  SysTickIntHanler() . Hàm   SysTickIntHanler()  là ngắt timer, được gọi sau mỗi 0.1ms. Hàm này sẽ quét trạng thái của nút bấm và lưu trong biến sample. Ta truyền trạng thái này vào hàm  debounce . Như vậy, nếu trạng thái của nút bấm ổn định sau 0.3ms, thì hàm debounce  sẽ xác nhận là nút nhấn đã thay đổi trạng thái.

Nếu xử lí với nhiều nút, ta chỉ cần thay các biến sử dụng trong hàm thành mảng nhiều phần tử, mỗi phần tử sẽ xử lí cho mỗi nút.