please dont rip this site

PIC Microcontoller Bit Math Method

Setting bit number X

Tracy Smith says

Here are a couple of ideas for getting 1<<TestBit
10 cycles:

    btfsc    TestBit,2
     movlw   b'11111100'
    addwf    TestBit,f

    incf     TestBit,w
    btfsc    TestBit,1
     iorwf   TestBit,f

    incf     TestBit,f

     swapf   TestBit,f

another way (7 cycles [including the call])

    andlw    7
    addwf    pcl,f
    retlw    1
    retlw    2
    retlw    4
    retlw    8
    retlw    0x10
    retlw    0x20
    retlw    0x40
    retlw    0x80

or probably more to the point

    movf     portb,w
    movwf    portb_shadow

    btfss    TestBit,2
     swapf   portb_swadow,f

    btfss    TestBit,0
     rlf     portb_shadow,f

    movlw    b'10000000'
    btfss    TestBit,1
     movlw   b'00100000'

    andwf    portb_shadow,f

     goto    _the_bit_is_set


Kevin Blain says:

clrf    mask    ; empty the mask

; a file called bit contains the 0 to 7 value of the bit position

incf    bit    ; make it 1 to 8, so decfsz works nicely
bsf    STATUS, C    ; set the carry flag. This will be rotated in 'bit' times

rlf    mask, f
decfsz    bit, f    ; skip out after 'bit' times.
goto    loop
.....               ; rest of code...

Of course, it would be good to ensure that bit is not greater than 7 when
entering the routine.

Scott Dattalo says


  ;Get a pointer to the byte containing the bit we want:

    rrf   bit_position,w
    movwf fsr

    rrf   fsr,f
    rrf   fsr,w
    andlw BIT_ARRAY_MASK
    addlw bit_array
    movwf fsr

  ; find 1<<(bit_position&7) [note, this could be made 2-cycles
  ;                           shorter]

    movlw  0101b
    btfsc  bit_position,0
     movlw 1010b

    movwf  mask

    movlw  0011b
    btfsc  bit_position,1
     movlw 1100b

    andwf  mask,f

    btfsc  bit_position,2
     swapf mask,f

  ; now set or clear the bit

    movf   mask,w
    iorwf  indf,f         ; Assume we're setting.
    btfss  new_state,0
     xorwf indf,w         ; assumption was wrong

Dmitry says:

;Probably it would be better to pre allocate bit position value in cell
;shifted by one bit to left, like xxxx.yyyz where xxxx is byte offset
;and yyy bit offset. It let us write more tight code for this case.

        swapf   bit_position,W
        andlw   0x0F
        addlw   bit_array
        movwf   FSR

        movlw   1
        btfsc   bit_position,2  ;y.1
        movlw   4
        movwf   mask

        btfsc   bit_position,1  ;y.0
        addwf   mask,F

        btfsc   bit_position,3  ;y.2
        swapf   mask,F

        movfw   mask
        iorwf   INDF,F
        btfss   bit_position,0  ;we can use z for this why not?
        xorwf   INDF,F

Bob Ammerman says:

To turn on bit "BitNum" of port "PortNum":

    movf       PortNum,W
    movwf    FSR

    movf       BitNum,W
    call         BitToMask
    iorwf       INDF,F

To turn off bit "BitNum" of port "PortNum":

    movf       PortNum,W
    movwf    FSR

    movf       BitNum,W
    call          BitToMask
    xorlw       0xFF
    andwf      INDF,F

; To test bit "BitNum" or port "PortNum"

    movf    PortNum,W
    movwf FSR
    movf    BitNum,W
    call       BitToMask
    andwf  INDF,W

; At this point Z is set if PortNum,BitNum was clear
;  Z is clear if PortNum,BitNum was set

    addwf    pcl
    retlw    1
    retlw    2
    retlw    4
    retlw    8
    retlw    16
    retlw    32
    retlw    64
    retlw    128

See Also:


file: /Techref/microchip/math/bit/setbit.htm, 5KB, , updated: 2003/6/10 12:58, local time: 2024/7/13 19:09,

 ©2024 These pages are served without commercial sponsorship. (No popup ads, etc...).Bandwidth abuse increases hosting cost forcing sponsorship or shutdown. This server aggressively defends against automated copying for any reason including offline viewing, duplication, etc... Please respect this requirement and DO NOT RIP THIS SITE. Questions?
Please DO link to this page! Digg it! / MAKE!

<A HREF=""> Setting bit number X</A>

After you find an appropriate page, you are invited to your to this massmind site! (posts will be visible only to you before review) Just type a nice message (short messages are blocked as spam) in the box and press the Post button. (HTML welcomed, but not the <A tag: Instead, use the link box to link to another page. A tutorial is available Members can login to post directly, become page editors, and be credited for their posts.

Link? Put it here: 
if you want a response, please enter your email address: 
Attn spammers: All posts are reviewed before being made visible to anyone other than the poster.
Did you find what you needed?


Welcome to!


Welcome to!