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

Simplest code to handle any key press - 8051

我正在尝试找出解决我的问题的最佳方法。 我有一个 AT89S52 微控制器,有 3 个按钮连接到 3 个独立的 GPIO 引脚,这样微控制器就可以根据这些按钮执行不同的功能。

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

如果我在我的硬件中添加施密特触发器但我不想(再次)重做我的电路板,我下面提供的代码可能会起作用。

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

我问是因为按键会遇到一种叫做"bouncing"的现象,只要有人按下一个键,它实际上会高速抖动,微控制器会认为它被按下并释放了多次。如果用户合法地只按了一次键,我不希望这种情况发生。

;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
...

你可以使用一个定时器(AT89S52有多个定时器,如果你的项目中没有其他定时器,你可以使用其中一个)和一个同步状态机。状态机针对每个键和明确的转换有 4 个状态。我发现这个 link 非常彻底地解释了这个概念。虽然此 link 中提供的示例代码是用 C 语言编写的,但您可以轻松地 "translate" 将其添加到您的汇编代码中。如果您需要这方面的帮助,请发表评论。

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