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

时间:2018-10-10 04:08:39

标签: microcontroller keydown keyup 8051 debouncing

我正在尝试找出解决问题的最佳方法。 我有一个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 个答案:

答案 0 :(得分:0)

您可以使用一个计时器(AT89S52有多个计时器,如果您的项目中未使用其他计时器,则可以使用其中之一)和一个同步状态机。对于每个键和确定的过渡,状态机都有4个状态。我发现此链接非常详尽地解释了该概念。尽管此链接中提供的示例代码使用C语言,但是您可以轻松地将其“翻译”为汇编代码。如果您需要帮助,请发表评论。

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