代码之家  ›  专栏  ›  技术社区  ›  Mike -- No longer here

最简单的代码来处理任何按键-8051

  •  0
  • Mike -- No longer here  · 技术社区  · 6 年前

    我想找出解决我问题的最佳方法。 我有一个AT89S52微控制器与3个按钮连接到3个单独的GPIO引脚,使微控制器可以执行基于这些按钮的不同功能。

    我正在尝试编写代码,等待用户按下这三个键中的任何一个。我所说的按键,是指系统检测到任何一个按键被完全按下,然后被完全释放。

    在不添加中断的情况下,有没有一种方法可以修改仅用几行显示的代码来可靠地检测用户按键?

    我问这个问题是因为按键会经历一种叫做“弹跳”的现象,一旦有人按下一个键,它就会以高速抖动,微控制器会将其视为按键被多次按下和释放。如果用户只合法地按了一次键,我不希望发生这种情况。

    ;KEY1I, KEY2I and KEY3I = GPIO pins connected to the keys
    ;Pin value is low when key is held down
    
    w4key:
      ;begin key scan
      jnb KEY1I,w4keyend
      jnb KEY2I,w4keyend
      jnb KEY3I,w4keyend
      ;here, nothing is pressed so scan again
    sjmp w4key
    w4keyend:
      ;key pressed. Hope for release
      jnb KEY1I,w4key
      jnb KEY2I,w4key
      jnb KEY3I,w4key
      ;here, key is released so return.
    ret
    
    mainline:
      ;do something
      acall w4key
      ;do another thing
    ...
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   Matthias    6 年前

    您可以使用一个计时器(AT89S52有几个计时器,如果您的项目中没有其他计时器,您可以使用其中一个)和一个同步状态机。状态机对于每个键和确定的转换有4个状态。我发现这个链接对这个概念的解释相当透彻。尽管此链接中提供的示例代码是C语言的,但您可以轻松地将其“翻译”为汇编代码。如果你需要这方面的帮助,请留下评论。

    https://www.eeweb.com/profile/tommyg/articles/debouncing-push-buttons-using-a-state-machine-approach