PIC Microcontoller Bit Math Method

Setting bit number X

Tracy Smith says

Here are a couple of ideas for getting 1<<TestBit
10 cycles:
2^n:
 clrw
 btfsc TestBit,2
 movlw b'11111100'
 addwf TestBit,f
 incf TestBit,w
 btfsc TestBit,1
 iorwf TestBit,f
 incf TestBit,f
 skpnc
 swapf TestBit,f
.........
another way (7 cycles [including the call])
two_to_n:
 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
 skpnz
 goto _the_bit_is_set
.lo

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
loop:
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

set_bit:
 ;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.
set_bit:
 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
BitToMask:
 addwf pcl
 retlw 1
 retlw 2
 retlw 4
 retlw 8
 retlw 16
 retlw 32
 retlw 64
 retlw 128

See Also:

Code:


file: /Techref/microchip/math/bit/setbit.htm, 5KB, , updated: 2003年6月10日 12:58, local time: 2025年9月3日 07:00,
40.74.122.252:LOG IN

©2025 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="http://techref.massmind.org/techref/microchip/math/bit/setbit.htm"> 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 massmind.org!

Welcome to techref.massmind.org!

.

AltStyle によって変換されたページ (->オリジナル) /