1 / 16

Operators and Expressions

Operators and Expressions. Bitwise Operators: Bitwise operators perform functions that will affect the operand at the bit level. These operators work on non–floating point operands: char, int, and long. ` Bitwise Operators: Ones Complement: ~ Left Shift: << Right Shift: >>

andra
Télécharger la présentation

Operators and Expressions

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Operators and Expressions Bitwise Operators: Bitwise operators perform functions that will affect the operand at the bit level. These operators work on non–floating point operands: char, int, and long. ` Bitwise Operators: Ones Complement: ~ Left Shift: << Right Shift: >> AND: & Exclusive OR: ^ OR (Inclusive OR): |

  2. Some Examples of Bitwise Operations Assume that an unsigned character y = 0xC9. OperationResult x = ~y; x = 0x36 x = y << 3; x = 0x48 x = y >> 4; x = 0x0C x = y & 0x3F; x = 0x09 x = y ^ 1; x = 0xC8 x = y | 0x10; x = 0xD9

  3. Logical and relational operators: Logical and relational operators are all binary operators but yield a result that is either TRUE or FALSE. TRUE is represented by a nonzero value, and FALSE by a zero value. Logical Operators: AND && OR | | These differ greatly from the bitwise operators in that they deal with the operands in a TRUE and FALSE sense. The AND logical operator yields a TRUE if both operands are TRUE, otherwise, a FALSE is the result. The OR logical operator yields a TRUE if either of the operators is TRUE. In the case of an OR, both operators must be FALSE in order for the result to be FALSE.

  4. Examples: Assume x = 5 and y = 2; (x && y) is TRUE, because both are non-zero. (x & y) is FALSE, because the pattern 101b and 010b ANDed bitwise are zero. (x || y) is TRUE, because either value is non-zero. (x | y) is TRUE, because the pattern 101b and 010b Inclusive-ORed bitwise is 111b (non-zero).

  5. Relational Operators: Relational operators use comparison operations. As in the logical operators, the operands are evaluated left to right and a TRUE or FALSE result is generated. They effectively “ask” about the relationship of two expressions in order to gain a TRUE or FALSE reply. Relational operators Is Equal to == Is Not Equal to != Less Than < Less Than or Equal to <= Greater Than > Greater Than or Equal to >=

  6. Examples: Assume that x = 3 and y = 5. OperationResult (x == y) FALSE (x != y) TRUE (x < y) TRUE (x <= y) TRUE (x > y) FALSE (x >= y) FALSE

  7. INCREMENT, DECREMENT, AND COMPOUND ASSIGNMENT Increment Operators Increment operators allow for an identifier to be modified, in place, in a pre-increment or post-increment manner. For example, x = x + 1; is the same as ++x; // pre-increment operation and as x++; // post-increment operation For example, i = 1; k = 2 * i++; // at completion, k = 2 and i = 2 i = 1; k = 2 * ++i; // at completion, k = 4 and i = 2 In the first case, i is incremented after the expression has been resolved. In the second case, i was incremented before the expression was resolved.

  8. Decrement Operators Decrement operators function in a similar manner, causing a subtraction-of-one operation to be performed in a pre-decrement or post-decrement fashion: j--; // j = j-1 --j; // j = j-1

  9. Compound Assignment Operators Compound assignment operators are another method of reducing the amount of syntax required during the construction of a program. A compound assignment is really just the combining of an assignment operator ( = ) with an arithmetic or logical operator. The expression is processed right to left, and syntactically it is constructed somewhat like the increment and decrement operators. Here are some examples: a += 3; // a = a + 3 b -= 2; // b = b – 2 c *= 5; // c = c * 5 d /= a; // d = d / a

  10. This combining of an assignment with another operator works with modulo and bitwise operators (%, >>, <<, &, |, and ^) as well as the arithmetic operators (+, –, *, and /), as shown below: a |= 3; // a = a OR 3 b &= 2; // b = b AND 2 c ^= 5; // c = c exclusively ORed with 5 PORTC &= 3; // Write the current value on PORTC // ANDed with 3 back to port C. // Forcing all of the bits except the // lower 2 to 0 and leaving the lower 2 // bits unaffected.

  11. Some Data Types Widely Used by C Compilers Data Type Size in Bits Data Range/Usage unsigned char 8-bit 0 to 255 char 8-bit –128 to +127 unsigned int 16-bit 0 to 65,535 int 16-bit –32,768 to +32,767 unsigned long 32-bit 0 to 4,294,967,295 long 32-bit –2,147,483,648 to +2,147,483,648 float 32-bit ±1.175e-38 to ±3.402e38 double 32-bit ±1.175e-38 to ±3.402e38

  12. Unsigned char Because the AVR is an 8-bit microcontroller, the character data type is the most natural choice for many applications. The unsigned char is an 8-bit data type that takes a value in the range of 0–255 (00–FFH). It is one of the most widely used data types for the AVR Remember that C compilers use the signed char as the default unless we put the keyword unsigned in front of the char (see Example 7-1). We can also use the unsigned char data type for a string of ASCII characters, including extended ASCII characters. Example 7-2 shows a string of ASCII characters. See Example 7-3 for toggling a port 200 times.

  13. Example 7-1: Write an AV C program to send values 00–FF to Port B. Solution: #include <avr/io.h> //standard AVR header int main(void) { unsigned char z; DDRB = 0xFF; //PORTB is output for(z = 0; z <= 255; z++) PORTB = z; return 0; } //Notice that the program never exits the for loop because if you //increment an unsigned char variable when it is 0xFF, it will //become zero.

  14. Example 7-2: Write an AVR C program to send hex values for ASCII characters of 0, 1, 2, 3, 4, 5, A, B, C, and D to Port B. Solution: #include <avr/io.h> //standard AVR header int main(void) //the code starts from here { unsigned char myList[]= "012345ABCD"; unsigned char z; DDRB = 0xFF; //PORTB is output for(z=0; z<10; z++) //repeat 10 times and increment z PORTB = myList[z]; //send the character to PORTB while(1); //needed if running on a trainer return 0; }

  15. Example 7-3: Write an AVR C program to toggle all the bits of Port B 200 times. Solution: //toggle PB 200 times #include <avr/io.h> //standard AVR header int main(void) //the code starts from here { DDRB = 0xFF; //PORTB is output PORTB = 0xAA; //PORTB is 10101010 unsigned char z; for(z=0; z < 200; z++) //run the next line 200 times PORTB = ~ PORTB; //toggle PORTB while(1); //stay here forever return 0; }

  16. References: 1)Embedded C Programming and the Atmel AVR, 2nd Edition Author: Barnett/Cox/O'Cull Publisher: Cengage Learning 2) The AVR Microcontroller and Embedded Systems: Using Assembly and C Author:Muhammad Ali Mazidi, Sarmad Naimi, Sepehr Naimi Publisher: Prentice Hall

More Related