movf PORTB,w ; get newstate 0101
xorwf LastKeystate,w ; state changes 1100 => 1001
xorwf LastKeystate,f ; Last=New. 1100=> 0101
andlw b'11111111'; test wreg if any bits changed
btfss STATUS,Z; skip zero set, else (statechange)
clrf Dbouncecount; reset counter (counts every 10msec in ISR)
btfss Dbouncecount,1 ; skip if bit 1 set=> 20ms passed, else
goto Testkeyhold;
movf LastKeystate,w; 0101
xorwf DbKeystate,w; get changes bet. current state and debounced state. 0110 => 0011
movwf KeyTrans; save in transition byte. 0011 (transition bits)
xorwf DbKeystate,f; apply them to DB state 0110 => 0101
Testkeyhold
movf DbKeystate,w ; 0101
andwf HoldKeystate,w ;zero Hold bits if matching key is released - wreg. 0011 => 0001
xorwf HoldKeystate,w ; get Transition from Hold to release 0011 => 0010
movwf Holdtrans; update Holdtransition byte. 0010
xorwf KeyTrans,f ; toggle any matching release from clicks off, release from hold priority.
xorwf HoldKeystate,f ; now immediately switch off Hold if a key is released - file. 0011 => 0001
xorwf DbKeystate,w ; get newly pressed keys to test for hold.(state change) 0101 => 0100
btfss STATUS,Z; skip if no new key pressed, else
clrf Holdcount ; clear counter (incr every 10ms in ISR) for ANY new DB keypress
Testholdcount ; test if timer expired
btfss Dbouncecount,6 ; 640 ms
goto Keydone
movf DbKeystate,w; 0101
xorwf HoldKeystate,w ; get statechanges 0001 => 0100
iorwf Holdtrans,f; update hold transition byte. 0010 => 0110 (transition bits)
;using what's still in wreg to apply changes 0100
xorwf HoldKeystate,f;apply changes 0001 => 0101
Keydone return