Here's a version that saves the changes and then checks if wither input went high (but doesn't check high to lows):
movf PORTB,w ;get current state
xorwf last_in,w ;compare to previous
xorwf last_in,f ;save changes
andwf last_in,w ;did either go high?
andlw (1<<4)||(1<<5) ;only want bits 4 and 5
skpnz
goto nolowtohighs
; either bit4 or bit5 went from 0 to 1
...
nolowtohighs
Here's one that does a check and then saves the changes (and will allow you to test high to lows if you want)
movf PORTB,w ;get current state
movwf temp
xorwf last_in,w ;compare to previous
andwf temp,w ;did either go high?
andlw (1<<4)||(1<<5) ;only want bits 4 and 5
skpnz
goto save changes
; low to high change - do whatever
btfsc temp,4
do whatever for bit 4 going high
btfsc temp,5
do whatever for bit 5 going high
save_changes:
movf temp,w
xorwf last_in,w
xorwf last_in,f
Also:
See also:
Andrew D. Vassallo says:
Bob Ammerman says: ; compare register "last_inputs" to
current PORTB reading ;
; direct computation of ~last_inputs & new_value
comf last_inputs,W
andwf PORTB,W
andlw (1<<4)|(1<<5)
skpz
goto got_a_0_to_1