Ch06 Embedded C
Ch06 Embedded C
Introduction to Embedded
Programming Using C
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 1
Agenda
History of C
Fundamentals of C
Data Types
Variables, Constants and Arrays
Keywords
Functions (Overview)
Declarations
Statements and Expressions
printf() Library Function (Special use in this
class)
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 2
Agenda
Operators and Conditional Statements
Preparing and Running a C Program
Control Statements: Making Decisions
Functions
Program Structure
Arrays
Pointers
Structures and Unions
Additional Features of C
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 3
Section 1.0
Using C in an Embedded
Environment
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 4
Just the Facts
C was developed in 1974 in order to write
the UNIX operating system
C is more "low level" than other high level
languages (good for MCU programming)
C is supported by compilers for a wide
variety of MCU architectures
C can do almost anything assembly
language can do
C is usually easier and faster for writing
code than assembly language
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 5
Busting the Myths
The truth shall set you free…
Compiler
Assembly Source Files Driver
(.asm or .s) Program
MPLAB® IDE
Linker Script Debug Tool
(.lkr or .gld) COFF
Debug File
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 8
Development Tools Data Flow
C Compiler
.c Preprocessor .h
C Source File C Header File
Compiler
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 9
C Runtime Environment
C Compiler sets up a runtime environment
Allocates space for stack
Initialize stack pointer
Allocates space for heap
Copies values from Flash/ROM to variables in
RAM that were declared with initial values
Clear uninitialized RAM
Disable all interrupts
Call main() function (where your code starts)
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 10
C Runtime Environment
Runtime environment setup code is
automatically linked into application by
most PIC® MCU compiler suites
Usually comes from either:
crt0.s / crt0.o (crt = C RunTime)
startup.asm / startup.o
User modifiable if absolutely necessary
Details will be covered in compiler specific
classes
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 11
Fundamentals of C
A Simple C Program
Example
Preprocessor Header File
Directives
#include <stdio.h>
Constant Declaration
#define PI 3.14159 (Text Substitution Macro)
int main(void)
{
float radius, area; Variable Declarations
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 13
Comments
Definition
Comments are used to document a program's functionality
and to explain what a particular block or line of code does.
Comments are ignored by the compiler, so you can type
anything you want into them.
Block comments:
Begin with /* and end with */
May span multiple lines
/********************************************************
* Program: hello.c
* Author: R. Ostapiuk
********************************************************/
#include <stdio.h>
/* Function: main() */
int main(void)
{
printf(“Hello, world!\n”); /* Display “Hello, world!” */
}
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 15
Comments
Using Single Line Comments
//=======================================================
// Program: hello.c
// Author: R. Ostapiuk
//=======================================================
#include <stdio.h>
// Function: main()
int main(void)
{
printf(“Hello, world!\n”); // Display “Hello, world!”
}
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 16
Comments
Nesting Comments
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 17
Comments
Best Practices
/********************************************************
* Program: hello.c
* Author: R. Ostapiuk
********************************************************/
#include <stdio.h>
/********************************************************
* Function: main()
********************************************************/
int main(void)
{
/*
int i; // Loop count variable
char *p; // Pointer to text string
*/
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 19
Variables and Data Types
A Simple C Program
Example
#include <stdio.h>
#define PI 3.14159
int main(void)
Data {
Types Variable Declarations
float radius, area;
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 20
Variables
Definition
5
int myVariable;
myVariable = 5; myVar
iable
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 21
Variables
Variables are names for
storage locations in 15 Data Memory (RAM) 0
memory
int warp_factor; 41
41
5.74532370373175
5.74532370373175
float length;
×× 10
10-44
-44
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 22
Variables
Variable declarations
consist of a unique 15 Data Memory (RAM) 0
identifier (name)…
int warp_factor; 41
41
5.74532370373175
5.74532370373175
float length;
×× 10
10-44
-44
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 23
Variables
…and a data type
Determines size 15 Data Memory (RAM) 0
int warp_factor; 41
41
5.74532370373175
5.74532370373175
float length;
×× 10
10-44
-44
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 24
Identifiers
Names given to program elements
such as:
Variables
Functions
Arrays
Other elements
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 25
Identifiers
Valid characters in identifiers:
Identifier
First Character Remaining Characters
‘_’ (underscore) ‘_’ (underscore)
‘A’ to ‘Z’ ‘A’ to ‘Z’
‘a’ to ‘z’ ‘a’ to ‘z’
‘0’ to ‘9’
Case sensitive!
Only first 31 characters significant*
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 26
ANSI C Keywords
auto double int struct
break else long switch
case enum register typedef
char extern return union
const float short unsigned
continue for signed void
default goto sizeof volatile
do if static while
Some compiler implementations may define
additional keywords
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 27
Data Types
Fundamental Types
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 30
Variables
How to Declare a Variable
Syntax
type identifier1, identifier2,…,identifiern;
int x, y, z;
float warpFactor;
char text_buffer[10];
unsigned index;
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 31
Variables
How to Declare a Variable
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 32
Variables
How to Declare a Variable
Examples
unsigned int x;
unsigned y = 12;
int a, b, c;
long int myVar = 0x12345678;
long z;
char first = 'a', second, third = 'c';
float big_number = 6.02e+23;
#include directive
MyProgram.c
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 34
#include Directive
Three ways to use the #include directive:
Syntax
#include <file.h>
Look for file in the compiler search path
The compiler search path usually includes the compiler's directory
and all of its subdirectories.
For example: C:\Program Files\Microchip\MPLAB C30\*.*
#include “file.h”
Look for file in project directory only
#include “c:\MyProject\file.h”
Use specific path to find include file
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 35
#include Directive
main.h Header File and main.c Source File
main.h main.c
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 36
#include Directive
Equivalent main.c File
After the preprocessor main.c
runs, this is how the
compiler sees the unsigned int a;
unsigned int b;
main.c file
unsigned int c;
The contents of the
header file aren’t int main(void)
actually copied to your {
main source file, but it a = 5;
b = 2;
will behave as if they
c = a+b;
were copied }
Equivalent main.c file
without #include
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 37
Lab 01
Variables and Data Types
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 38
Lab 01
Variables and Data Types
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 39
Lab 01
Variables and Data Types
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 40
Lab 01
Variables and Data Types
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 41
Lab 01
Variables and Data Types
0x08BD 0x08BC
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 43
Lab 01
Variables and Data Types
Declare
Declare Constant
Constant #define CONSTANT1 50
Declare
Declare Variables
Variables int intVariable;
Initialize
Initialize Variables
Variables intVariable = CONSTANT1;
Print
printf("\nAn integer variable
Print Variable
Variable
Sizes
Sizes requires %d bytes.",
sizeof(int));
Loop
Loop while(1);
Forever
Forever
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 44
Lab 01
Conclusions
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 46
A Simple C Program
Literal Constants
Example
unsigned int a;
unsigned int c;
#define b 2 Literal
void main(void)
{
a = 5; Literal
c = a + b;
printf("a=%d, b=%d, c=%d\n", a, b, c);
}
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 47
Literal Constants
Definition
A literal or a literal constant is a value, such as a
number, character or string, which may be assigned to a
variable or a constant. It may also be used directly as a
function parameter or an operand in an expression.
Literals
Are "hard coded" values
May be numbers, characters or strings
May be represented in a number of formats
(decimal, hexadecimal, binary, character, etc.)
Always represent the same value (5 always
represents the quantity five)
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 48
Constant vs. Literal
What's the difference?
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 51
Integer Literals
Hexadecimal (Base 16)
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 52
Integer Literals
Octal (Base 8)
0b 0b1 0b0101001100001111
Invalid Binary Integers:
0b1.0 01100 0b12 10b
ANSI C does not specify a format for binary integer literals.
However, this notation is supported by most compilers.
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 54
Integer Literals
Qualifiers
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 58
String Literals
Declarations
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 61
Section 1.4
Symbolic Constants
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 62
Symbolic Constants
Definition
A constant or a symbolic constant is a label that
represents a literal. Anywhere the label is encountered
in code, it will be interpreted as the value of the literal it
represents.
Constants
Once assigned, never change their value
Make development changes easy
Eliminate the use of "magic numbers"
Two types of constants
Text Substitution Labels
Variable Constants (!!??)
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 63
Symbolic Constants
Constant Variables Using const
#define PI 3.14159
#define mol 6.02E23
#define MCU "PIC24FJ128GA010"
#define COEF 2 * PI
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 65
Symbolic Constants
#define Gotchas
#define MyConst 5;
c = MyConst + 3;
c = 5; + 3;
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 66
Symbolic Constants
Initializing Variables When Declared
Example
#define CONSTANT1 5
const CONSTANT2 = 10;
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 67
Lab 02
Symbolic Constants
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 68
Lab 02
Symbolic Constants
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 69
Lab 02
Symbolic Constants
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 70
Lab 02
Symbolic Constants
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 71
Lab 02
Symbolic Constants
CONSTANT2 has a
program memory
address ( )
0x0011d0 _CONSTANT2
0x000e16 __Atexit
0x000b9c __Closreg
lab02.map 0x00057c __DNKfflush
0x0012d8 __DefaultInterrupt
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 74
Lab 02
Conclusions
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 75
Section 1.5
printf() Function
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 76
printf()
Standard Library Function
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 77
printf()
Standard Library Function
Syntax
printf(ControlString, arg1,…argn);
Everything printed verbatim within string except %d's
which are replaced by the argument values from the list
Example
int a = 5, b = 10;
printf("a = %d\nb = %d\n", a, b);
Result:
a=5
b = 10
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 78
printf()
Conversion Characters for Control String
Conversion
Character Meaning
c Single character
s String (all characters until '\0')
d Signed decimal integer
o Unsigned octal integer
u Unsigned decimal integer
x Unsigned hexadecimal integer with lowercase digits (1a5e)
X As x, but with uppercase digits (e.g. 1A5E)
f Signed decimal value (floating point)
e Signed decimal with exponent (e.g. 1.26e-5)
E As e, but uses E for exponent (e.g. 1.26E-5)
g As e or f, but depends on size and precision of value
G As g, but uses E for exponent
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 79
printf()
Gotchas
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 82
Lab 03
printf() Library Function
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 83
Lab 03
printf() Library Function
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 84
Lab 03
printf() Library Function
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 85
Lab 03
printf() Library Function
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 87
Lab 03
Conclusions
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 89
Operators
How to Code Arithmetic Expressions
Definition
int x = 10;
float y = 2.0, z;
z = x * y; // x promoted to float
long double
double
Smaller types converted to
largest type in expression
float
unsigned long long
long long
unsigned long
long
unsigned int
int
unsigned char
char
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 94
Operators
Arithmetic Expression Implicit Type Conversion
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 95
Operators
Applications of the Modulus Operator (%)
Truncation: x % 2n where n is the desired word
width (e.g. 8 for 8 bits: x % 256)
Returns the value of just the lower n-bits of x
Can be used to break apart a number in any base
into its individual digits
Example
#define MAX_DIGITS 6
long number = 123456;
int i, radix = 10; char digits[MAX_DIGITS];
x = 5; x = 5;
y = (x++) + 5; y = (++x) + 5;
// y = 10 // y = 11
// x = 6 // x = 6
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 97
Operators
How to Code Assignment Statements
Definition
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 99
Operators
Compound Assignment
x = x + y;
This operation may be thought of as: The new value of x will be
set equal to the current value of x plus the value of y
x *= 5; //x = x * 5
void main(void)
{
int x = 2; //Initialize x
if (x = 5) //If x is 5,…
{
printf("Hi!"); //…display "Hi!"
}
}
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 104
Operators
Logical
Bitwise NOT 1, if 0 in x
~ ~x
(One's Complement) 0, if 1 in x
char x = 0b1010;
char y = 0b0101;
if (x & y) printf("Hi!");
char x = 0b1010;
char y = 0b0101;
if (x && y) printf("Hi!");
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 108
Operators
Logical Operators and Short Circuit Evaluation
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 109
Operators
Logical Operators and Short Circuit Evaluation
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 112
Operators
Power of 2 Integer Divide vs. Shift Right
y = x / 2n y = x >> n
0 0 0 0 1 0 1 0 >> 0 0 0 0 0 1 0 1
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 114
Operators
Power of 2 Integer Divide vs. Shift in MPLAB® C18
Example: Divide by 2 Example: Right Shift by 1
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 115
Operators
Memory Addressing
Operator Operation Example Result
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 117
Operators
The Conditional Operator
Syntax
(test-expr) ? do-if-true : do-if-false;
Example
int x = 5;
(x % 2 != 0) ?
printf("%d is odd\n", x) :
printf("%d is even\n", x);
Result:
5 is odd
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 118
Operators
The Explicit Type Cast Operator
y = 2.000000 2 y = 2.500000 3
Because: int / int ¨ int Because: float / int ¨ float
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 119
Operators
Precedence
Operator Description Associativity
( ) Parenthesized Expression
[ ] Array Subscript
Left-to-Right
. Structure Member
-> Structure Pointer
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 120
Operators
Precedence
Operator Description Associativity
* / % Multiply, Divide, and Modulus Left-to-Right
+ - Add and Subtract Left-to-Right
<< >> Shift Left and Shift Right Left-to-Right
< <= Less Than and Less Than or Equal To Left-to-Right
> >= Greater Than and Greater Than or Equal To Left-to-Right
== != Equal To and Not Equal To Left-to-Right
& Bitwise AND Left-to-Right
^ Bitwise XOR Left-to-Right
| Bitwise OR Left-to-Right
&& Logical AND Left-to-Right
|| Logical OR Left-to-Right
?: Conditional Operator Right-to-Left
Continued on next slide…
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 121
Operators
Precedence
Operator Description Associativity
= Assignment
+= -= Addition and Subtraction Assignments
/= *= Division and Multiplication Assignments
%= Modulus Assignment Right-to-Left
<<= >>= Shift Left and Shift Right Assignments
&= |= Bitwise AND and OR Assignments
^= Bitwise XOR Assignment
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 125
Lab 04
Operators
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 126
Lab 04
Operators
Solution: Steps 1 and 2
/*###########################################################################
# STEP 1: Add charVariable1 to charVariable2 and store the result in
# charVariable1. This may be done in two ways. One uses the
# ordinary addition operator, the other uses a compound assignment
# operator. Write two lines of code to perform this operation
# twice - once for each of the two methods.
# Don't forget to end each statement with a semi-colon!
###########################################################################*/
/*###########################################################################
# STEP 2: Increment charVariable1. There are several ways this could be
# done. Use the one that requires the least amount of typing.
###########################################################################*/
//Increment charVariable1
charVariable1++;
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 127
Lab 04
Operators
Solution: Steps 3 and 4
/*###########################################################################
# STEP 3: Use the conditional operator to set longVariable1 equal to
# intVariable1 if charVariable1 is less than charVariable2.
# Otherwise, set longVariable1 equal to intVariable2
# NOTE: The comments below are broken up into 3 lines, but the code you
# need to write can fit on a single line.
###########################################################################*/
/*###########################################################################
# STEP 4: Shift longVariable2 one bit to the right. This can be accomplished
# most easily using the appropriate compound assignment operator.
###########################################################################*/
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 128
Lab 04
Operators
Solution: Step 5
/*###########################################################################
# STEP 5: Perform the operation (longVariable2 AND 0x30) and store the result
# back in longVariable2. Once again, the easiest way to do this is
# to use the appropriate compound assignment operator that will
# perform an equivalent operation to the one in the comment below.
###########################################################################*/
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 129
Lab 04
Conclusions
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 130
Section 1.7
Expressions and
Statements
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 131
Expressions
Represents a single data item (e.g.
character, number, etc.)
May consist of:
A single entity (a constant, variable, etc.)
A combination of entities connected by
operators (+, -, *, / and so on)
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 132
Expressions
Examples
Example
a + b
x = y
speed = dist/time
z = ReadInput()
c <= 7
x == 25
count++
d = a + 5
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 133
Statements
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 134
Expression Statements
An expression followed by a semi-colon
Execution of the statement causes the
expression to be evaluated
Examples
i = 0;
i++;
a = 5 + i;
y = (m * x) + b;
printf("Slope = %f", m);
;
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 135
Compound Statements
A group of individual statements enclosed
within a pair of curly braces { and }
Individual statements within may be any
statement type, including compound
Allows statements to be embedded within
other statements
Does NOT end with a semicolon after }
Also called Block Statements
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 136
Compound Statements
Example
Example
{
float start, finish;
start = 0.0;
finish = 400.0;
distance = finish – start;
time = 55.2;
speed = distance / time;
printf("Speed = %f m/s", speed);
}
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 137
Control Statements
Used for loops, branches and logical tests
Often require other statements embedded
within them
Example
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 139
Boolean Expressions
C has no Boolean data type
Boolean expressions return integers:
0 if expression evaluates as FALSE
non-zero if expression evaluates as TRUE
(usually returns 1, but this is not guaranteed)
int main(void)
{
int x = 5, y, z;
y = (x > 4); y = 1 (TRUE)
z = (x > 6);
while (1); z = 0 (FALSE)
}
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 140
Boolean Expressions
Equivalent Expressions
if (expression) statement
if (expression) statement
expression ≠ 0
TRUE
FALSE
expression = 0
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 143
if Statement
Example
{
int x = 5;
bit 15 bit 0
65536
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0x10000
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 145
if Statement
Testing for TRUE
if (x) vs. if (x == 1)
if (x) only needs to test for not equal to 0
if (x == 1) needs to test for equality with 1
Remember: TRUE is defined as non-zero, FALSE is
defined as zero
if (x) if (x == 1)
8: if (x) 11: if (x == 1)
011B4 E208C2 cp0.w 0x08c2 011C0 804610 mov.w 0x08c2,0x0000
011B6 320004 bra z, 0x0011c0 011C2 500FE1 sub.w 0x0000,#1,[0x001e]
011C4 3A0004 bra nz, 0x0011ce
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 146
Nested if Statements
Example
if (power > 5)
{
if (band == 2.0)
{
if ((frequency > 144) && (frequency < 148))
{
printf("Yes, it's all true!\n");
}
}
}
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 147
if-else Statement
Syntax
if (expression) statement1
else statement2
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 148
if-else Statement
Flow Diagram
Syntax
if (expression) statement1
else statement2
expression ≠ 0
TRUE
FALSE
expression = 0
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 149
if-else Statement
Example
{
float frequency = 146.52; //frequency in MHz
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 150
if-else if Statement
Syntax
if (expression1) statement1
else if (expression2) statement2
else statement3
if (expression1) statement1
else if (expression2) statement2
else statement3
TRUE
FALSE
TRUE
FALSE
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 152
if-else if Statement
Example
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 153
Lab 05
Making Decisions (if)
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 154
Lab 05
Making Decisions (if)
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 155
Lab 05
Making Decisions (if)
Solution: Steps 1 and 2
/*###########################################################################
# STEP 1: Increment intVariable1 if BOTH the following conditions are true:
# * floatVariable2 is greater than or equal to floatVariable1
# * charVariable2 is greater than or equal to charVariable1
# Remember to use parentheses to group logical operations.
###########################################################################*/
//Write the if condition
if((floatVariable2 >= floatVariable1) && (charVariable2 >= charVariable1))
{
intVariable1++; //Increment intVariable1
}
/*###########################################################################
# STEP 2: If the above is not true, and floatVariable1 is greater than 50
# then decrement intVariable2. (HINT: else if)
###########################################################################*/
//Write the else if condition
else if(floatVariable1 > 50)
{
intVariable2--; //Decrement intVariable2
}
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 156
Lab 05
Making Decisions (if)
Solution: Step 3
/*###########################################################################
# STEP 3: If neither of the above are true, set charVariable2 equal to 1.
# (HINT: else)
###########################################################################*/
//Write the else condition
else
{
charVariable2 = 1; //Set charVariable2 equal to 1
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 157
Lab 05
Conclusions
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 158
switch Statement
Syntax
switch (expression)
{
case const-expr1: statements1
YES
Const-expr11==
Const-expr
statement
expression? statement11
expression?
Notice that each
NO
statement falls
Const-expr22==
Const-expr
YES
statement
statement22
through to the next
expression?
expression?
NO
statement
statementn+1
n+1
END
END
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 160
switch Statement
Flow Diagram (modified)
START
START
YES
Const-expr11==
Const-expr statement
statement11
expression?
expression? break;
break;
Adding a break
NO
statement to each
Const-expr22==
Const-expr YES statement
statement22 statement block will
expression? break;
break;
eliminate fall
expression?
NO through, allowing
only one case
YES
Const-exprnn==
Const-expr
expression?
expression?
statement
statementnn
break;
break;
clause's statement
NO
block to be executed
statement
statementn+1
n+1
END
END
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 161
switch Statement
switch Example 1
switch(channel)
{
case 2: printf("WBBM Chicago\n"); break;
case 3: printf("DVD Player\n"); break;
case 4: printf("WTMJ Milwaukee\n"); break;
case 5: printf("WMAQ Chicago\n"); break;
case 6: printf("WITI Milwaukee\n"); break;
case 7: printf("WLS Chicago\n"); break;
case 9: printf("WGN Chicago\n"); break;
case 10: printf("WMVS Milwaukee\n"); break;
case 11: printf("WTTW Chicago\n"); break;
case 12: printf("WISN Milwaukee\n"); break;
default: printf("No Signal Available\n");
}
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 162
switch Statement
switch Example 2
switch(letter)
{
case 'a':
printf("Letter 'a' found.\n");
break;
case 'b':
printf("Letter 'b' found.\n");
break;
case 'c':
printf("Letter 'c' found.\n");
break;
default: printf("Letter not in list.\n");
}
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 163
switch Statement
switch Example 3
switch(channel)
Apply this case to channel 4, 5, 6, and 7
{
case 4...7:
printf("VHF Station\n"); break;
case 9...12:
printf("VHF Station\n"); break;
case 3:
case 8: Case 3 and 8 are allowed to fall
case 13: through to case 13
printf("Weak Signal\n"); break;
case 14...69:
printf("UHF Station\n"); break;
default:
printf("No Signal Available\n");
}
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 164
Lab 06
Making Decisions (switch)
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 165
Lab 06
Making Decisions (switch)
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 166
Lab 06
Making Decisions (switch)
Solution: Step 1
/*###########################################################################
# TASK: Write a switch statement to print the network's initials with the
# channel (based on Chicago TV stations).
# * If channel = 2, print "CBS 2" to the output window.
# * If channel = 5, print "NBC 5" to the output window.
# * If channel = 7, print "ABC 7" to the output window.
# * For all other channels, print "--- #" to the output window,
# where "#" is the channel number.
# (HINT: Use printf(), and use the newline character '\n' at the end
# of each string you print to the output window.)
# NOTE: The switch statement is in a loop that will execute 9 times. Each
# pass through the loop, 'channel' will be incremented. The output
# window should display a line of text for channels 2 to 10.
#
# STEP 1: Open a switch statement on the variable 'channel'
###########################################################################*/
//Begin switch statement
switch(channel)
{
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 167
Lab 06
Making Decisions (switch)
Solution: Steps 2 and 3
/*###########################################################################
# STEP 2: Write case for channel = CBS (CBS is a constant defined to equal 2)
###########################################################################*/
case CBS: //If channel = CBS (CBS = 2)
{
/*###########################################################################
# STEP 3: Write case for channel = NBC (NBC is a constant defined to equal 5)
# This should look almost identical to step 2.
###########################################################################*/
case NBC: //If channel = NBC (NBC = 5)
{
printf("NBC %d\n", channel); //Display string "NBC 5" followed by newline
break; //Prevent fall through to next case
}
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 168
Lab 06
Making Decisions (switch)
Solution: Steps 4 and 5
/*###########################################################################
# STEP 4: Write case for channel = ABC (ABC is a constant defined to equal 7)
# This should look almost identical to step 2.
###########################################################################*/
case ABC: //If channel = ABC (ABC = 7)
{
printf("ABC %d\n", channel); //Display string "ABC 7" followed by newline
break; //Prevent fall through to next case
}
/*###########################################################################
# STEP 5: Write default case. If channel is anything other than those
# listed above, this is what should be done. For these cases, you
# need to print the string "--- #" where "#" is the channel number.
# For example, if channel = 6, you should print "--- 6".
###########################################################################*/
default: //For all other channels
{
printf("--- %d\n", channel); //Display string "--- #" followed by newline
}
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 169
Lab 06
Conclusions
switch provides a more elegant decision
making structure than if for multiple
conditions (if – else if – else if – else if…)
The drawback is that the conditions may
only be constants (match a variable's state
to a particular value)
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 170
Section 1.9
Loops
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 171
for Loop
Syntax
Initialize loop
variable
i = 0 expression
expression11 Modify loop
variable
expression
expression33 i++
Test loop variable for
exit condition TRUE
i < n expression22??
expression statement
statement
FALSE
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 173
for Loop
Example (Code Fragment)
int i;
Expected Output:
Loop iteration 0
Loop iteration 1
Loop iteration 2
Loop iteration 3
Loop iteration 4
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 174
for Loop
Any or all of the three expressions may be
left blank (semi-colons must remain)
If expression1 or expression3 are
missing, their actions simply disappear
If expression2 is missing, it is assumed
to always be true
Note
Infinite Loops for ( ; ; )
A for loop without any
expressions will execute
{
indefinitely (can leave loop …
via break statement) }
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 175
while Loop
Syntax
TRUE
FALSE
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 177
while Loop
Example
Example (Code Fragment)
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 178
while Loop
The expression must always be there,
unlike with a for loop
while is used more often than for when
implementing an infinite loop, though it is
only a matter of personal taste
Frequently used for main loop of program
Note
Infinite Loops while (1)
A while loop with
expression = 1 will
{
execute indefinitely (can …
leave loop via break }
statement)
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 179
do-while Loop
Syntax
TRUE
FALSE
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 181
do-while Loop
Example
Example (Code Fragment)
Loop counter initialized
int i = 0; outside of loop
Loop counter
incremented manually
do inside loop
{
printf("Loop iteration #%d\n", i++);
} while (i < 5); Condition checked at
end of loop iterations
Expected Output:
Loop iteration 0
Loop iteration 1
Loop iteration 2
Loop iteration 3
Loop iteration 4
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 182
break Statement
Syntax
break;
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 183
break Statement
Flow Diagram Within a while Loop
Syntax
break;
TRUE
FALSE
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 184
break Statement
Example
Example (Code Fragment)
int i = 0;
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 185
continue Statement
Syntax
continue;
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 186
continue Statement
Flow Diagram Within a while Loop
Syntax
continue;
TRUE
FALSE
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 187
continue Statement
Example
Example (Code Fragment)
int i = 0;
while (i < 6)
{ Skip remaining iteration when i = 2.
Iteration 2 will not be completed.
i++;
if (i == 2) continue;
printf("Loop iteration #%d\n", i++);
}
Expected Output:
Loop iteration 1
Loop iteration 3 Iteration 2 does not print
Loop iteration 4
Loop iteration 5
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 188
Lab 07
Loops
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 189
Lab 07
Loops
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 190
Lab 07
Loops
Solution: Step 1
/*###########################################################################
# STEP 1: Create a for loop to iterate the block of code below. The loop
# should do the following:
# * Initialize counter1 to 1
# * Loop as long as counter1 is less than 5
# * Increment counter1 on each pass of the loop
# (HINT: for(init; test; action))
###########################################################################*/
//Write the opening line of the for loop
for( counter1 = 1 ; counter1 < 5 ; counter1++)
{
intVariable1 *= counter1;
printf("FOR: intVariable1 = %d, counter1 = %d\n", intVariable1, counter1);
}
//end of for loop block
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 191
Lab 07
Loops
Solution: Step 2
/*###########################################################################
# STEP 2: Create a while loop to iterate the block of code below. The loop
# should run until charVariable1 is 0.
###########################################################################*/
//Loop as long as charVariable1 is not 0
while( charVariable1 != 0)
{
charVariable1--;
charVariable2 += 5;
printf("WHILE: charVariable1 = %d, charVariable2 = %d\n",
charVariable1, charVariable2);
}
//end of while loop block
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 192
Lab 07
Loops
Solution: Step 3
/*###########################################################################
# STEP 3: Create a do...while loop to iterate the block of code below.
# The loop should run until counter1 is greater than 100
###########################################################################*/
do //Write opening line of do loop
{
counter1 += 5;
counter2 = counter1 * 3;
printf("DO: counter1 = %d, counter2 = %d\n", counter1, counter2);
} while(counter1 <= 100); //Write closing line of loop - test counter1
//end of do...while block
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 193
Lab 07
Conclusions
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 194
Section 1.10
Functions
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 195
Functions
Program Structure
eat()
{
main() ...
{ return;
} be_merry()
... {
eat(); ...
... drink() return;
drink(); { }
... ...
} be_merry();
return;
}
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 196
Functions
What is a function?
Definition
Data type of
return expression Parameter List
Name (optional)
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 199
Functions
Function Definitions: Syntax Examples
Example
z = (x >= y) ? x : y;
return z;
}
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 201
Functions
Function Definitions: Return Data Type
Example
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 203
Functions
Function Definitions: Parameters
Example
type identifier(void)
{
declarations
statements
return expression;
}
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 206
Functions
How to Call / Invoke a Function
Function Call Syntax
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 207
Functions
Function Prototypes
int a = 5, b = 10, c;
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 210
Functions
Declaration and Use: Example 2
Example 2
int a = 5, b = 10, c;
Function is
int maximum(int x, int y); declared with
prototype before
int main(void) use in main()
{
c = maximum(a, b);
printf("The max is %d\n", c)
}
Evaluation of 5!
(based on code from previous slide)
Recursive Factorial term Result
iterations of Partial results replaced with result evaluated from
function pushed on stack of expression above TOS downward
[0] 1! = 1 =1
[1] 2! = 2 * 1! =2*1=2
[2] 3! = 3 * 2! =3*2=6
[3] 4! = 4 * 3! = 4 * 6 = 24
[4] 5! = 5 * 4! = 5 * 24 = 120
Conceptual evaluation of recursive function
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 215
Functions and Scope
Parameters
int x, y, z;
int foo(int n)
{
int a;
The n refers to the function parameter n
a += n;
} The a refers to the a declared locally
within the function body
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 217
Functions and Scope
Variables Declared Within a Function
Variables declared within a function block
are not accessible outside the function
Example
int x;
int foo(int n)
{
int a;
return (a += n);
}
int main(void)
{
x = foo(5); This will generate an error. a may not
x = a; be accessed outside of the function
} where it was declared.
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 218
Functions and Scope
Global versus Local Variables
Example
int x = 5; x can see be seen by everybody
int foo(int y)
{ foo 's local parameter is y
foo's
int z = 1; foo 's local variable is z
foo's
foo cannot see main 's a
main's
return (x + y + z);
foo can see x
}
int main(void)
{ main 's local variable is a
main's
main cannot see foo 's y or z
foo's
int a = 2;
main can see x
x = foo(a);
a = foo(x);
}
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 219
Functions and Scope
Parameters
int n; int n;
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 221
Functions and Scope
#define Within a Function
Example
Running this code will
#define x 2 result in the following
output in the Uart1 IO
void test(void) window:
{
#define x 5 5
printf("%d\n", x);
} 5
void main(void) Why?
{ Remember: #define is
printf("%d\n", x); used by the preprocessor
test(); to do text substitution
} before the code is
compiled.
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 222
Functions
Historical Note
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 224
Lab 08
Functions
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 225
Lab 08
Functions
Solution: Step 1
/*############################################################################
# STEP 1: Write two function prototypes based on the following information:
# + Function Name: multiply_function()
# - Parameters: int x, int y
# - Return type: int
# + Function Name: divide_function()
# - Parameters: float x, float y
# - Return type: float
############################################################################*/
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 226
Lab 08
Functions
Solution: Step 2
/*############################################################################
# STEP 2: Call the multiply_function() and divide_function().
# (a) Pass the variables intVariable1 and intVariable2 to the
# multiply_function().
# (b) Store the result of multiply_function() in the variable "product".
# (c) Pass the variables floatVariable1 and floatVariable2 to the
# divide_function().
# (d) Store the result of divide_function() in the variable "quotient".
############################################################################*/
//Call multiply_function
product = multiply_function( intVariable1 , intVariable2 );
//Call divide_function
quotient = divide_function( floatVariable1 , floatVariable2 );
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 227
Lab 08
Functions
Solution: Steps 3 and 4
/*############################################################################
# STEP 3: Write the function multiply_function(). Use the function prototype
# you wrote in STEP 1 as the function header. In the body, all you
# need to do is return the product of the two input parameters (x * y)
############################################################################*/
//Function Header
int multiply_function( int x, int y)
{
return (x * y); //Function Body
}
/*############################################################################
# STEP 4: Write the function divide_function(). Use the function prototype
# you wrote in STEP 1 as the function header. In the body, all you
# need to do is return the quotient of the two input parameters (x / y)
############################################################################*/
//Function Header
float divide_function( float x, float y )
{
return (x / y); //Function Body
}
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 228
Lab 08
Conclusions
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 229
Section 1.11
Multi-File Projects and
Storage Class Specifiers
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 230
Storage Class Specifiers
Scope and Lifetime of Variables
*Except when the compiler provides an option to make parameters and locals static by default.
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 232
Storage Class Specifiers
auto Keyword with Variables
int main(void)
{
...
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 234
Storage Class Specifiers
static Keyword with Variables
External Variable
Declaration Example:
extern int x;
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 236
Storage Class Specifiers
External Variables
A variable declared as extern within a
function is analogous to a function
prototype – the variable may be defined
outside the function after it is used
Example
int foo(int x)
{
extern int a;
...
return a;
}
int a;
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 237
Storage Class Specifiers
External Variables
A variable declared as extern outside of
any function is used to indicate that the
variable is defined in another source file –
memory only allocated when it's defined
Main.c SomeFileInProject.c
extern int x; int x;
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 240
Storage Class Specifiers
External Functions
Main.c SomeFileInProject.c
int foo(void); static int foo(void)
{
int main(void) ...
{ }
...
x = foo();
}
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 242
Lab 09
Multi-File Projects
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 243
Lab 09
Multi-File Projects
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 244
Lab 09
Multi-File Projects
Solution: Step 1a and 1b (File1_09.h)
/*############################################################################
# STEP 1a: Add variable declarations to make the variables defined in
# File1_09.c available to any C source file that includes this
# header file. (intVariable1, intVariable2, product)
############################################################################*/
//Reference to externally defined "intVariable1"
extern int intVariable1;
//Reference to externally defined "intVariable2"
extern int intVariable2;
//Reference to externally defined "product"
extern int product;
/*###############################################################################
# STEP 1b: Add a function prototype to make multiply_function() defined in
# File1_09.c available to any C source file that includes this header
# file.
###############################################################################*/
//Function prototype for multiply_function()
int multiply_function(int x, int y);
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 245
Lab 09
Multi-File Projects
Solution: Step 2a and 2b (File2_09.h)
/*############################################################################
# STEP 2a: Add variable declarations to make the variables defined in
# File2_09.c available to any C source file that includes this header
# file.(floatVariable1, floatVariable2, quotient, intQuotient)
############################################################################*/
//Reference to externally defined "floatVariable1"
extern float floatVariable1;
//Reference to externally defined "floatVariable2"
extern float floatVariable2;
//Reference to externally defined "quotient"
extern float quotient;
//Reference to externally defined "intQuotient"
extern int intQuotient;
/*############################################################################
# STEP 2b: Add a function prototype to make divide_function() defined in
# File2_09.c available to any C source file that includes this header
# file.
############################################################################*/
//Function prototype for divide_function()
float divide_function(float x, float y );
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 246
Lab 09
Conclusions
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 247
Section 1.12
Arrays
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 248
Arrays
Definition
Arrays are variables that can store many items of the same
type. The individual items known as elements, are stored
sequentially and are uniquely identified by the array index
(sometimes called a subscript).
Arrays:
May contain any number of elements
Elements must be of the same type
The index is zero based
Array size (number of elements) must be
specified at declaration
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 249
Arrays
How to Create an Array
Arrays are declared much like ordinary variables:
Syntax
type arrayName[size];
Example
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 250
Arrays
How to Initialize an Array at Declaration
Arrays may be initialized with a list when declared:
Syntax
type arrayName[size] = {item1,…,itemn};
Example
int a[5] = {10, 20, 30, 40, 50};
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 251
Arrays
How to Use an Array
Arrays are accessed like variables, but with an index:
Syntax
arrayName[index]
index may be a variable or a constant
The first element in the array has an index of 0
C does not provide any bounds checking
Example
int i, a[10]; //An array that can hold 10 integers
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 253
Arrays
Initializing Multidimensional Arrays at Declaration
Arrays may be initialized with lists within a list:
Syntax
type arrayName[size0]…[sizen] =
{{item,…,item},
{item,…,item}};
Example
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 254
Arrays
Visualizing 2-Dimensional Arrays
int a[3][3] = {{0, 1, 2},
{3, 4, 5},
Row, Column {6, 7, 8}};
a[y][x] Column
a[0][0] = 0; 0 1 2 x
Row 0
a[0][1] = 1;
a[0][2] = 2;
0 0 1 2
0,0 0,1 0,2
a[1][0] = 3;
Row 1
a[1][1] = 4; Row 1 3 4 5
a[1][2] = 5; 1,0 1,1 1,2
a[2][0] = 6;
2 6 7 8
Row 2
a[0][0][1] = 1; Co 4
a[0][1][0] = 2; 0 lu
m 5
n
a[0][1][1] = 3; 0
Row
1 ,0
,1
a[1][0][0] = 4; 0 ,0
,0
1 x
1 7
Plane 1
a[1][0][1] = 5; 0 ,0
a[1][1][0] = 6;
2 ,1
1 ,1
,1
y 3
0 ,1
,0
a[1][1][1] = 7; 0 0 ,1
,1
1
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 256
Arrays
Example of Array Processing
/**************************************************
* Print out 0 to 90 in increments of 10
**************************************************/
int main(void)
{
int i = 0;
int a[10] = {0,1,2,3,4,5,6,7,8,9};
while (i < 10)
{
a[i] *= 10;
printf("%d\n", a[i]);
i++;
}
while (1);
}
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 257
Strings
Character Arrays and Strings
Definition
Strings are arrays of char whose last element is a null
character '\0' with an ASCII value of 0. C has no native
string data type, so strings must always be treated as
character arrays.
Strings:
Are enclosed in double quotes "string"
Are terminated by a null character '\0'
Must be manipulated as arrays of characters
(treated element by element)
May be initialized with a string literal
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 258
Strings
Creating a String Character Array
Strings are created like any other array of char:
Syntax
char arrayName[length];
Example
char str1[10]; //Holds 9 characters plus '\0'
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 259
Strings
How to Initialize a String at Declaration
Character arrays may be initialized with string literals:
Syntax
char arrayName[] = "Microchip";
arrayName[n] = '\0';
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 262
Functions
Array Parameters
Arrays are passed by reference rather than by
value for greater efficiency
A pointer to the array, rather than the array itself
is passed to the function
This declaration…
void WriteLCD(char greetings[]){…}
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 263
Lab 10
Arrays
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 264
Lab 10
Arrays
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 265
Lab 10
Arrays
Solution: Step 1
/*############################################################################
# STEP 1: Create two initialized arrays with 10 elements each named array1 and
# array2 (you may use the pre-defined constant ARRAY_SIZE as part of
# the array declaration).
# The arrays should be initialized with the following values:
# + array1: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
# + array2: 9, 8, 7, 6, 5, 4, 3, 2, 1, 0
# Note: the elements are all of type int
############################################################################*/
// array1 declaration & definition
int array1[ARRAY_SIZE] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
// array2 declaration & definition
int array2[ARRAY_SIZE] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 266
Lab 10
Arrays
Solution: Step 2
/*############################################################################
# STEP 2: Pass the two arrays you declared above (array1 & array2) to the
# function add_function() (see its definition below). Store the
# result of the function call in the array result[]. The idea here is
# to add each corresponding element of array1 and array2 and store the
# result in result[]. In other words, add the first element of
# array1[] to the first element of array2[] and store the result in
# the first element of result[]. Next add the second elements…
############################################################################*/
// result = sum of elements of array1 & array2
result[i] = add_function(array1[i], array2[i]);
i++;
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 267
Lab 10
Conclusions
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 268
Section 1.13
Data Pointers
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 269
Pointers
A Variable's Address versus A Variable's Value
In some situations, we will want to work with a
variable's address in memory, rather than the
value it contains…
16-bit Data Memory
Variable stored (RAM)
at Address Address
Variable name 005A 0x0800
from C code x 0123 0x0802
int x; DEAD 0x0804
Address of
BEEF 0x0806 variable x
Value of
variable x F00D 0x0808 = 0x0802
= 0x0123 0456 0x080A
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 270
Pointers
What are pointers?
A pointer is a variable or constant that holds the
address of another variable or function
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 271
Pointers
What do they do?
A pointer allows us to indirectly access a
variable (just like indirect addressing in assembly language)
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 272
Pointers
Why would I want to do that?
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 274
Pointers
Where else are they used?
Used in conjunction with dynamic memory
allocation (creating variables at runtime)
Provide method to pass arguments by reference
to functions
Provide method to pass more than one piece of
information into and out of a function
A more efficient means of accessing arrays and
dealing with strings
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 275
Pointers
How to Create a Pointer Variable
Syntax
type *ptrName;
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 276
Pointers
How to Create a Pointer Type with typedef
Syntax
typedef type *typeName;
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 277
Pointers
Initialization
p = &x;
This assigns the address of the variable x
to the pointer p (p now points to x)
Note: p must be declared to point to the
type of x (e.g. int x; int *p;)
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 278
Pointers
Usage
y = *p;
This assigns to the variable y, the value of
what p is pointing to (x from the last slide)
Using *p, is the same as using the variable
it points to (e.g. x)
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 279
Pointers
Another Way To Look At The Syntax
Example
105
105
Address on Envelope
(pointer p)
p = &x;
Bank of Mailboxes
(memory locations)
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 282
Pointers
How Pointers Work
Example
16-bit Data Memory
{ Variable at (RAM)
int x, y; Address Address
x 0000 0x08BC
x = 0xDEAD; 0000
y 0x08BE
y = 0xBEEF;
p = &x; p 0000 0x08C0
0000 0x08C2
*p = 0x0100; 0000 0x08C4
p = &y; 0000 0x08C6
*p = 0x0200;
} 0000 0x08C8
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 283
Pointers
How Pointers Work
Example
16-bit Data Memory
{ Variable at (RAM)
int x, y; Address Address
x DEAD 0x08BC
x = 0xDEAD; 0000
y 0x08BE
y = 0xBEEF;
p = &x; p 0000 0x08C0
0000 0x08C2
*p = 0x0100; 0000 0x08C4
p = &y; 0000 0x08C6
*p = 0x0200;
} 0000 0x08C8
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 284
Pointers
How Pointers Work
Example
16-bit Data Memory
{ Variable at (RAM)
int x, y; Address Address
x DEAD 0x08BC
x = 0xDEAD; BEEF
y 0x08BE
y = 0xBEEF;
p = &x; p 0000 0x08C0
0000 0x08C2
*p = 0x0100; 0000 0x08C4
p = &y; 0000 0x08C6
*p = 0x0200;
} 0000 0x08C8
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 285
Pointers
How Pointers Work
Example
16-bit Data Memory
{ Variable at (RAM)
int x, y; Address Address
x DEAD 0x08BC
x = 0xDEAD; BEEF
y 0x08BE
y = 0xBEEF;
p = &x; p 08BC 0x08C0
0000 0x08C2
*p = 0x0100; 0000 0x08C4
p = &y; 0000 0x08C6
*p = 0x0200;
} 0000 0x08C8
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 286
Pointers
How Pointers Work
Example
16-bit Data Memory
{ Variable at (RAM)
int x, y; Address Address
x 0100 0x08BC
x = 0xDEAD; BEEF
y 0x08BE
y = 0xBEEF;
p = &x; p 08BC 0x08C0
0000 0x08C2
*p = 0x0100; 0000 0x08C4
p = &y; 0000 0x08C6
*p = 0x0200;
} 0000 0x08C8
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 287
Pointers
How Pointers Work
Example
16-bit Data Memory
{ Variable at (RAM)
int x, y; Address Address
x 0100 0x08BC
x = 0xDEAD; BEEF
y 0x08BE
y = 0xBEEF;
p = &x; p 08BE 0x08C0
0000 0x08C2
*p = 0x0100; 0000 0x08C4
p = &y; 0000 0x08C6
*p = 0x0200;
} 0000 0x08C8
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 288
Pointers
How Pointers Work
Example
16-bit Data Memory
{ Variable at (RAM)
int x, y; Address Address
x 0100 0x08BC
x = 0xDEAD; 0200
y 0x08BE
y = 0xBEEF;
p = &x; p 08BE 0x08C0
0000 0x08C2
*p = 0x0100; 0000 0x08C4
p = &y; 0000 0x08C6
*p = 0x0200;
} 0000 0x08C8
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 289
Pointers and Arrays
A Quick Reminder…
Array elements occupy consecutive memory
locations
16-bit Data Memory
(RAM)
Address
int x[3] = {1,2,3};
FFFF 0x07FE
x[0] 0001 0x0800
x[1] 0002 0x0802
x[2] 0003 0x0804
FFFF 0x0806
float x;
float *p = &x;
p++;
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 296
Pointer Arithmetic
Larger Jumps
int x;
int *p = &x;
p += 3;
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 298
Pointers
Pointer Arithmetic
Example
16-bit Data Memory
{ (RAM)
long x[3] = {1,2,3}; Address
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 299
Pointers
Pointer Arithmetic
Example
16-bit Data Memory
{ (RAM)
long x[3] = {1,2,3}; Address
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 300
Pointers
Pointer Arithmetic
Example
16-bit Data Memory
{ (RAM)
long x[3] = {1,2,3}; Address
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 301
Pointers
Pointer Arithmetic
Example
16-bit Data Memory
{ (RAM)
long x[3] = {1,2,3}; Address
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 302
Pointers
Pointer Arithmetic
Example
16-bit Data Memory
{ (RAM)
long x[3] = {1,2,3}; Address
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 303
Pointers
Pointer Arithmetic
Example
16-bit Data Memory
{ (RAM)
long x[3] = {1,2,3}; Address
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 304
Pointers
Pointer Arithmetic
Example
16-bit Data Memory
{ (RAM)
long x[3] = {1,2,3}; Address
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 305
Pointers
Pointer Arithmetic
Example
16-bit Data Memory
{ (RAM)
long x[3] = {1,2,3}; Address
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 306
Pointers
Post-Increment/Decrement Syntax Rule
z = *(p++);
*p++
Post-Increment is equivalent to:
Pointer z = *p;
*(p++) p = p + 1;
z = (*p)++;
(*p)++ Post-Increment
is equivalent to:
data pointed to z = *p;
by Pointer *p = *p + 1;
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 307
Pointers
Post-Increment / Decrement Syntax
Example
16-bit Data Memory
{ (RAM)
int x[3] = {1,2,3}; Address
int y; 0000 0x07FE
int *p = &x; x[0] 0001 0x0800
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 308
Pointers
Post-Increment / Decrement Syntax
Example
16-bit Data Memory
{ (RAM)
int x[3] = {1,2,3}; Address
int y; 0000 0x07FE
int *p = &x; x[0] 0001 0x0800
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 309
Pointers
Post-Increment / Decrement Syntax
Example
16-bit Data Memory
{ (RAM)
int x[3] = {1,2,3}; Address
int y; 0000 0x07FE
int *p = &x; x[0] 0001 0x0800
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 310
Pointers
Post-Increment / Decrement Syntax
Example
16-bit Data Memory
{ (RAM)
int x[3] = {1,2,3}; Address
int y; 0000 0x07FE
int *p = &x; x[0] 0001 0x0800
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 311
Pointers
Post-Increment / Decrement Syntax
Example
16-bit Data Memory
{ (RAM)
int x[3] = {1,2,3}; Address
int y; 0000 0x07FE
int *p = &x; x[0] 0001 0x0800
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 312
Pointers
Pre-Increment/Decrement Syntax Rule
z = *(++p);
++*p
Pre-Increment is equivalent to:
Pointer p = p + 1;
*(++p) z = *p;
z = ++(*p);
++(*p) Pre-Increment
is equivalent to:
data pointed to *p = *p + 1;
by Pointer z = *p;
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 313
Pointers
Pre-Increment / Decrement Syntax
Example
16-bit Data Memory
{ (RAM)
int x[3] = {1,2,3}; Address
int y; 0000 0x07FE
int *p = &x; x[0] 0001 0x0800
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 314
Pointers
Pre-Increment / Decrement Syntax
Example
16-bit Data Memory
{ (RAM)
int x[3] = {1,2,3}; Address
int y; 0000 0x07FE
int *p = &x; x[0] 0001 0x0800
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 315
Pointers
Pre-Increment / Decrement Syntax
Example
16-bit Data Memory
{ (RAM)
int x[3] = {1,2,3}; Address
int y; 0000 0x07FE
int *p = &x; x[0] 0001 0x0800
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 316
Pointers
Pre-Increment / Decrement Syntax
Example
16-bit Data Memory
{ (RAM)
int x[3] = {1,2,3}; Address
int y; 0000 0x07FE
int *p = &x; x[0] 0001 0x0800
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 317
Pointers
Pre-Increment / Decrement Syntax
Example
16-bit Data Memory
{ (RAM)
int x[3] = {1,2,3}; Address
int y; 0000 0x07FE
int *p = &x; x[0] 0001 0x0800
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 318
Pointers
Pre- and Post- Increment/Decrement Summary
int *p = NUL;
NULL is the character '\0' but NUL is the value of a
pointer that points to nowhere
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 320
Lab 11
Pointers and Pointer
Arithmetic
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 321
Lab 11
Pointers and Pointer Arithmetic
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 322
Lab 11
Pointers and Pointer Arithmetic
Solution: Steps 1, 2 and 3
/*############################################################################
# STEP 1: Initialize the pointer p with the address of the variable x
############################################################################*/
//Point to address of x
p = &x;
/*############################################################################
# STEP 2: Complete the following printf() functions by adding in the
# appropriate arguments as described in the control string.
############################################################################*/
printf("The variable x is located at address 0x%X\n", &x);
printf("The value of x is %d\n", x);
printf("The pointer p is located at address 0x%X\n", &p);
printf("The value of p is 0x%X\n", p);
printf("The value pointed to by *p = %d\n", *p);
/*############################################################################
# STEP 3: Write the int value 10 to the location p is currently pointing to.
############################################################################*/
*p = 10;
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 323
Lab 11
Pointers and Pointer Arithmetic
Solution: Steps 4 and 5
/*############################################################################
# STEP 4: Increment the value that p points to.
############################################################################*/
//Increment array element's value
(*p)++;
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 324
Lab 11
Conclusions
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 325
Pointers and Functions
Passing Pointers to Functions
int main(void);
{ After Function Call: y=4
y = square(x); x=2
} x was not changed by function
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 326
Pointers and Functions
Passing Pointers to Functions
int main(void);
{ After Function Call: x = 4
square(&x); x was changed by function
}
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 327
Pointers and Functions
Passing Pointers to Functions
We know where
Swap function definition: you live!
void swap(int *n1, int *n2);
{
int temp;
Addresses of parameters
copied to local pointer
temp = *n1; variables: Function can
*n1 = *n2; now modify the original
*n2 = temp; variables via pointers.
}
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 329
Pointers and Functions
Passing Parameters By Reference
Example – Part 2
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 330
Pointers and Strings
So far, we have worked with strings
strictly as arrays of char
Strings may be created and used with
pointers much more elegantly
16-bit Data Memory (RAM)
String declaration with a pointer: Address
Implementation
varies depending on I P 49 50 0x91C0
compiler and
architecture used. \
\00 C 00 43 0x91C2
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 331
Pointers and Strings
When initialized, a pointer to a string
points to the first character:
char *str = "Microchip";
str
M i c r o c h i p \0
\0
str += 4
M i c r o c h i p \0
\0
*(str + 4) == 'o'
Pointer always points to "base address"
Offsets used to access subsequent chars
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 333
Pointers and Strings
Pointer versus Array: Initialization at Declaration
Initializing a character string when it is
declared is essentially the same for both a
pointer and an array:
Example: Pointer Variable Example: Array Variable
or
char str[4] = "PIC";
strcmp() prototype:
Function Prototype
#include <string.h>
int main(void)
{
if (0 == strcmp(str, "Microchip"))
printf("They match!\n");
while(1);
}
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 338
Arrays of Pointers
Declaration
char *p[4];
This creates an array of 4 pointers to char
The array p[] itself is like any other array
The elements of p[], such as p[1], are
pointers to char
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 339
Arrays of Pointers
Array Elements are Pointers Themselves
p[1] 91C3 O f f \
\00
p[2] 91C7 91C7
p[3] 91CC M a i n \
\00
0000 91CC
0000 A u x \
\00
0000
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 340
Arrays of Pointers
Initialization
p[0] = &x;
Or, when working with strings:
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 341
Arrays of Pointers
Dereferencing
y = *p[0];
Using *p[0] is the same as using the
object it points to, such as x or the string
literal "My String" from the previous
slide
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 342
Arrays of Pointers
Accessing Strings
Example
int i = 0;
char *str[] = {"Zero", "One", "Two",
"Three", "Four", "\0"};
int main(void)
{
while(*str[i] != '\0')
printf("%s\n", str[i++]);
while(1);
}
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 343
Lab 12
Pointers, Arrays, and
Functions
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 344
Lab 12
Pointers, Arrays, and Functions
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 345
Lab 12
Pointers, Arrays, and Functions
Solution: Steps 1 and 2
/*############################################################################
# STEP1: Pass the variable x to the function twosComplement such that the
# value of x itself may be changed by the function. Note: The function
# expects a pointer (address) as its parameter.
############################################################################*/
//Perform twos complement on x
twosComplement(&x);
/*############################################################################
# STEP 2: Pass the array 'a' to the function reverse1(). Use the constant
# ARRAY_SIZE for the second parameter.
# See definition of function reverse1() below.
############################################################################*/
//Reverse order of elements by passing array
reverse1(a, ARRAY_SIZE);
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 346
Lab 12
Pointers, Arrays, and Functions
Solution: Steps 3 and 4
/*############################################################################
# STEP 3: Pass a pointer to array 'a' to the function reverse2(). Use the
# constant ARRAY_SIZE for the second parameter.
# See definition of function reverse2() below.
# Hint: You do not need to define a new pointer variable to do this.
############################################################################*/
//Reverse order of elements by passing pointer
reverse2(a, ARRAY_SIZE);
/*############################################################################
# STEP 4: Complete the function header by defining a parameter called 'number'
# that points to an integer (i.e. accepts the address of an integer
# variable).
############################################################################*/
//void twosComplement(/*### Your Code Here ###*/)
void twosComplement(int *number)
{
*number = ~(*number); //Bitwise complement value
*number += 1; //Add 1 to result
}
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 347
Lab 12
Conclusions
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 348
Section 1.14
Function Pointers
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 349
Function Pointers
Pointers may also be used to point to
functions
Provides a more flexible way to call a
function, by providing a choice of which
function to call
Makes it possible to pass functions to
other functions
Not extremely common, but very useful in
the right situations
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 350
Function Pointers
Declaration
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 351
Function Pointers
Initialization
y = fp(x);
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 353
Function Pointers
Passing a Function to a Function
Example 1: Understanding the Mechanism
int x;
int foo(int a, int b); //Function prototype
int bar(int a, int b); //Function prototype
void main(void)
{
x = foobar(5, 12, &foo); //Pass address of foo
}
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 354
Function Pointers
Passing a Function to a Function
Example 2: Evaluate a Definite Integral (approximation)
∫
b
float x; y= f(x) dx
int n; a
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 355
Lab 13
Function Pointers
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 356
Lab 13
Function Pointers
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 357
Lab 13
Function Pointers
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 358
Lab 13
Function Pointers
Results
/*============================================================================
FUNCTION: xsquared()
DESCRIPTION: Implements function y = x^2
PARAMETERS: float x
RETURNS: float (x * x)
REQUIREMENTS: none
============================================================================*/
float xsquared(float x)
{
return (x * x);
}
/*---------------------------------------------------------------------------
Evaluate y2 = Int x^2 dx over the interval 0 to 1
---------------------------------------------------------------------------*/
y2 = integral(0, 1, xsquared);
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 360
Lab 13
Function Pointers
/*============================================================================
FUNCTION: integral()
DESCRIPTION: Evaluates the integral of the function passed to it over the
interval a to b.
PARAMETERS: interval end points a & b and function to integrate
RETURNS: integral of function f over interval a to b
REQUIREMENTS: none
SOURCE: Adapted from example at:
http://en.wikipedia.org/wiki/Function_pointer
============================================================================*/
float integral(float a, float b, float (*f)(float))
{
float sum = 0.0;
float x;
int n;
//Evaluate integral{a,b} f(x) dx
for (n = 0; n <= 100; n++)
{
x = ((n / 100.0) * (b-a)) + a;
sum += (f(x) * (b-a)) / 101.0;
}
return sum;
}
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 361
Lab 13
Conclusions
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 363
Structures
Definition
Structures are collections of variables grouped together
under a common name. The variables within a structure are
referred to as the structure’s members, and may be
accessed individually as needed.
Structures:
May contain any number of members
Members may be of any data type
Allow group of related variables to be treated
as a single unit, even if different types
Ease the organization of complicated data
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 364
Structures
How to Create a Structure Definition
Syntax
struct structName
{
type1 memberName1; Members are declared just
... like ordinary variables
typen memberNamen;
}
Example
// Structure to handle complex numbers
struct complex
{
float re; // Real part
float im; // Imaginary part
}
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 365
Structures
How to Declare a Structure Variable (Method 1)
Syntax
struct structName
{
type1 memberName1;
...
typen memberNamen;
} varName1,...,varNamen;
Example
// Structure to handle complex numbers
struct complex
{
float re;
float im;
} x, y; // Declare x and y of type complex
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 366
Structures
How to Declare a Structure Variable (Method 2)
Syntax
If structName has already been defined:
struct structName varName1,…,varNamen;
Example
struct complex
{
float re;
float im;
}
...
struct complex x, y; // Declare x and y of type complex
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 367
Structures
How to Use a Structure Variable
Syntax
structVariableName.memberName
Example
struct complex
{
float re;
float im;
} x, y; // Declare x and y of type complex
int main(void)
{
x.re = 1.25; // Initialize real part of x
x.im = 2.50; // Initialize imaginary part of x
y = x; // Set struct y equal to struct x
...
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 368
Structures
How to Create a Structure Type with typedef
Syntax
typedef struct structTagoptional
{
type1 memberName1;
...
typen memberNamen;
} typeName;
Example
// Structure type to handle complex numbers
typedef struct
{
float re; // Real part
float im; // Imaginary part
} complex;
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 369
Structures
How to Declare a Structure Type Variable
Syntax
If typeName has already been defined:
typeName varName1,…,varNamen;
Example
typedef struct
{
float re;
float im;
} complex;
...
complex x, y; // Declare x and y of type complex
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 370
Structures
How to Initialize a Structure Variable at Declaration
Syntax
If typeName or structName has already been defined:
typeName varName = {const1,…,constn};
- or -
struct structName varName = {const1,…,constn};
Example
typedef struct
{
float re;
float im;
} complex;
...
complex x = {1.25, 2.50}; // x.re = 1.25, x.im = 2.50
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 371
Structures
Nesting Structures
Example
typedef struct
{
float x;
float y;
y
} point;
typedef struct point
(xb, yb) = (38.5, 17.8) b
{
point a;
point b; m
} line;
line
int main(void)
{ point
line m; a (xa, ya) = (1.2, 7.6)
m.a.x = 1.2;
m.a.y = 7.6; x
m.b.x = 38.5;
m.b.y = 17.8;
...
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 372
Structures
Arrays and Pointers with Strings
Strings:
May be assigned directly to char array
member only at declaration
May be assigned directly to a pointer to char
member at any time
Example: Structure Example: Initializing Members
struct strings int main(void)
{ {
char a[4]; str.a[0] = ‘B’;
char *b; str.a[1] = ‘a’;
} str; str.a[2] = ‘d’;
str.a[3] = ‘\0’;
str.b = “Good”;
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 373
Structures
How to Declare a Pointer to a Structure
If typeName or structName has already been defined:
Syntax
typeName *ptrName;
- or -
struct structName *ptrName;
Example 1 Example 2
typedef struct struct complex
{ {
float re; float re;
float im; float im;
} complex; }
... ...
complex *p; struct complex *p;
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 374
Structures
How to Use a Pointer to Access Structure Members
If ptrName has already been defined:
Syntax
ptrName->memberName
Pointer must first be initialized to point to the address of the
structure itself: ptrName = &structVariable;
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 375
Structures
Creating Arrays of Structures
If typeName or structName has already been defined:
Syntax
typeName arrName[n];
- or -
struct structName arrName[n];
Example
typedef struct
{
float re;
float im;
} complex;
...
complex a[3];
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 376
Structures
Initializing Arrays of Structures at Declaration
If typeName or structName has already been defined:
Syntax
typeName arrName[n] = {{list1},…,{listn}};
- or -
struct structName arrName[n] = {{list1},…,{listn}};
Example
typedef struct
{
float re;
float im;
} complex;
...
complex a[3] = {{1.2, 2.5}, {3.9, 6.5}, {7.1, 8.4}};
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 377
Structures
Using Arrays of Structures
If arrName has already been defined:
Syntax
arrName[n].memberName
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 378
Structures
How to Pass Structures to Functions
Example
typedef struct
{
float re;
float im;
} complex;
void display(complex x)
{
printf(“(%f + j%f)\n”, x.re, x.im);
}
int main(void)
{
complex a = {1.2, 2.5};
complex b = {3.7, 4.0};
display(a);
display(b);
}
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 379
Lab 14
Structures
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 380
Lab 14
Structures
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 381
Lab 14
Structures
Solution: Steps 1 and 2
/*############################################################################
# STEP 1: Calculate the difference between maximum and minimum power in
# circuit 1 using the individual power structures (i.e. variables
# PMax1 & PMin1). Algebraic Notation:
# Pdiff = (Vmax * Imax) - (Vmin * Imin)
############################################################################*/
powerDiff1 = (PMax1.v * PMax1.i) - (PMin1.v * PMin1.i);
powerDiff2 = (PMax2.v * PMax2.i) - (PMin2.v * PMin2.i);
powerDiff3 = (PMax3.v * PMax3.i) - (PMin3.v * PMin3.i);
/*############################################################################
# STEP 2: Calculate the difference between maximum and minimum power in
# circuit 1 using the structure of structures (i.e. variable PRange1).
# Algebraic Notation: Pdiff = (Vmax * Imax) - (Vmin * Imin)
############################################################################*/
powerDiff1 = (PRange1.max.v * PRange1.max.i) - (PRange1.min.v * PRange1.min.i);
powerDiff2 = (PRange2.max.v * PRange2.max.i) - (PRange2.min.v * PRange2.min.i);
powerDiff3 = (PRange3.max.v * PRange3.max.i) - (PRange3.min.v * PRange3.min.i);
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 382
Lab 14
Conclusions
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 383
Lab 15
Arrays of Structures
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 384
Lab 15
Arrays of Structures
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 385
Lab 15
Arrays of Structures
Solution: Steps 1 and 2
/*############################################################################
# STEP 1: Multiply the real (re) part of each array element by 10
# HINT: Use *=
############################################################################*/
//Multiply re part of current array element by 10
x[i].re *= 10;
/*############################################################################
# STEP 2: Multiply the imaginary (im) part of each array element by 5
# HINT: Use *=
############################################################################*/
//Multiply im part of current array element by 5
x[i].im *= 5;
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 386
Lab 15
Conclusions
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 387
Section 1.16
Unions
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 388
Unions
Definition
Unions are similar to structures but a union’s members all
share the same memory location. In essence a union is a
variable that is capable of holding different types of data at
different times.
Unions:
May contain any number of members
Members may be of any data type
Are as large as their largest member
Use exactly the same syntax as structures
except struct is replaced with union
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 389
Unions
How to Create a Union
Syntax
union unionName
{
type1 memberName1;
...
typen memberNamen;
}
Example
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 392
Unions
How Unions Are Stored In Memory
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 393
Unions
How Unions Are Stored In Memory
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 394
Unions
How Unions Are Stored In Memory
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 395
Lab 16
Unions
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 396
Lab 16
Unions
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 397
Lab 16
Unions
Solution: Steps 1 and 2
/*############################################################################
# STEP 1: Set the int member of unionVar equal to 16877.
############################################################################*/
//Set intVar = 16877
unionVar.intVar = 16877;
/*############################################################################
# STEP 2: Set the float member of unionVar equal to 6.02e23.
############################################################################*/
//Set floatVar = 6.02e23
unionVar.floatVar = 6.02e23;
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 398
Lab 16
Conclusions
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 399
Section 1.17
Bit Fields
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 400
Bit Fields
Definition
Bit Fields are unsigned int members of structures that
occupy a specified number of adjacent bits from one to
sizeof(int). They may be used as an ordinary int
variable in arithmetic and logical operations.
Bit Fields:
Are ordinary members of a structure
Have a specified bit width
Are often used in conjunction with unions to
provide bit access to a variable without
masking operations
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 401
Bit Fields
How to Create a Bit Field
Syntax
struct structName
{
unsigned int memberName1: bitWidth;
...
unsigned int memberNamen: bitWidth;
}
Example
typedef struct
{
unsigned int bit0: 1;
unsigned int bit1to3: 3; bitfield struct
unsigned int bit4: 1; may be declared
unsigned int bit5: 1; normally or as a
unsigned int bit6to7: 2; typedef
} byteBits;
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 402
Bit Fields
How to Use a Bit Field
Example
struct byteBits
{ Byte in Data Memory (RAM)
unsigned a: 1; 7 6 5 4 3 2 1 0
unsigned b: 1;
unsigned c: 2; x 11 11 11 00 11 00 00 11
unsigned d: 1;
unsigned e: 3; e d c b a
} x;
int main(void)
{
x.a = 1; //x.a may contain values from 0 to 1
x.b = 0; //x.b may contain values from 0 to 1
x.c = 0b10; //x.c may contain values from 0 to 3
x.d = 0x0; //x.d may contain values from 0 to 1
x.e = 7; //x.e may contain values from 0 to 7
}
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 403
Lab 17
Bit Fields
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 404
Lab 17
Bit Fields
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 405
Lab 17
Bit Fields
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 406
Lab 17
Bit Fields
Bit Field Definition
/*----------------------------------------------------------------------------
VARIABLE DECLARATIONS
----------------------------------------------------------------------------*/
union {
char fullByte;
struct {
int bit0: 1;
int bit1: 1;
int bit2: 1;
int bit3: 1;
int bit4: 1;
int bit5: 1;
int bit6: 1;
int bit7: 1;
} bitField;
} bitByte;
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 407
Lab 17
Bit Fields
Demo Results 1
bitByte.fullByte = 0x55;
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 408
Lab 17
Bit Fields
Demo Results 2
bitByte.bitField.bit0 = 0;
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 409
Lab 17
Bit Fields
Demo Results 3
bitByte.bitField.bit2 = 0;
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 410
Lab 17
Bit Fields
Demo Results 4
bitByte.bitField.bit7 = 1;
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 411
Lab 17
Conclusions
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 412
Section 1.18
Enumerations
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 413
Enumerations
Definition
Enumerations are integer data types that you can create
with a limited range of values. Each value is represented by
a symbolic constant that may be used in conjunction with
variables of the same enumerated type.
Enumerations:
Are unique integer data types
May only contain a specified list of values
Values are specified as symbolic constants
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 414
Enumerations
How to Create an Enumeration Type
Example
Example
Declared independently:
Syntax
Example
enum weekday {SUN, MON, TUE, WED, THR, FRI, SAT} today;
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 417
Enumerations
How to Declare a ‘Tagless’ Enumeration Variable
No type name specified:
Syntax
enum {const-list} varName1,…,varNamen;
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 418
Enumerations
How to Declare an Enumeration Type with typedef
Variables may be declared as type typeName
without needing the enum keyword
Syntax
Example
typedef enum {SUN, MON, TUE, WED, THR, FRI, SAT} weekday;
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 419
Enumerations
How to Use an Enumeration Type Variable
If enumeration and variable have already been defined:
Syntax
varName = labeln;
day = WED;
day = 6; //May only use values from 0 to 6
if (day == WED)
{ …
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 420
Lab 18
Enumerations
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 421
Lab 18
Enumerations
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 422
Lab 18
Enumerations
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 423
Lab 18
Enumerations
Enum Definition and Use
typedef enum {BANDSTOP, LOWPASS, HIGHPASS, BANDPASS} filterTypes;
filterTypes filter;
/*============================================================================
FUNCTION: main()
============================================================================*/
int main(void)
{
filter = BANDPASS;
switch (filter)
{
case BANDSTOP: BandStopFilter(); break;
case LOWPASS: LowPassFilter(); break;
case HIGHPASS: HighPassFilter(); break;
case BANDPASS: BandPassFilter(); break;
}
while(1);
}
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 424
Lab 18
Conclusions
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 425
Section 1.19
Macros with #define
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 426
Macros with #define
Definition
Macros are text replacements created with #define that
insert code into your program. Macros may take parameters
like a function, but the macro code and parameters are
always inserted into code by text substitution.
Macros
Are evaluated by the preprocessor
Are not executable code themselves
Can control the generation of code before the
compilation process
Provide shortcuts
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 427
Macros with #define
Simple Macros
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 428
Macros with #define
Argument Macros
The code must fit on a single line or use '\' to split lines
Text substitution used to insert arguments into code
Each instance of label() will be expanded into code
This is not the same as a C function!
Example
#define min(x, y) ((x)<(y)?(x):(y))
#define square(x) ((x)*(x))
#define swap(x, y) { x ^= y; y ^= x; x ^= y; }
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 429
Macros with #define
Argument Macros – Side Effects
Example
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 430
Lab 19
#define Macros
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 431
Lab 19
#define Macros
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 432
Lab 19
#define Macros
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 433
Lab 19
#define Macros
#define Macro Definition and Use
/*----------------------------------------------------------------------------
MACROS
----------------------------------------------------------------------------*/
#define square(m) ((m) * (m))
#define BaudRate(DesiredBR, FoscMHz) ((((FoscMHz * 1000000)/DesiredBR)/64)-1)
/*============================================================================
FUNCTION: main()
============================================================================*/
int main(void)
{
x = square(3);
printf("x = %d\n", x);
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 434
Lab 19
Conclusions
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 435
Resources
A Selection of C Compilers
Microchip Technology MPLAB® C30 and MPLAB® C18
(Free 'student' versions available)
http://www.microchip.com
Hi-Tech PICC™, PICC-18™, C for dsPIC®/PIC24
http://www.htsoft.com
Custom Computer Services Inc. (CCS) C Compilers
http://www.ccsinfo.com
ByteCraft Ltd. MPC
http://www.bytecraft.com
IAR Systems Embedded Workbench
http://www.iar.com
Small Device C Compiler (Free)
http://sourceforge.net/projects/sdcc/
SourceBoost BoostC™
http://www.sourceboost.com/
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 436
Resources
Books – General C Language
The C Programming Language
2nd Edition (March 22, 1988)
Brian W. Kernighan & Dennis Ritchie
ISBN-10: 0131103628
ISBN-13: 978-0131103627
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 437
Resources
Books – General C Language
Programming Embedded Systems
with C and GNU Development Tools
2nd Edition (October 1, 2006)
Michael Barr & Anthony Massa
ISBN-10: 0596009836
ISBN-13: 978-0596009830
Practical C Programming
3rd Edition (August 1, 1997)
Steve Oualline
ISBN-10: 1565923065
ISBN-13: 978-1565923065
Code Complete
2nd Edition (June 2004) Not about C
Steve McConnell specifically, but a
ISBN-10: 0735619670 must read for all
ISBN-13: 978-0735619678 software engineers
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 438
Resources
Books – PIC® MCU Specific
Programming 16-Bit PIC Microcontrollers in C
Learning to Fly the PIC24
1st Edition (March 16, 2007)
Lucio Di Jasio
ISBN-10: 0750682922
ISBN-13: 978-0750682923
PICmicro MCU C:
An Introduction to Programming the Microchip PIC in CCS C
2nd Edition (August 19, 2002)
Nigel Gardner
ISBN-10: 0972418105
ISBN-13: 978-0972418102
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 439
Resources
Books – Compiler Specific
MPLAB® C30 C Compiler User's Guide
Current Edition (PDF)
MPLAB® C30 Microchip Technology
Compiler
User’s Guide DS51284F
http://www.microchip.com
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 442
Trademarks
The Microchip name and logo, the Microchip logo, Accuron, dsPIC, KeeLoq,
KeeLoq logo, microID, MPLAB, PIC, PICmicro, PICSTART, PRO MATE, rfPIC
and SmartShunt are registered trademarks of Microchip Technology
Incorporated in the U.S.A. and other countries.
AmpLab, FilterLab, Linear Active Thermistor, Migratable Memory, MXDEV,
MXLAB, SEEVAL, SmartSensor and The Embedded Control Solutions
Company are registered trademarks of Microchip Technology Incorporated
in the U.S.A.
Analog-for-the-Digital Age, Application Maestro, CodeGuard, dsPICDEM,
dsPICDEM.net, dsPICworks, ECAN, ECONOMONITOR, FanSense, FlexROM,
fuzzyLAB, In-Circuit Serial Programming, ICSP, ICEPIC, Mindi, MiWi,
MPASM, MPLAB Certified logo, MPLIB, MPLINK, PICkit, PICDEM,
PICDEM.net, PICLAB, PICtail, PowerCal, PowerInfo, PowerMate, PowerTool,
REAL ICE, rfLAB, Select Mode, Smart Serial, SmartTel, Total Endurance,
UNI/O, WiperLock and ZENA are trademarks of Microchip Technology
Incorporated in the U.S.A. and other countries.
SQTP is a service mark of Microchip Technology Incorporated in the U.S.A.
All other trademarks mentioned herein are property of their respective
companies.
© 2007 Microchip Technology Incorporated. All Rights Reserved. 11024 EPC Slide 443