Em có lượm nhặt được một đoạn code xử lý sự kiện nút nhấn . Nhưng thật sự đọc e chưa thể xâu chuỗi và hiểu được đống code này . Mọi người thông não giúp em với ạ . Em cảm ơn rất nhiều . Em đã test và chạy rất ngon .
Single Click & Double Click STM32
Hiểu đơn giản :
Single click là nhấn một cái. Khi đó logic trên pin sẽ có thay đổi. Người ta lấy mức logic giữa 2 lần quét (lần liền trước và hiện tại) và so sánh để phát hiện sự kiện. Bảng ví dụ như sau:
Trước - Sau -> Sự kiện
L - H -> Ấn phím
H - L -> Nhả phím
H - H -> đang giữ
L - L -> phím tự do
Kết hợp đánh dấu thời gian giữa 2 lần nữa thì sẽ phát hiện được double click.
Ở đây do ta tự quy định thôi. Nếu thời gian giữa 2 lần ấn hoặc nhả nhỏ hơn khoảng thời gian định trước thì coi như double click.
Không biết code này là gốc hay bạn đã sửa vô. Tạm bỏ qua phần phân tích logic tổng quát, vì @Duong_Act đã giải thích rồi, thì code trên có các vấn đề sau:
- Đặt tên biến lộn xộn không theo 1 chuẩn nào cả, lúc viết hoa lúc viết thường. Ví dụ:
Up_Time
,ignoreup
,wait_for_Up
-> Đây là code hỗn tạp của nhiều người. - Phần Debounce không tốt và có thể gây bug trong trường hợp
HAL_GetTick() - Up_Time <= Deboune
vì khốiButton_Last = Button_Value
. - Hoàn toàn không có tác dụng debounce mức tích cực HIGH đầu tiền của Single Click. Cụ thể có thể thấy ý đồ tác giả là debounce theo timer, nhưng mình khuyên là nên debounce theo sample + timer.
- Sử dụng lặp lại
HAL_GetTick()
quá nhiều lần trong cùng một hàm xử lý, thay vì chỉ cần call 1 lần. -
Button_Value
vàButton_Last
được khai báo làbool
, lúc đầu được gánfalse
, sau lại gán thànhHIGH
vàLOW
- Bạn thử Double Click nhưng ở lần Click thứ 2 giữ nút nhấn khoảng 1 giây xem thử nó có chạy như bạn muốn không?
Tóm lại là code trên chạy được nhưng nhìn rất chán và không phải là best practice để học theo. Rất tiếc là mình không có good practice cho bạn học theo. Chúc bạn tìm được nguồn tốt hơn.