【问题标题】:Simplest code to handle any key press - 8051处理任何按键的最简单代码 - 8051
【发布时间】:2018-10-10 04:08:38
【问题描述】:

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

【问题讨论】:

    标签: microcontroller keydown keyup 8051 debouncing


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多