我正在尝试找出解决问题的最佳方法。 我有一个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
...
答案 0 :(得分:0)
您可以使用一个计时器(AT89S52有多个计时器,如果您的项目中未使用其他计时器,则可以使用其中之一)和一个同步状态机。对于每个键和确定的过渡,状态机都有4个状态。我发现此链接非常详尽地解释了该概念。尽管此链接中提供的示例代码使用C语言,但是您可以轻松地将其“翻译”为汇编代码。如果您需要帮助,请发表评论。
https://www.eeweb.com/profile/tommyg/articles/debouncing-push-buttons-using-a-state-machine-approach