PIC Microcontroller Bit Math Method

Detecting bit changes

by Scott Dattalo

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