Assignment Operators

Assignment operators available in C are:  =, +=, -=, *=, /=, %=,<<=, >>=, &=, ^=, |= which are used to assign a value of the Right hand operand to a storage location or a variable at the Left hand side.

We will illustrate the five basic operators used in AVR programming.

Operator       Description
&=             a &= b is the same as a = a & b
|=             a |= b
is the same as a = a | b
^=             a ^= b
is the same as a = a ^ b
<<=            a <<= b
is the same as a = a << b    
>>=            a >>= b
is the same as a = a >> b    

Other assignment operators (+=, -=, *=, /=, %=) can also be written in a similar method as described above.

By combining the above operators, we can easily control (turn on or turn off) a single bit without affecting other bits. As assigned above, consider the variable “a” where a = 01101111. Suppose we need to make the 5th bit in this byte as 0 (clear 5th bit), how do we do it?

Clear Bit

We know that 1 & 0 = 0. All we need to do is AND the particular bit with 0 to clear the bit. But again, we need to perform a series of careful operations so that other bits are not affected. Suppose the existing value of PORTC = a, where a = 01101111, then PORTC &= ~(0x20) will fulfill our requirement of clearing the 5th bit. How?

PORTC &= ~(0x20) is the same as:
PORTC = PORTC & ~(0x20)               // Remember Assignment Operators?
PORTC = PORTC & ~(00100000)          
// 0x20 in binary format
PORTC = PORTC & 11011111             
// NOT (00100000)
PORTC = 01101111 & 11011111          
// AND Operator
PORTC = 01001111                     
// Now 5th bit is cleared

It may seem unnecessary to use the NOT operator. We can as well write PORTC = PORTC & DF or even PORTC = 11011111. But it is easier to identify the bit in question in 00100000, rather than 11011111. Hence programmers generally prefer to use a NOT operator.

You can also change more than one bit at a time by changing (0x20) into a desirable value. If you write PORTC = PORTC & ~(0xff), then all the bits in PORTC will be cleared.

Set Bit

Now we have the 5th bit of PORTC cleared. What if we need to set it again? Don’t we require to do this for our blinking LED? PORTC |= (0x20) will help us to set this bit. We have PORTC = 01001111.
PORTC |= (0x20) is the same as:
PORTC = PORTC | (0x20)
PORTC = 01001111 | 0x20
PORTC = 01001111 | 00100000          
// OR Operator
PORTC = 01101111                     
// 5th bit is set

Well, we have achieved what we wanted to. The 5th bit is set again.

Toggle Bit

What if we wanted to toggle a bit, irrespective of its current state? Do you remember we have parked another operator which we learnt and never used it? It is XOR (^) operator to our rescue now. Let us see how we can exploit it.

Suppose we write PORTC ^= (0x20)
PORTC = PORTC ^ 0x20          
// PORTC (XOR) 0x20
PORTC = PORTC ^ 00100000      
// 0x20 in binary format
PORTC = 01101111 ^ 00100000   
// XOR Operator
PORTC = 01001111              
// 5th bit is cleared

Now applying (XOR) on PORTC again,
PORTC = 01001111 ^ 0x20        // PORTC value from previous Operation
PORTC = 01001111 ^ 00100000   
// XOR Operator
PORTC = 01101111              
// Voila! 5th bit is set again to 1

The above results can also be achieved using binary format.

PORTC |= 0b00100000            // Set a bit
PORTC & = ~0b00100000          // Clear a bit
PORTC ^ = 0b00100000           // Toggle a bit

Check bit

Finally if you want to check whether a bit is set or clear, then you can use AND.
Let PORTC = 01101111
Bit = PORTC & 0x20
Bit = 01101111 & 00100000

Since the 5th bit is set, this operation results in 1 because 1 & 1 = 1. If it is not set, then 0 & 1 = 0 and “Bit” will be assigned a value of 0. <avr/sfr_defs.h> library has functions which can be utilized to check if a bit is set (bit_is_set) or clear (bit_is_clear) without taking the pain of writing our own code. These functions return a 0 if bit is set and non-zero if it is clear.

Tutorial index:

  1. Introduction: 
  2. Electronics:
  3. Breadboard-Programmer Setup:
  4. Programming:
  5. Blinking LED:
  6. Bitwise Operators:
  7. Assignment Operators:
  8. Bitwise Shift Operators:

Do you have anything to say?
Visit the Forum to discuss, learn and share anything related to robotics and electronics !!

rss feeds

Featured Videos


Recent Articles

Atmega8 Development Board

A great step-by-step tutorial on building your own Atmel AVR based Atmega8 development board. The board is ideal for beginners with detailed explanation and pictures More...

L293D Motor Driver

For robots to do work, you need to know how to control a motor. L293D is a cleverly packed IC which can control two DC motors in both directions: forwards and reverse. Here is a detailed explanation of building a board based on L293D ICMore...

Hobby Servo Tutorial

Servo Motor is a device which uses error-sensing feedback signals to determine and control the position of a motor shaft. The term "servomechanism" closely relates to servo motors..More...

Blinking LED Tutorial

This is similar to what we achieve in any "Hello World" program. However, it is not just limited to blinking LED but scratches the surface of AVR-GCC programming... More...

Kindly Donate

If this site has helped you, then kindly consider a Donation to say "Thank You!!". Donation might help us keep all this information available for free and also pay for the resources.

If that is difficult, then a simple "Hi" in the forum would still do good :)