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