Я надеюсь, что кто-то может помочь мне в этом.
Я сделал функцию для микроконтроллера 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 равняется пользовательскому флагуэто никогда не может быть изменено подпрограммой keycan.
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
Есть ли простой способ решить эту проблему без использования большого количества памяти или большого количества тактов?