## Easiest way to handle keypress with 1-bit option on memory restricted system

Started by 7 months ago43 views

I'm looking for a simple way to handle key presses as well as store an option to allow a repeating key or just a one time press and release. Through experimentation, I was able to capture the value while the key is held down and when the key is only pressed once. But that involves me adding an instruction and burning my code onto the chip again, but I don't want to do that.

Since each memory location in KEYS is 8 bits, I feel somehow I can change that 8-bit cyclic buffer that cycles the current button status in to a 7-bit cyclic buffer while using one bit exclusively for storing the option to have the key value returned only when the key is pressed once or while the key is held.

So I feel something in this fragment needs modification, but is there a way to do it with using as few clock cycles as possible?

        mov A,@R0    ;put value in our mini 8-bit cyclic buffer
rlc A
mov @R0,A


Here's my complete key scanning code. I cannot modify the first 7 lines inside the rescan loop since they load specific values from a table that makes the correct key returned.

    KEYIO equ P0
KEYS equ 0B0h ;key storage
ISPRESS equ 0Fh ;To avoid bouncing
scankey:
mov DPTR,#scans  ;to key scan table
mov R0,#KEYS+0Dh ;14 possible keys
rescan:
clr A
movc A,@A+DPTR ;load value to put on key lines to prepare matrix for that number
mov KEYIO,A    ;store in A
inc DPTR
clr A
movc A,@A+DPTR ;xor next scan value
xrl A,KEYIO    ;with captured key
inc DPTR
;If correct key is captured, then A=0
dec A        ;Here we set carry in 2 clocks because A=0
mov A,@R0    ;put value in our mini 8-bit cyclic buffer
rlc A
mov @R0,A
cjne A,#ISPRESS,npress ;See if key is literally pressed
;could reset @R0 here to allow multi-press
mov A,R0             ;it is so get pointer
subb A,#KEYS         ;and substract start of pointer
ret                  ;A=# representing key pressed
npress:
dec R0                 ;Go to next key
cjne R0,#KEYS-1,rescan ;Keep going until all keys are processed
mov A,#0FFh            ;All keys processed, nothing captured so return FFh
ret