为什么这个去抖动功能不起作用?

Why does this debounce function not work?

所以我正在尝试进行简单的去抖动,但我就是想不通哪里搞砸了。 这是代码:

def debounce(var, db):
    if var == 1 and db == 0:
        db = 1
    elif var == 0:
        db = 0
    else:
        var = 0
    return var, db


while True:
    mouse_buttons = get_mouse_buttons()    # -This is the fuction that if the mouse's buttons are pressed

    pressed, db = debounce(mouse_buttons[0], db)
    mouse_buttons = (pressed, 0, 0)

    print(mouse_buttons[0])

我的预期输出是,如果我按下鼠标按钮,那么它会一次为 1,然后变为 0,直到我松开并再次按下它。当前代码第一次给出1,不管怎样,之后只给出0。 (我测试过,与returns鼠标按下按钮的功能无关。)

去抖总是需要设置db。您不会在所有情况下都这样做。如果您希望 pressed 成为去抖动值,那么您需要:

def debounce(var, db):
    if var == 1 and db == 0:
        db = 1
    else:
        db = 0
    return db, var

为了解决这个问题,请随时间将状态写在纸上:

var = 0 1 1 1 1 1 1 0 0 0 1 1 1
 db = 0 1 0 0 0 0 0 0 0 0 1 0 0

只是为了确认您的测试预期

var  |  db  |  var,db 
----------------------
  0     0      0,0
  0     1      0,0
  1     0      1,1
  1     1      0,1

如果这是正确的,那么我不确定你的函数是否这样做。

这更简单 - 重现相同的逻辑 table。

def debounce(var, db):
    return var and not db, var

在这种情况下,当 var 为 0 - 这将 return 0,0 当 var 为 1 时,这将 return 1,1 if db == 0 当 var 为 0 时,这将 return 0,1 if db == 1

附录 - 当我重新 运行 你的代码时 get_mouse_buttons() 替换为:

def get_mouse_buttons():
    return (int(input('>>').lower()=='y'), 0, 0)

在您决定(通过键入 Y/y)鼠标按钮是否被按下的地方,事实证明您的去抖动代码 - 尽管笨拙确实做了预期的事情 - 你的循环只打印 1 时您最初键入 'y' 或者您从非 'y' 变为 'y' - 即您的代码正确检测到从未按下到按下的初始变化。

既然你说你的代码不起作用,那么很明显怀疑你的 get_mouse_buttons() 函数 - 你声称它工作正常。