Bitwise operations and masks: basics, help?


Closed Thread
Results 1 to 12 of 12

Hybrid View

  1. #1
    xnihilo's Avatar
    xnihilo Guest

    Smile Bitwise operations and masks: basics, help?

    Hi,

    I know there are the bitwise operators to work at bit level. I'm not familiar with these and logic was never my strong point. That's why I would need some help here.

    I'm using a 7 segments led display (plus a dot, which makes 8 leds, and two ground pins, for a total of 10 pins).
    Each segment is a led. The 7 sements (plus the dot led) have common cathode.
    Each led anode is connected to a pin of a PIC16F684. So to turn on a segment, I just need to output 5V on the appropriate pin. To display a digit, I just have to turn on the appropriate pins/segments/leds.

    I'm using RC4 to RC0 for 5 of the 7 segments (segments a to e) and RA1 to RA2 for the 2 last segments (f, g) (while the "dp" dot is on RA0).

    I have to set the appropriate pins to display the adequate segments to display a digit.
    For example, to display digit "0", I need to turn on the pins that will light the segments a, b, c,d, d, e, f, thus, for my design, the pins RC4 to RC0 and RA1. (a little complicated, yes).
    Anyway, I have to set portA and portC to:


    porta: xxxx10x, portc: x11111

    where the "x" represent bits that must not be changed.

    How can I replace the needed bits without changing the "x" bits?

    I guess I should use bits mask but what is the magic?

    Thanks for any help here.

    Regards.

  2. #2
    Join Date
    Sep 2004
    Location
    montreal, canada
    Posts
    6,898


    Did you find this post helpful? Yes | No

    Default

    when you want to clear a bit you use AND, set a bit OR

    portc: x11111

    PORTC=PORTC | %00011111

    <hr>
    porta: xxxx10x,

    for this one you may also do it simple..
    TempVar=PORTA
    TempVar.1=0
    TempVar.2=1
    PORTA=TempVar

    OR, in some case, the following will work without much problem
    PORTA.1=0
    PORTA.2=1

    HTH
    Steve

    It's not a bug, it's a random feature.
    There's no problem, only learning opportunities.

  3. #3
    xnihilo's Avatar
    xnihilo Guest


    Did you find this post helpful? Yes | No

    Smile

    Quote Originally Posted by mister_e View Post
    when you want to clear a bit you use AND, set a bit OR

    portc: x11111

    PORTC=PORTC | %00011111

    <hr>
    porta: xxxx10x,

    for this one you may also do it simple..
    TempVar=PORTA
    TempVar.1=0
    TempVar.2=1
    PORTA=TempVar

    OR, in some case, the following will work without much problem
    PORTA.1=0
    PORTA.2=1

    HTH
    Hello,

    Simple?
    Not so simple because each digit on the 7segments display needs (in my design) a pair of bytes for porta and portc that are found in a 10 entries array, and I prefer not to use intermediate variable.
    Sorry but I didn't understand your example above:

    portc: x11111
    PORTC=PORTC | %00011111
    porta: xxxx10x,



    let's say porta value is %00011001 and I need to alter only bits 1 and 2 with the following pattern stored in a BYTE varible called "avar":
    variable avar value is %-----10-

    ???

    Can I isolate a chunk of a byte and insert it at a desired position in anoter byte?
    Last edited by xnihilo; - 18th April 2008 at 15:43.

  4. #4
    Join Date
    Sep 2004
    Location
    montreal, canada
    Posts
    6,898


    Did you find this post helpful? Yes | No

    Default

    Yes i see some different ways, just paste your pattern here and where to send them, i'll give you something to think about.
    Steve

    It's not a bug, it's a random feature.
    There's no problem, only learning opportunities.

  5. #5
    xnihilo's Avatar
    xnihilo Guest


    Did you find this post helpful? Yes | No

    Smile Bits replacement

    Example:

    The bits I need to set to display the "0" digit on the 7 segments display are:

    on porta: %***01* , all other bits are left untouched
    on portc: %*11111 , bit 5 is left untouched.

    I have two arrays of bytes:
    cval VAR BYTE[10] and aval VAR BYTE[10], each index represents a duet of bytes containing the bits configuration to display a digit.
    arrays index 0 for digit "0",... up to digit "9" in index 9.

    I only need to 'insert' chunks of bits in porta and portc registers.


    For a given array index (representing the 7 bits to make a digit):
    For porta I will need to replace bits 1 and 2 from porta by bits 1 and 2 from aval variable.
    For portc I will need to replace bits 4 to 0 from portc by bits 4 to 0 from cval variable

    is this clear ???

  6. #6
    Join Date
    Sep 2004
    Location
    montreal, canada
    Posts
    6,898


    Did you find this post helpful? Yes | No

    Default

    Why not a WORD array instead? Anyways, yes it's clear enough. I'll do something a little bit later.
    Steve

    It's not a bug, it's a random feature.
    There's no problem, only learning opportunities.

Members who have read this thread : 0

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts