1

我希望有人能在这方面帮助我。

我为 8051 微控制器创建了一个函数,该函数接受来自按钮的输入,并且我使用 8 位的循环缓冲区来存储键状态,这样我就可以使去抖动不再成为问题。

将数据存储在缓冲区中并检查一个键的代码如下:

VALIDPRESS equ 0Fh   ;0Fh = detect as valid if key held somewhat
CYCLICBUFFER equ 10h ;10h is a randomly picked value as example

mov R0,#CYCLICBUFFER ;memory location for key buffer
mov C,KEY            ;KEY = GPIO pin button is attached to
mov A,@R0            ;A = data found at address CYCLICBUFFER
rlc A                ;Shift in new detected value
mov @R0,A            ;Store updated byte to address CYCLICBUFFER
cjne A,#VALIDPRESS,nokey ;See if buffer contains bits in right order
;If it does, the key is valid
nokey:

只有一件事......我的可用内存非常有限,我想我可以以某种方式使用 8 位缓冲区中的一位来存储标志。我希望该标志表示是否允许按住或仅按下该特定键。

我将在左栏中显示当检测到按键时数据如何流入我的缓冲区。我希望发生的是下面右栏中显示的内容。

令 x 等于未知值,a 到 m 分别代表新的按钮扫描值 1 到 13,并且让 Z 等于不允许被 keyscan 例程更改的自定义标志。

Loop count,    Current data flow,    Desired data flow
    0          xxxxxxxx              Zxxxxxxx
    1          xxxxxxxa              Zxxxxxxa
    2          xxxxxxab              Zxxxxxab
    3          xxxxxabc              Zxxxxabc
    4          xxxxabcd              Zxxxabcd
    5          xxxabcde              Zxxabcde
    6          xxabcdef              Zxabcdef
    7          xabcdefg              Zabcdefg
    8          abcdefgh              Zbcdefgh
    9          bcdefghi              Zcdefghi
    10         cdefghij              Zdefghij
    11         defghijk              Zefghijk
    12         efghijkl              Zfghijkl
    13         fghijklm              Zghijklm

有没有一种简单的方法可以在不使用大量内存或大量时钟周期的情况下解决这个问题?

4

0 回答 0