Single Click & Double Click STM32

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 .

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.

3 Likes

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ối Button_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án false, sau lại gán thành HIGH 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.

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?