我希望有人能在这方面帮助我。
我为 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
有没有一种简单的方法可以在不使用大量内存或大量时钟周期的情况下解决这个问题?