Mikroc: Mikroelektronika
Mikroc: Mikroelektronika
mikroC
Making it simple
Highly sophisticated IDE provides the power you need with the
simplicity of a Windows based point-and-click environment.
Reader’s note
DISCLAIMER:
mikroC and this manual are owned by mikroElektronika and are protected by copyright law
and international copyright treaty. Therefore, you should treat this manual like any other copy-
righted material (e.g., a book). The manual and the compiler may not be copied, partially or
as a whole without the written consent from the mikroEelktronika. The PDF-edition of the
manual can be printed for private or local use, but not for distribution. Modifying the manual
or the compiler is strictly prohibited.
LICENSE AGREEMENT:
By using the mikroC compiler, you agree to the terms of this agreement. Only one person
may use licensed version of mikroC compiler at a time.
Copyright © mikroElektronika 2003 - 2005.
This manual covers mikroC version 2.1 and the related topics. Newer versions may contain
changes without prior notice.
CONTACT US:
mikroElektronika
Voice: + 381 (11) 30 66 377, + 381 (11) 30 66 378
Fax: + 381 (11) 30 66 379
Web: www.mikroelektronika.co.yu
E-mail: [email protected]
page
ii
MikroElektronika: Development tools - Books - Compilers
mikroC User’s manual
Table of Contents
Quick Overview 1
Code Editor 3
Code Explorer 6
Debugger 7
Error Window 11
Statistics 12
Integrated Tools 15
Keyboard Shortcuts 19
Projects 22
Source Files 23
Search Paths 23
Managing Source Files 24
Compilation 26
Output Files 26
Assembly View 26
Error Messages 27
PIC Specifics 30
mikroC Specifics 32
ANSI Standard Issues 32
Predefined Globals and Constants 33
Accessing Individual Bits 33
Interrupts 34
Linker Directives 35
Lexical Elements 36
Tokens 38
Constants 39
Integer Constants 39
Floating Point Constants 41
Character Constants 42
String Constants 44
Enumeration Constants 45
Pointer Constants 45
Constant Expressions 45
page
iv
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Keywords 46
Identifiers 47
Punctuators 48
Objects and Lvalues 52
Scope and Visibility 54
Name Spaces 56
Duration 57
Types 59
Fundamental Types 60
Arithmetic Types 60
Enumeration Types 62
Void Type 64
Derived Types 65
Arrays 65
Pointers 68
Pointer Arithmetic 70
Structures 74
Unions 79
Bit Fields 80
Types Conversions 82
Standard Conversions 82
Explicit Typecasting 84
Declarations 85
Linkage 87
Storage Classes 89
Type Qualifiers 91
Typedef Specifier 92
asm Declaration 93
Initialization 94
Functions 95
Function Declaration 95
Function Prototypes 96
Function Definition 97
Function Calls 98
Operators 100
Precedence and Associativity 100
Arithmetic Operators 102
Relational Operators 104
Bitwise Operators 105
Logical Operators 107
Conditional Operator ? : 109
Assignment Operators 110
sizeof Operator 112
page
v
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Expressions 113
Statements 115
Labeled Statements 115
Expression Statements 116
Selection Statements 116
Iteration Statements 119
Jump Statements 122
Compound Statements (Blocks) 124
Preprocessor 125
Preprocessor Directives 125
Macros 126
File Inclusion 130
Preprocessor Operators 131
Conditional Compilation 132
page
vi
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
page
vii
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
page
viii
MikroElektronika: Development tools - Books - Compilers
CHAPTER
1
mikroC IDE
QUICK OVERVIEW
PIC and C fit together well: PIC is the most popular 8-bit chip in the world, used
in a wide variety of applications, and C, prized for its efficiency, is the natural
choice for developing embedded systems. mikroC provides a successful match
featuring highly advanced IDE, ANSI compliant compiler, broad set of hardware
libraries, comprehensive documentation, and plenty of ready-to-run examples.
Watch
Window
Code
Explorer
Code
Editor
Error
Window
Code Breakpoints
Assistant Window
- Write your C source code using the highly advanced Code Editor
- Monitor your program structure, variables, and functions in the Code Explorer.
Generate commented, human-readable assembly, and standard HEX compatible
with all programmers.
- Inspect program flow and debug executable logic with the integrated Debugger.
Get detailed reports and graphs on code statistics, assembly listing, calling tree…
- We have provided plenty of examples for you to expand, develop, and use as
building bricks in your projects.
page
2
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
CODE EDITOR
The Code Editor is an advanced text editor fashioned to satisfy the needs of pro-
fessionals. General code editing is same as working with any standard text-editor,
including familiar Copy, Paste, and Undo actions, common for Windows environ-
ment.
You can customize these options from the Editor Settings dialog. To access the
settings, choose Tools > Options from the drop-down menu, or click the Tools
icon.
Tools Icon.
page
3
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
If you type a first few letter of a word and then press CTRL+SPACE, all the valid
identifiers matching the letters you typed will be prompted in a floating panel (see
the image). Now you can keep typing to narrow the choice, or you can select one
from the list using the keyboard arrows and Enter.
The Parameter Assistant will be automatically invoked when you open a parenthe-
sis "(" or press CTRL+SHIFT+SPACE. If name of a valid function precedes the
parenthesis, then the expected parameters will be prompted in a floating panel. As
you type the actual parameter, the next expected parameter will become bold.
You can insert the Code Template by typing the name of the template (for
instance, whileb), then press CTRL+J, and the Code Editor will automatically
generate the code. Or you can click a button from the Code toolbar and select a
template from the list.
You can add your own templates to the list. Just select Tools > Options from the
drop-down menu, or click the Tools Icon from Settings Toolbar, and then select
the Auto Complete Tab. Here you can enter the appropriate keyword, description,
and code of your template.
page
4
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Auto Correct
The Auto Correct feature corrects common typing mistakes. To access the list of
recognized typos, select Tools > Options from the drop-down menu, or click the
Tools Icon, and then select the Auto Correct Tab. You can also add your own pref-
erences to the list.
Comment/Uncomment
Comment / The Code Editor allows you to comment or uncomment selected block of code by
Uncomment Icon.
a simple click of a mouse, using the Comment/Uncomment icons from the Code
Toolbar.
Bookmarks
CTRL+<number> : Go to a bookmark
CTRL+SHIFT+<number> : Set a bookmark
Goto Line
Goto Line option makes navigation through large code easier. Select Search >
Goto Line from the drop-down menu, or use the shortcut CTRL+G.
page
5
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
CODE EXPLORER
The Code Explorer is placed to the left of the main window by default, and gives a
clear view of every declared item in the source code. You can jump to a declara-
tion of any item by clicking it, or by clicking the Find Declaration icon. To expand
or collapse treeview in Code Explorer, use the Collapse/Expand All icon.
Also, two more tabs are available in Code Explorer. QHelp Tab lists all the avail-
able built-in and library functions, for a quick reference. Double-clicking a routine
Collapse/Expand in QHelp Tab opens the relevant Help topic. Keyboard Tab lists all the available
All Icon. keyboard shortcuts in mikroC.
page
6
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
DEBUGGER
The source-level Debugger is an integral component of mikroC development envi-
ronment. It is designed to simulate operations of Microchip Technology's
PICmicros and to assist users in debugging software written for these devices.
Start Debugger
The Debugger simulates program flow and execution of instruction lines, but does
not fully emulate PIC device behavior: it does not update timers, interrupt flags,
etc.
After you have successfully compiled your project, you can run the Debugger by
selecting Run > Debug from the drop-down menu, or by clicking the Debug Icon .
Starting the Debugger makes more options available: Step Into, Step Over, Run to
Cursor, etc. Line that is to be executed is color highlighted.
Debug [F9]
Start the Debugger.
Pause Debugger
Run/Pause Debugger [F6]
Run or pause the Debugger.
page
7
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Watch Window
Variables
The Watch Window allows you to monitor program items while running your pro-
gram. It displays variables and special function registers of PIC MCU, their
addresses and values. Values are updated as you go through the simulation.
Double clicking one of the items opens a window in which you can assign a new
value to the selected variable or register and change number formatting.
page
8
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Stopwatch Window
The Stopwatch Window displays the current count of cycles/time since the last
Debugger action. Stopwatch measures the execution time (number of cycles) from
the moment the Debugger is started, and can be reset at any time. Delta represents
the number of cycles between the previous instruction line (line where the
Debugger action was performed) and the active instruction line (where the
Debugger action landed).
Note: You can change the clock in the Stopwatch Window; this will recalculate
values for the newly specified frequency. Changing the clock in the Stopwatch
Window does not affect the actual project settings – it only provides a simulation.
page
9
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
The Call Stack Window keeps track of depth and order of nested routine calls in
program simulation. Check the Nested Calls Limitations for more information.
Note: Real scenarios may differ from the simulation, depending on runtime
program parameters.
page
10
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
ERROR WINDOW
In case that errors were encountered during compiling, the compiler will report
them and won't generate a hex file. The Error Window will be prompted at the
bottom of the main window by default.
The Error Window is located under the message tab, and displays location and
type of errors compiler has encountered. The compiler also reports warnings, but
these do not affect the output; only errors can interefere with generation of hex.
Double click the message line in the Error Window to highlight the line where the
error was encountered.
Consult the Error Messages for more information about errors recognized by the
compiler.
page
11
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
STATISTICS
After successful compilation, you can review statistics of your code. Select Project
> View Statistics from the drop-down menu, or click the Statistics icon. There are
Statistics Icon. six tab windows:
page
12
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
size, start and end address, calling frequency, return type, etc.
page
13
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
RAM Window
Summarizes all GPR and SFR registers and their addresses. Also displays symbol-
ic names of variables and their addresses.
ROM Window
Lists op-codes and their addresses in form of a human readable hex code.
page
14
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
INTEGRATED TOOLS
USART Terminal
mikroC includes the USART (Universal Synchronous Asynchronous Receiver
Transmitter) communication terminal for RS232 communication. You can launch
it from the drop-down menu Tools > Terminal or by clicking the Terminal icon.
ASCII Chart
The ASCII Chart is a handy tool, particularly useful when working with LCD dis-
play. You can launch it from the drop-down menu Tools > ASCII chart.
page
15
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
EEPROM Editor
EEPROM Editor allows you to easily manage EEPROM of PIC microcontroller.
page
16
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
mikroBootloader
mikroBootloader can be used only with PICmicros that support flash write.
1. Load the PIC with the appropriate hex file using the conventional programming
techniques (e.g. for PIC16F877A use p16f877a.hex).
2. Start mikroBootloader from the drop-down menu Tools > Bootoader.
3. Click on Setup Port and select the COM port that will be used. Make sure that
BAUD is set to 9600 Kpbs.
4. Click on Open File and select the HEX file you would like to upload.
5. Since the bootcode in the PIC only gives the computer 4-5 sec to connect, you
should reset the PIC and then click on the Connect button within 4-5 seconds.
6. The last line in then history window should now read “Connected”.
7. To start the upload, just click on the Start Bootloader button.
8. Your program will written to the PIC flash. Bootloader will report an errors that
may occur.
9. Reset your PIC and start to execute.
The boot code gives the computer 5 seconds to get connected to it. If not, it starts
running the existing user code. If there is a new user code to be downloaded, the
boot code receives and writes the data into program memory.
The more common features a bootloader may have are listed below:
page
17
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
KEYBOARD SHORTCUTS
Below is the complete list of keyboard shortcuts available in mikroC IDE. You can
also view keyboard shortcuts in Code Explorer window, tab Keyboard.
IDE Shortcuts
F1 Help
CTRL+N New Unit
CTRL+O Open
CTRL+F9 Compile
CTRL+F11 Code Explorer on/off
CTRL+SHIFT+F5 View breakpoints
page
18
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Debugger Shortcuts
F4 Run to Cursor
F5 Toggle breakpoint
F6 Run/Pause Debugger
F7 Step into
F8 Step over
F9 Debug
CTRL+F2 Reset
page
19
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
page
20
MikroElektronika: Development tools - Books - Compilers
CHAPTER
2
Building
Applications
Creating applications in mikroC is easy and intuitive. Project Wizard allows you to
set up your project in just few clicks: name your application, select chip, set flags,
and get going.
mikroC allows you to distribute your projects in as many files as you find appro-
priate. You can then share your mikroCompiled Libraries (.mcl files) with other
developers without disclosing the source code. The best part is that you can use
.mcl bundles created by mikroPascal or mikroBasic!
PROJECTS
mikroC organizes applications into projects, consisting of a single project file
(extension .ppc) and one or more source files (extension .c). You can compile
source files only if they are part of a project.
New Project
New Project.
The easiest way to create project is by means of New Project Wizard, drop-down
menu Project > New Project. Just fill the dialog with desired values (project name
and description, location, device, clock, config word) and mikroC will create the
appropriate project file. Also, an empty source file named after the project will be
created by default.
Editing Project
Edit Project.
Later, you can change project settings from drop-down menu Project > Edit
Project. You can rename the project, modify its description, change chip, clock,
config word, etc. To delete a project, simply delete the folder in which the project
file is stored.
Add to Project.
Project can contain any number of source files (extension .c). The list of relevant
source files is stored in the project file (extension .ppc). To add source file to
your project, select Project > Add to Project from drop-down menu. Each added
source file must be self-contained, i.e. it must have all the necessary definitions
after preprocessing. To remove file(s) from your project, select Project > Remove
Remove from
Project. from Project from drop-down menu.
Note: For inclusion of header files, use the preprocessor directive #include.
page
22
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
SOURCE FILES
Source files containing C code should have the extension .c. List of source files
relevant for the application is stored in project file with extension .ppc, along
with other project information. You can compile source files only if they are part
of a project.
Use the preprocessor directive #include to include headers. Do not rely on pre-
processor to include other source files — see Projects for more information.
Search Paths
You can specify your own custom search paths. This can be configured by select-
ing Tools > Options from drop-down menu and then tab window Advanced.
In project settings, you can specify either absolute or relative path to the source
file. If you specify a relative path, mikroC will look for the file in following loca-
tions, in this particular order:
1. the project folder (folder which contains the project file .ppc),
2. your custom search paths,
3. mikroC installation folder > “uses” folder.
page
23
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
If #include directive was used with the <header_name> version, the search is
made successively in each of the following locations, in this particular order:
1. the project folder (folder which contains the project file .ppc),
2. mikroC installation folder > “include” folder,
3. your custom search paths.
New File.
To create a new source file, do the following:
Select File > New from drop-down menu, or press CTRL+N, or click the New
File icon. A new tab will open, named “Untitled1”. This is your new source file.
Select File > Save As from drop-down menu to name it the way you want.
If you have used New Project Wizard, an empty source file, named after the proj-
ect with extension .c, is created automatically. mikroC does not require you to
have source file named same as the project, it’s just a matter of convenience.
page
24
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Select File > Open from drop-down menu, or press CTRL+O, or click the Open
Open File Icon.
File icon. The Select Input File dialog opens. In the dialog, browse to the location
of the file you want to open and select it. Click the Open button.
The selected file is displayed in its own tab. If the selected file is already open, its
current Editor tab will become active.
Saving File
Save File As. Make sure that window containing the file you want to save is the active window.
Select File > Save As from drop-down menu, or press SHIFT+CTRL+S. The New
File Name dialog will be displayed. In the dialog, browse to the folder where you
want to save the file. In the File Name field, modify the name of the file you want
to save. Click the Save button.
Closing a File
Close File.
Make sure that tab containing the file you want to close is the active tab. Select
File > Close from drop-down menu, or right click the tab of the file you want to
close in Code Editor. If the file has been changed since it was last saved, you will
be prompted to save your changes.
page
25
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
COMPILATION
When you have created the project and written the source code, you will want to
compile it. Select Project > Build from drop-down menu, or click Build Icon, or
Compile Icon. simply hit CTRL+F9.
Progress bar will appear to inform you about the status of compiling. If there are
errors, you will be notified in the Error Window. If no errors are encountered,
mikroC will generate output files.
Output Files
Upon successful compilation, mikroC will generate output files in the project fold-
er (folder which contains the project file .ppc). Output files are summarized
below:
Assembly View
After compiling your program in mikroC, you can click View Assembly Icon or
select Project › View Assembly from drop-down menu to review generated assem-
View Assembly bly code (.asm file) in a new tab window. Assembly is human readable with sym-
Icon. bolic names. All physical addresses and other information can be found in
Statistics or in list file (.lst).
If the program is not compiled and there is no assembly file, starting this option
will compile your code and then display assembly.
page
26
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
ERROR MESSAGES
Error Messages
- Specifier needed
- Invalid declarator
- Expected '(' or identifier
- Integer const expected
- Array dimension must be greater then 0
- Local objects cannot be extern
- Declarator error
- Bad storage class
- Arguments cannot be of void type
- Specifer/qualifier list expected
- Address must be greater than 0
- Identifier redefined
- case out of switch
- default label out of switch
- switch exp. must evaluate to integral type
- continue outside of loop
- break outside of loop or switch
- void func cannot return values
- Unreachable code
- Illegal expression with void
- Left operand must be pointer
- Function required
- Too many chars
- Undefined struct
- Nonexistent field
- Aggregate init error
- Incompatible types
- Identifier redefined
- Function definition not found
- Signature does not match
- Cannot generate code for expression
- Too many initializers of subaggregate
- Nonexistent subaggregate
- Stack Overflow: func call in complex expression
- Syntax Error: expected %s but %s found
- Array element cannot be function
- Function cannot return array
page
27
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
page
28
MikroElektronika: Development tools - Books - Compilers
CHAPTER
3
mikroC Language
Reference
C offers unmatched power and flexibility in programming microcontrollers.
mikroC adds even more power with an array of libraries, specialized for PIC HW
modules and communications. This chapter should help you learn or recollect C
syntax, along with the specifics of programming PIC microcontrollers. If you are
experienced in C programming, you will probably want to consult mikroC
Specifics first.
PIC SPECIFICS
In order to get the most from your mikroC compiler, you should be familiar with
certain aspects of PIC MCU. This knowledge is not essential, but it can provide
you a better understanding of PICs’ capabilities and limitations, and their impact
on the code writing.
Types Efficiency
First of all, you should know that PIC’s ALU, which performs arithmetic opera-
tions, is optimized for working with bytes. Although mikroC is capable of han-
dling very complex data types, PIC may choke on them, especially if you are
working on some of the older models. This can dramatically increase the time
needed for performing even simple operations. Universal advice is to use the
smallest possible type in every situation. It applies to all programming in general,
and doubly so with microcontrollers.
When it comes down to calculus, not all PICmicros are of equal performance. For
example, PIC16 family lacks hardware resources to multiply two bytes, so it is
compensated by a software algorithm. On the other hand, PIC18 family has HW
multiplier, and as a result, multiplication works considerably faster.
Nested call represents a function call within function body, either to itself (recur-
sive calls) or to another function. Recursive calls, as form of cross-calling, are
unsupported by mikroC due to the PIC’s stack and memory limitations.
The number of allowed nested calls decreases by one if you use any of the follow-
ing operators in the code: * / %. It further decreases by one if you use interrupt
in the program. If the allowed number of nested calls is exceeded, compiler will
report stack overflow error.
page
30
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
PIC16 Specifics
In applications targeted at PIC16, no single routine should exceed one page (2,000
instructions). If routine does not fit within one page, linker will report an error.
When confront with this problem, maybe you should rethink the design of your
application – try breaking the particular routine into several chunks, etc.
Pointers with PIC16 are “near”: they carry only the lower 8 bits of the address.
Compiler will automatically clear the 9th bit upon startup, so that pointers will
refer to banks 0 and 1. To access the objects in banks 3 or 4 via pointer, user
should manually set the IRP, and restore it to zero after the operation. The stated
rules apply to any indirect approach: arrays, structures and unions assignments,
etc.
Note: It is very important to take care of the IRP properly, if you plan to follow
this approach. If you find this method to be inappropriate with too many variables,
you might consider upgrading to PIC18.
Note: If you have many variables in the code, try rearranging them with linker
directive absolute. Variables that are approached only directly should be moved
to banks 3 and 4 for increased efficiency.
page
31
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
mikroC SPECIFICS
ANSI Standard Issues
mikroC diverges from the ANSI C standard in few areas. Some of these modifica-
tions are improvements intenteded to facilitate PIC programming, while others are
result of PICmicro hardware limitations:
Function cross-calling and recursion are unsupported due to the PIC’s limitations
of no easily-usable stack and limited memory.
Pointers to variables and pointers to constants are not compatible, i.e. no assigning
or comparison is possible between the two.
Function calls from within interrupts are a special case. See Interrupts.
mikroC treats identifiers declared with const qualifier as “true constants” (C++
style). This allows using const objects in places where ANSI C would expect a
constant expression. If aiming at portability, use the traditional preprocessor
defined constants. See Type Qualifiers and Constants.
Tags scope is specific. Due to separate name space, tags are virtually removed
from normal scope rules: they have file scope, but override any block rules.
mikroC allows C++ style single–line comments using two adjacent slashes (//).
Implementation-defined Behavior
page
32
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
All PIC SFR registers are implicitly declared as global variables of volatile
unsigned short. These identifiers have external linkage, and are visible in the
entire project. When creating a project, mikroC will include an appropriate .def
file, containing declarations of available SFR and constants (such as T0IE, INTF,
etc). Identifiers are all in uppercase, identical to nomenclature in Microchip
datasheets. For the complete set of predefined globals and constants, look for
“Defs” in your mikroC installation folder, or probe the Code Assistant for specific
letters (Ctrl+Space in Editor).
There are two built-in constants related to device clock: ___FOSC and ___FCY.
Constant ___FOSC equals the frequency that is provided by an external oscillator,
while ___FCY is the operating frequency of PIC. Both constants can be used any-
where in the code, and are automatically updated as you change target PIC in your
project. Source files that use these constants are recompiled any time the clock is
changed in IDE.
mikroC allows you to access individual bits of 8-bit variables, types char and
unsigned short. Simply use the direct member selector (.) with a variable,
followed by one of identifiers F0, F1, … , F7. For example:
There is no need for any special declarations; this kind of selective access is an
intrinsic feature of mikroC and can be used anywhere in the code. Identifiers
F0–F7 are not case sensitive and have a specific namespace.
Provided you are familiar with the particular chip, you can access bits by their
name:
page
33
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Interrupts
void interrupt(void);
Write your own definition (function body) to handle interrupts in your application.
mikroC saves the following SFR on stack when entering interrupt and pops them
back upon return:
Note: mikroC does not support low priority interrupts; for PIC18 family, interrupts
must be of high priority.
You cannot call functions from within interrupt routine, but you can make a
function call from embedded assembly in interrupt. For this to work, the called
function (func1 in further text) must fulfill the following conditions:
1. func1 does not use stack (or the stack is saved before call, and restored after),
2. func1 must use global variables only.
The stated rules also apply to all the functions called from within func1.
Note: mikroC linker ignores calls to functions that occur only in interrupt assem-
bler. For linker to recognize these functions, you need to make a call in C code,
outside of interrupt body.
Here is a simple example of handling the interrupts from TMR0 (if no other
interrupts are allowed):
void interrupt() {
counter++;
TMR0 = 96;
INTCON = $20;
}//~
page
34
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Linker Directives
mikroC uses internal algorithm to distribute objects within memory. If you need to
have variable or routine at specific predefined address, use linker directives
absolute and org.
Directive absolute
Directive absolute specifies the starting address in RAM for variable. If variable is
multi-byte, higher bytes are stored at consecutive locations. Directive absolute is
appended to the declaration of variable:
Be careful when using absolute directive, as you may overlap two variables by
mistake. For example:
Directive org
page
35
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
LEXICAL ELEMENTS
These topics provide a formal definition of the mikroC lexical elements. They
describe the different categories of word-like units (tokens) recognized by a lan-
guage.
In the tokenizing phase of compilation, the source code file is parsed (that is, bro-
ken down) into tokens and whitespace. The tokens in mikroC are derived from a
series of operations performed on your programs by the compiler and its built-in
preprocessor.
Whitespace
Whitespace is the collective name given to spaces (blanks), horizontal and vertical
tabs, newline characters, and comments. Whitespace can serve to indicate where
tokens start and end, but beyond this function, any surplus whitespace is discard-
ed. For example, the two sequences
int i; float f;
and
int i;
float f;
are lexically equivalent and parse identically to give the six tokens.
The ASCII characters representing whitespace can occur within literal strings, in
which case they are protected from the normal parsing process (they remain as
part of the string).
page
36
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Comments
Comments are pieces of text used to annotate a program, and are technically
another form of whitespace. Comments are for the programmer’s use only; they
are stripped from the source text before parsing. There are two ways to delineate
comments: the C method and the C++ method. Both are supported by mikroC.
C comments
C comment is any sequence of characters placed after the symbol pair /*. The
comment terminates at the first occurrence of the pair */ following the initial /*.
The entire sequence, including the four comment-delimiter symbols, is replaced by
one space after macro expansion.
In mikroC,
parses as:
int i;
Note that mikroC does not support the nonportable token pasting strategy using
/**/. For more on token pasting, refer to Preprocessor topics.
C++ comments
mikroC allows single-line comments using two adjacent slashes (//). The com-
ment can start in any position, and extends until the next new line. The following
code,
parses as:
int i;
int j;
page
37
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
TOKENS
Token is the smallest element of a C program that is meaningful to the compiler.
The parser separates tokens from the input stream by creating the longest token
possible using the input characters in a left–to–right scan.
- keywords,
- identifiers,
- constants,
- operators,
- punctuators (also known as separators).
Here is an example of token extraction. Let’s have the following code sequence:
inter = a+++b;
First, note that inter would be parsed as a single identifier, rather than as the
keyword int followed by the identifier er.
The programmer who wrote the code might have intended to write
inter = a + (++b)
but it won’t work that way. The compiler would parse it as the following seven
tokens:
inter // identifier
= // assignment operator
a // identifier
++ // postincrement operator
+ // addition operator
b // identifier
; // semicolon separator
page
38
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
CONSTANTS
Constants or literals are tokens representing fixed numeric or character values.
mikroC supports:
- integer constants,
- floating point constants,
- character constants,
- string constants (strings literals),
- enumeration constants.
The data type of a constant is deduced by the compiler using such clues as numer-
ic value and the format used in the source code.
Integer Constants
Integer constants can be decimal (base 10), hexadecimal (base 16), binary (base
2), or octal (base 8). In the absence of any overriding suffixes, the data type of an
integer constant is derived from its value.
The suffix L (or l) attached to any constant forces the constant to be represented
as a long. Similarly, the suffix U (or u) forces the constant to be unsigned. You
can use both L and U suffixes on the same constant in any order or case: ul, Lu,
UL, etc.
In the absence of any suffix (U, u, L, or l), constant is assigned the “smallest” of
the following types that can accommodate its value: short, unsigned short,
int, unsigned int, long int, unsigned long int.
page
39
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Otherwise:
If the constant has a U or u suffix, its data type will be the first of the following
that can accommodate its value: unsigned short, unsigned int, unsigned
long int.
If the constant has an L or l suffix, its data type will be the first of the following
that can accommodate its value: long int, unsigned long int.
If the constant has both U and L suffixes, (ul, lu, Ul, lU, uL, Lu, LU, or UL), its
data type will be unsigned long int.
Decimal Constants
In the absence of any overriding suffixes, the data type of a decimal constant is
derived from its value, as shown below:
Hexadecimal Constants
All constants starting with 0x (or 0X) are taken to be hexadecimal. In the absence
of any overriding suffixes, the data type of an hexadecimal constant is derived
from its value, according to the rules presented above. For example, 0xC367 will
be treated as unsigned int.
page
40
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Binary Constants
All constants starting with 0b (or 0B) are taken to be binary. In the absence of any
overriding suffixes, the data type of an binary constant is derived from its value,
according to the rules presented above. For example, 0b11101 will be treated as
short.
Octal Constants
All constants with an initial zero are taken to be octal. If an octal constant contains
the illegal digits 8 or 9, an error is reported. In the absence of any overriding suf-
fixes, the data type of an octal constant is derived from its value, according to the
rules presented above. For example, 0777 will be treated as int.
- Decimal integer,
- Decimal point,
- Decimal fraction,
- e or E and a signed integer exponent (optional),
- Type suffix: f or F or l or L (optional).
You can omit either the decimal integer or the decimal fraction (but not both). You
can omit either the decimal point or the letter e (or E) and the signed integer expo-
nent (but not both). These rules allow for conventional and scientific (exponent)
notations.
Negative floating constants are taken as positive constants with the unary operator
minus (-) prefixed.
mikroC floating-point constants are of type double. Note that mikroC’s imple-
mentation of ANSI Standard considers float and double (together with the
long double variant) to be the same type.
page
41
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Character Constants
Escape Sequences
The backslash character (\) is used to introduce an escape sequence, which allows
the visual representation of certain nongraphic characters. One of the most com-
mon escape constants is the newline character (\n).
For example, the octal number \777 is larger than the maximum value allowed
(\377) and will generate an error. The first nonoctal or nonhexadecimal character
encountered in an octal or hexadecimal escape sequence marks the end of the
sequence.
Note: You must use \\ to represent an ASCII backslash, as used in operating sys-
tem paths.
page
42
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
\b 0x08 BS Backspace
\f 0x0C FF Formfeed
\\ 0x5C \ Backslash
Single quote
\' 0x27 '
(Apostrophe)
O = string of up to 3
\O any
octal digits
H = string of hex dig-
\xH any
its
H = string of hex dig-
\XH any
its
page
43
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
String Constants
String constants, also known as string literals, are a special type of constants
which store fixed sequences of characters. A string literal is a sequence of any
number of characters surrounded by double quotes:
"This is a string."
The null string, or empty string, is written like "". A literal string is stored inter-
nally as the given sequence of characters plus a final null character. A null string is
stored as a single null character.
The characters inside the double quotes can include escape sequences, e.g.
"\t\"Name\"\\\tAddress\n\n"
Adjacent string literals separated only by whitespace are concatenated during the
parsing phase. For example:
is an equivalent to
You can also use the backslash (\) as a continuation character to extend a string
constant across line boundaries:
"This is really \
a one-line string."
page
44
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Enumeration Constants
Enumeration constants are identifiers defined in enum type declarations. The iden-
tifiers are usually chosen as mnemonics to assist legibility. Enumeration constants
are of int type. They can be used in any expression where integer constants are
valid.
For example:
The identifiers (enumerators) used must be unique within the scope of the enum
declaration. Negative initializers are allowed. See Enumerations for details of
enum declarations.
Pointer Constants
A pointer or the pointed-at object can be declared with the const modifier.
Anything declared as a const cannot be have its value changed. It is also illegal
to create a pointer that might violate the nonassignability of a constant object.
Constant Expressions
Constant expressions can consist only of the following: literals, enumeration con-
stants, simple constants (no constant arrays or structures), sizeof operators.
Constant expressions cannot contain any of the following operators, unless the
operators are contained within the operand of a sizeof operator: assignment,
comma, decrement, function call, increment.
page
45
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
KEYWORDS
Keywords are words reserved for special purposes and must not be used as normal
identifier names.
Beside standard C keywords, all relevant SFR are defined as global variables and
represent reserved words that cannot be redefined (for example: TMR0, PCL, etc).
Probe the Code Assistant for specific letters (Ctrl+Space in Editor) or refer to
Predefined Globals and Constants.
page
46
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
IDENTIFIERS
Identifiers are arbitrary names of any length given to functions, variables, symbol-
ic constants, user-defined data types, and labels. All these program elements will
be referred to as objects throughout the help (not to be confused with the meaning
of object in object-oriented programming).
Identifiers can contain the letters a to z and A to Z, the underscore character “_”,
and the digits 0 to 9. The only restriction is that the first character must be a letter
or an underscore.
Case Sensitivity
mikroC identifiers are not case sensitive at present, so that Sum, sum, and suM rep-
resent an equivalent identifier. However, future versions of mikroC will offer the
option of activating/suspending case sensitivity. The only exceptions at present are
the reserved words main and interrupt which must be written in lowercase.
Although identifier names are arbitrary (within the rules stated), errors result if the
same name is used for more than one identifier within the same scope and sharing
the same name space. Duplicate names are legal for different name spaces regard-
less of scope rules. For more information on scope, refer to Scope and Visibility.
page
47
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
PUNCTUATORS
The mikroC punctuators (also known as separators) include brackets, parentheses,
braces, comma, semicolon, colon, asterisk, equal sign, and pound sign. Most of
these punctuators also function as operators.
Brackets
Parentheses
page
48
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Braces
if (d == z) {
++x;
func();
}
The closing brace serves as a terminator for the compound statement, so a semi-
colon is not required after the }, except in structure declarations. Often, the semi-
colon is illegal, as in
if (statement)
{ ... }; /* illegal semicolon! */
else
{ ... };
Comma
The comma is also used as an operator in comma expressions. Mixing the two
uses of comma is legal, but you must use parentheses to distinguish them. Note
that (exp1, exp2) evalutates both but is equal to the second:
page
49
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Semicolon
The semicolon (;) is a statement terminator. Any legal C expression (including the
empty expression) followed by a semicolon is interpreted as a statement, known as
an expression statement. The expression is evaluated and its value is discarded. If
the expression statement has no side effects, mikroC might ignore it.
Colon
start: x = 0;
...
goto start;
You can also use the asterisk as an operator to either dereference a pointer or as
the multiplication operator:
i = *char_ptr;
page
50
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Equal Sign
The equal sign (=) separates variable declarations from initialization lists:
int a, b, c;
a = b + c;
The pound sign (#) indicates a preprocessor directive when it occurs as the first
nonwhitespace character on a line. It signifies a compiler action, not necessarily
associated with code generation. See Preprocessor Directives for more informa-
tion.
# and ## are also used as operators to perform token replacement and merging
during the preprocessor scanning phase. See Preprocessor Operators.
page
51
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
An object is a specific region of memory that can hold a fixed or variable value
(or set of values). To prevent confusion, this use of the word object is different
from the more general term used in object-oriented languages. Our definiton of the
word would encompass functions, variables, symbolic constants, user-defined data
types, and labels.
Each value has an associated name and type (also known as a data type). The
name is used to access the object. This name can be a simple identifier, or it can
be a complex expression that uniquely references the object.
Associating identifiers with objects requires each identifier to have at least two
attributes: storage class and type (sometimes referred to as data type). The mikroC
compiler deduces these attributes from implicit or explicit declarations in the
source code. Commonly, only the type is explicitly specified and the storage class
specifier assumes automatic value auto.
variables; functions; types; arrays of other types; structure, union, and enumeration
tags; structure members; union members; enumeration constants; statement labels;
preprocessor macros.
The recursive nature of the declarator syntax allows complex declarators. You’ll
probably want to use typedefs to improve legibility if constructing complex
objects.
page
52
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Lvalues
Historically, the l stood for “left”, meaning that an lvalue could legally stand on
the left (the receiving end) of an assignment statement. Now only modifiable lval-
ues can legally stand to the left of an assignment operator. For example, if a and b
are nonconstant integer identifiers with properly allocated memory storage, they
are both modifiable lvalues, and assignments such as a = 1 and b = a + b are
legal.
Rvalues
page
53
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
The scope of identifier is the part of the program in which the identifier can be
used to access its object. There are different categories of scope: block (or local),
function, function prototype, and file. These depend on how and where identifiers
are declared.
Block Scope
The scope of an identifier with block (or local) scope starts at the declaration point
and ends at the end of the block containing the declaration (such a block is known
as the enclosing block). Parameter declarations with a function definition also
have block scope, limited to the scope of the function body.
File Scope
File scope identifiers, also known as globals, are declared outside of all blocks;
their scope is from the point of declaration to the end of the source file.
Function Scope
The only identifiers having function scope are statement labels. Label names can
be used with goto statements anywhere in the function in which the label is
declared. Labels are declared implicitly by writing label_name: followed by a
statement. Label names must be unique within a function.
Tag Scope
Structure, union, and enumeration tags are somewhat specific in mikroC. Due to
separate name space, tags are virtually removed from normal scope rules: they
have file scope, but override any block rules. Thus, deeply nested declaration of
structure is identical to an equivalent global declaration. As a consequence, once
that you have defined a tag, you cannot redefine it in any block within file.
page
54
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Visibility
The visibility of an identifier is that region of the program source code from which
legal access can be made to the identifier’s associated object.
Scope and visibility usually coincide, though there are circumstances under which
an object becomes temporarily hidden by the appearance of a duplicate identifier:
the object still exists but the original identifier cannot be used to access it until the
scope of the duplicate identifier is ended.
Technically, visibility cannot exceed scope, but scope can exceed visibility. Take a
look at the following example:
void f (int i) {
int j; // auto by default
j = 3; // int i and j are in scope and visible
{ // nested block
double j; // j is local name in the nested block
j = 0.1; // i and double j are visible;
// int j = 3 in scope but hidden
}
// double j out of scope
j += 1; // int j visible and = 4
}
// i and j are both out of scope
page
55
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
NAME SPACES
Name space is the scope within which an identifier must be unique. C uses four
distinct categories of identifiers:
Duplicate names are legal for different name spaces regardless of scope rules.
For example:
{ // open a block
enum colors { black, red, green, blue, violet, white } c;
/* enumerator blue hides outer declaration of int blue */
double red = 2;
// ILLEGAL: redefinition of red
}
page
56
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
DURATION
Duration, closely related to storage class, defines the period during which the
declared identifiers have real, physical objects allocated in memory. We also dis-
tinguish between compile-time and run-time objects. Variables, for instance, unlike
typedefs and types, have real memory allocated during run time. There are two
kinds of duration: static and local.
Static Duration
In mikroC, static duration objects are not initialized to zero (or null) in the absence
of any explicit initializer.
An object can have static duration and local scope – see the example on the fol-
lowing page.
Local Duration
Local duration objects are also known as automatic objects. They are created on
the stack (or in a register) when the enclosing block or function is entered. They
are deallocated when the program exits that block or function. Local duration
objects must be explicitly initialized; otherwise, their contents are unpredictable.
The storage class specifier auto can be used when declaring local duration vari-
ables, but is usually redundant, because auto is the default for variables declared
within a block.
An object with local duration also has local scope, because it does not exist out-
side of its enclosing block. The converse is not true: a local scope object can have
static duration.
page
57
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Here is an example of two objects with local scope, but with different duration:
void f() {
/* local duration var; init a upon every call to f */
int a = 1;
/* checkpoint! */
a++;
b++;
}
void main() {
/* At checkpoint, we will have: */
f(); // a=1, b=1, after first call,
f(); // a=1, b=2, after second call,
f(); // a=1, b=3, after third call,
// etc.
}
page
58
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
TYPES
C is strictly typed language, which means that every object, function, and expres-
sion need to have a strictly defined type, known in the time of compilation. Note
that C works exclusively with numeric types.
mikroC supports many standard (predefined) and user-defined data types, includ-
ing signed and unsigned integers in various sizes, floating-point numbers in vari-
ous precisions, arrays, structures, and unions. In addition, pointers to most of these
objects can be established and manipulated in memory.
The type determines how much memory is allocated to an object and how the pro-
gram will interpret the bit patterns found in the object’s storage allocation. A given
data type can be viewed as a set of values (often implementation-dependent) that
identifiers of that type can assume, together with a set of operations allowed on
those values. The compile-time operator, sizeof, lets you determine the size in
bytes of any standard or user-defined type.
The mikroC standard libraries and your own program and header files must pro-
vide unambiguous identifiers (or expressions derived from them) and types so that
mikroC can consistently access, interpret, and (possibly) change the bit patterns in
memory corresponding to each active object in your program.
Type Categories
The fudamental types represent types that cannot be separated into smaller parts.
They are sometimes referred to as unstructured types. The fundamental types are
void, char, int, float, and double, together with short, long, signed, and
unsigned variants of some of these.
The derived types are also known as structured types. The derived types include
pointers to other types, arrays of other types, function types, structures, and
unions.
page
59
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
FUNDAMENTAL TYPES
Arithmetic Types
The arithmetic type specifiers are built from the following keywords: void, char,
int, float, and double, together with prefixes short, long, signed, and
unsigned. From these keywords you can build the integral and floating-point
types. Overview of types is given on the following page.
Integral Types
Types char and int, together with their variants, are considered integral data
types. Variants are created by using one of the prefix modifiers short, long,
signed, and unsigned.
The table below is the overview of the integral types – keywords in parentheses
can be (and often are) omitted.
The modifiers signed and unsigned can be applied to both char and int. In
the absence of unsigned prefix, signed is automatically assumed for integral types.
The only exception is the char, which is unsigned by default. The keywords
signed and unsigned, when used on their own, mean signed int and
unsigned int, respectively.
The modifiers short and long can be applied only to the int. The keywords
short and long used on their own mean short int and long int, respective-
ly.
Floating-point Types
Types float and double, together with the long double variant, are consid-
ered floating-point types. mikroC’s implementation of ANSI Standard considers all
three to be the same type.
Floating point in mikroC is implemented using the Microchip AN575 32-bit for-
mat (IEEE 754 compliant).
page
60
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
±1.17549435082E-38 ..
float 32-bit
±6.80564774407E38
±1.17549435082E-38 ..
double 32-bit
±6.80564774407E38
±1.17549435082E-38 ..
long double 32-bit
±6.80564774407E38
page
61
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Enumerations
An enumeration data type is used for representing an abstract, discreet set of val-
ues with appropriate symbolic names.
Enumeration Declaration
Variables of enum type are declared same as variables of any other type. For
example, the following declaration
establishes a unique integral type, colors, a variable c of this type, and a set of
enumerators with constant integer values (black = 0, red = 1, ...). In C, a
variable of an enumerated type can be assigned any value of type int – no type
checking beyond that is enforced. That is:
c = red; // OK
c = 1; // Also OK, means the same
With explicit integral initializers, you can set one or more enumerators to specific
values. The initializer can be any expression yielding a positive or negative integer
value (after possible integer promotions). Any subsequent names without initializ-
ers will then increase by one. These values are usually unique, but duplicates are
legal.
page
62
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
nibble would acquire the value 4, byte the value 8, and kilobyte the value
8192.
In our previous declaration, the identifier colors is the optional enumeration tag
that can be used in subsequent declarations of enumeration variables of type
colors:
As with struct and union declarations, you can omit the tag if no further variables
of this enum type are required:
Enumeration Scope
Enumeration tags share the same name space as structure and union tags.
Enumerators share the same name space as ordinary variable identifiers. For more
information, consult Name Spaces.
page
63
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Void Type
void is a special type indicating the absence of any value. There are no objects of
void; instead, void is used for deriving more complex types.
Void Functions
Use the void keyword as a function return type if the function does not return a
value. For example:
Use void as a function heading if the function does not take any parameters.
Alternatively, you can just write empty parentheses:
Generic Pointers
Pointers can be declared as void, meaning that they can point to any type. These
pointers are sometimes called generic.
page
64
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
DERIVED TYPES
The derived types are also known as structured types. These types are used as ele-
ments in creating more complex user-defined types.
Arrays
Array is the simplest and most commonly used structured type. Variable of array
type is actually an array of objects of the same type. These objects represent ele-
ments of an array and are identified by their position in array. An array consists of
a contiguous region of storage exactly large enough to hold all of its elements.
Array Declaration
Array declaration is similar to variable declaration, with the brackets added after
identifer:
type array_name[constant-expression]
Each of the elements of an array is numbered from 0 through the number of ele-
ments minus one. If the number is n, elements of array can be approached as
variables array_name[0] .. array_name[n-1] of type.
#define MAX = 50
page
65
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Array Initialization
If you specify both the length and starting values, the number of starting values
must not exceed the specified length. Vice versa is possible, when the trailing
“excess” elements will be assigned some encountered runtime values from memo-
ry.
In case of array of char, you can use a shorter string literal notation. For example:
Arrays in Expressions
When name of the array comes up in expression evaluation (except with operators
& and sizeof ), it is implicitly converted to the pointer pointing to array’s first
element. See Arrays and Pointers for more information.
page
66
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Multi-dimensional Arrays
If you are not initializing the array in the declaration, you can omit the first dimen-
sion of multi-dimensional array. In that case, array is located elsewhere, e.g. in
another file. This is a commonly used technique when passing arrays as function
parameters:
void main() {
//...
func(a);
}//~!
page
67
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Pointers
Pointers are special objects for holding (or “pointing to”) memory addresses. In C,
address of an object in memory can be obtained by means of unary operator &. To
reach the pointed object, we use indirection operator (*) on a pointer.
A pointer of type “pointer to object of type” holds the address of (that is, points to)
an object of type. Since pointers are objects, you can have a pointer pointing to a
pointer (and so on). Other objects commonly pointed at include arrays, structures,
and unions.
Note: Currently, mikroC does not support pointers to functions, but this feature
will be implemented in future versions.
Pointer Declarations
Pointers are declared same as any other variable, but with * ahead of identifier.
Type at the beginning of declaration specifies the type of a pointed object. A point-
er must be declared as pointing to some particular type, even if that type is void,
which really means a pointer to anything. Pointers to void are often called gener-
ic pointers, and are treated as pointers to char in mikroC.
declares p to be of type “pointer to type”. All the scoping, duration, and visibility
rules apply to the p object just declared. You can view the declaration in this way:
if *p is an object of type, then p has to be a pointer to such objects.
page
68
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Note: You must initialize pointers before using them! Our previously declared
pointer *p is not initialized (i.e. assigned a value), so it cannot be used yet.
/* is same as: */
int *pa;
int *pb;
int *pc;
Null Pointers
A null pointer value is an address that is guaranteed to be different from any valid
pointer in use in a program. Assigning the integer constant 0 to a pointer assigns a
null pointer value to it. Instead of zero, the mnemonic NULL (defined in the stan-
dard library header files, such as stdio.h) can be used for legibility. All pointers
can be successfully tested for equality or inequality to NULL.
For example:
/* .. or like this: */
if ( pn == NULL ) { ... }
page
69
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Pointer Arithmetic
Arrays and pointers are not completely independent types in C. When name of the
array comes up in expression evaluation (except with operators & and sizeof ), it
is implicitly converted to the pointer pointing to array’s first element. Due to this
fact, arrays are not modifiable lvalues.
id[exp]
is defined as
*((id) + (exp))
where either:
&a[i] = a + i
a[i] = *(a + i)
page
70
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Following examples are also valid, but better avoid this syntax as it can make the
code really illegible:
(a + 1)[i] = 3;
// same as: *((a + 1) + i) = 3, i.e. a[i + 1] = 3
(i + 2)[a] = 0;
// same as: *((i + 2) + a) = 0, i.e. a[i + 2] = 0
You can use a simple assignment operator (=) to assign value of one pointer to
another if they are of the same type. If they are of different types, you must use a
typecast operator. Explicit type conversion is not necessary if one of the pointers is
generic (of void type).
Assigning the integer constant 0 to a pointer assigns a null pointer value to it. The
mnemonic NULL (defined in the standard library header files, such as stdio.h)
can be used for legibility.
Two pointers pointing into the same array may be compared by using relational
operators ==, !=, <, <=, >, and >=. Results of these operations are same as if they
were used on subscript values of array elements in question:
page
71
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
You can also compare pointers to zero value – this tests if pointer actually points
to anything. All pointers can be successfully tested for equality or inequality to
NULL:
Pointer Addition
You can use operators +, ++, and += to add an integral value to a pointer. The
result of addition is defined only if pointer points to an element of an array and if
the result is a pointer pointing into the same array (or one element beyond it).
For example:
There is no such element as “one past the last element”, of course, but a pointer is
allowed to assume such a value. C “guarantees” that the result of addition is
defined even when pointing to one element past array. If P points to the last array
element, P+1 is legal, but P+2 is undefined.
page
72
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
This allows you to write loops which access the array elements in a sequence by
means of incrementing pointer — in the last iteration you will have a pointer
pointing to one element past an array, which is legal. However, applying the indi-
rection operator (*) to a “pointer to one past the last element” leads to undefined
behavior.
For example:
int i;
some_type *p = &a[0];
Pointer Subtraction
Similar to addition, you can use operators -, --, and -= to subtract an integral
value from a pointer.
Also, you may subtract two pointers. Difference will equal the distance between
the two pointed addresses, in bytes.
For example:
int a[10];
int *pi1 = &a[0], *pi2 = &[4];
i = pi2 - pi1; // i equals 8
pi2 -= (i >> 1); // pi2 = pi2 - 4: pi2 now points to a[0]
page
73
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Structures
Unlike arrays, structures are considered single objects. The mikroC structure type
lets you handle complex data structures almost as easily as single variables.
The member type cannot be the same as the struct type being currently declared.
However, a member can be a pointer to the structure being declared, as in the fol-
lowing example:
Also, a structure can contain previously defined structure types when declaring an
instance of a declared structure. Here is an example:
page
74
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Note that you can omit structure tag, but then you cannot declare additional
objects of this type elsewhere. For more information, see the “Untagged
Structures” below.
Incomplete Declarations
struct A; // incomplete
struct B {struct A *pa;};
struct A {struct B *pb;};
If you omit the structure tag, you get an untagged structure. You can use untagged
structures to declare the identifiers in the comma-delimited struct-id-list to
be of the given structure type (or derived from it), but you cannot declare addition-
al objects of this type elsewhere.
page
75
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Structure Assignment
Note that two variables are of same structured type only if they were both defined
by the same instruction or were defined using the same type identifier. For exam-
ple:
Size of Structure
You can get size of the structure in memory by means of operator sizeof. Size of
the structure does not necessarily need to be equal to the sum of its members’
sizes. It is often greater due to certain limitations of memory storage.
page
76
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Structure and union members are accessed using the following two selection oper-
ators:
. (period)
-> (right arrow)
The operator . is called the direct member selector and it is used to directly access
one of the structure’s members. Suppose that the object s is of struct type S. Then
if m is a member identifier of type M declared in s, the expression
The operator -> is called the indirect (or pointer) member selector. Suppose that
ps is a pointer to s. Then if m is a member identifier of type M declared in s, the
expression
For example:
struct mystruct {
int i; char str[10]; double d;
} s, *sptr = &s;
.
.
.
s.i = 3; // assign to the i member of mystruct s
sptr -> d = 1.23; // assign to the d member of mystruct s
The expression s.m is an lvalue, provided that s is an lvalue and m is not an array
type. The expression sptr->m is an lvalue unless m is an array type.
page
77
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
struct A {
int j; double x;
};
struct B {
int i; struct A a; double d;
} s, *sptr;
//...
Structure Uniqueness
struct A {
int i,j; double d;
} aa, aaa;
struct B {
int i,j; double d;
} bb;
the objects aa and aaa are both of type struct A, but the objects aa and bb are of
different structure types. Structures can be assigned only if the source and destina-
tion have the same type:
page
78
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Unions
Union types are derived types sharing many of the syntactic and functional fea-
tures of structure types. The key difference is that a union allows only one of its
members to be “active” at any given time, the most recently changed member.
Union Declaration
Unions are declared same as structures, with the keyword union used instead of
struct:
Unlike structures’ members, the value of only one of union’s members can be
stored at any time. Let’s have a simple example:
The identifier mu, of type union myunion, can be used to hold a 2-byte int, a
4-byte double, or a single-byte char, but only one of these at any given time.
Size of Union
The size of a union is the size of its largest member. In our previous example, both
sizeof(union myunion) and sizeof(mu) return 4, but 2 bytes are unused
(padded) when mu holds an int object, and 3 bytes are unused when mu holds a
char.
Union members can be accessed with the structure member selectors (. and ->),
but care is needed. Check the example on the following page.
page
79
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
mu.d = 4.016;
Lcd_Out_Cp(FloatToStr(mu.d)); // OK: displays mu.d = 4.016
Lcd_Out_Cp(IntToStr(mu.i)); // peculiar result
pm->i = 3;
Lcd_Out_Cp(IntToStr(mu.i)); // OK: displays mu.i = 3
The second Lcd_Out_Cp is legal, since mu.i is an integral type. However, the bit
pattern in mu.i corresponds to parts of the previously assigned double. As such,
it probably does not provide a useful integer interpretation.
When properly converted, a pointer to a union points to each of its members, and
vice versa.
Bit Fields
Bit fields are specified numbers of bits that may or may not have an associated
identifier. Bit fields offer a way of subdividing structures into named parts of user-
defined sizes.
mikroC implementation of bit fields requires you to set aside a structure for the
purpose, i.e. you cannot have a structure containing bit fields and other objects.
Bit fields structure can contain up to 8 bits.
Note: If you need to handle specific bits of 8-bit variables (char and unsigned
short) or registers, you don’t need to declare bit fields. Much more elegant solu-
tion is to use mikroC’s intrinsic ability for individual bit access — see Accessing
Individual Bits for more information.
Bit fields can be declared only in structures. Declare a structure normally, and
assign individual fields like this (fields need to be unsigned):
page
80
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
As an object, bit fields structure takes one byte. Individual fields are packed with-
in byte from right to left. In bitfield-declarator-list, you can omit identi-
fier(s) to create artificial “padding”, thus skipping irrelevant bits.
For example, if we need to manipulate only bits 2–4 of a register as one block, we
could create a structure:
struct {
unsigned : 2, // Skip bits 0 and 1, no identifier here
mybits : 3; // Relevant bits 2, 3, and 4
// Bits 5, 6, and 7 are implicitly left out
} myreg;
Here is an example:
typedef struct {
prescaler : 2; timeronoff : 1; postscaler : 4;} mybitfield;
Bit fields can be accessed in same way as the structure members. Use direct and
indirect member selector (. and ->). For example, we could work with our
previously declared mybitfield like this:
void main() {
TimerControl.prescaler = 0;
TimerControl.timeronoff = 1;
TimerControl.postscaler = 3;
T2CON = TimerControl;
}
page
81
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
TYPES CONVERSIONS
C is strictly typed language, with each operator, statement and function demanding
appropriately typed operands/arguments. However, we often have to use objects of
“mismatching” types in expressions. In that case, type conversion is needed.
Conversion of object of one type is changing it to the same object of another type
(i.e. applying another type to a given object). C defines a set of standard conver-
sions for built-in types, provided by compiler when necessary.
Standard Conversions
The basic rule of automatic (implicit) conversion is that the operand of simpler
type is converted (promoted) to the type of more complex operand. Then, type of
the result is that of more complex operand.
page
82
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Arithmetic Conversions
When you use an arithmetic expression, such as a+b, where a and b are of differ-
ent arithmetic types, mikroC performs implicit type conversions before the expres-
sion is evaluated. These standard conversions include promotions of “lower” types
to “higher” types in the interests of accuracy and consistency.
Converting a longer integral type to a shorter type truncates the higher order bits
and leaves low-order bits unchanged. Converting a shorter integral type to a longer
type either sign-extends or zero-fills the extra bits of the new value, depending on
whether the shorter type is signed or unsigned, respectively.
Note: Conversion of floating point data into integral value (in assignments or via
explicit typecast) produces correct results only if the float value does not exceed
the scope of destination integral type.
First, any small integral types are converted according to the following rules:
After this, any two values associated with an operator are either int (including
the long and unsigned modifiers), or they are float (equivalent with double
and long double in mikroC).
page
83
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
The result of the expression is the same type as that of the two operands.
Pointer Conversions
Pointer types can be converted to other pointer types using the typecasting mecha-
nism:
char *str;
int *ip;
str = (char *)ip;
More generally, the cast (type*) will convert a pointer to type “pointer to type”.
(type) object
For example:
char a, b;
page
84
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
DECLARATIONS
Introduction to Declarations
- Variables
- Constants
- Functions
- Types
- Structure, union, and enumeration tags
- Structure members
- Union members
- Arrays of other types
- Statement labels
- Preprocessor macros
There can be many referencing declarations for the same identifier, especially in a
multifile program, but only one defining declaration for that identifier is allowed.
page
85
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
where var1, var2,... are any sequence of distinct identifiers with optional initial-
izers. Each of the variables is declared to be of type; if omitted, type defaults to
int. Specifier storage-class can take values extern, static, register, or
the default auto. Optional type-qualifier can take values const or
volatile. For more details, refer to Storage Classes and Type Qualifiers.
These are all defining declarations; storage is allocated and any optional initializ-
ers are applied.
page
86
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Linkage
Each instance of a particular identifier with external linkage represents the same
object or function throughout the entire set of files and libraries making up the
program. Each instance of a particular identifier with internal linkage represents
the same object or function within one file only.
Linkage Rules
Local names have internal linkage; same identifier can be used in different files to
signify different objects. Global names have external linkage; identifier signifies
the same object throughout all program files.
If the same identifier appears with both internal and external linkage within the
same file, the identifier will have internal linkage.
1. names having file scope, explicitly declared as static, have internal linkage,
2. names having file scope, explicitly declared as const and not explicitly,
declared as extern, have internal linkage,
3. typedef names have internal linkage,
4. enumeration constants have internal linkage .
page
87
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
1. names having file scope, that do not comply to any of previously stated internal
linkage rules, have external linkage.
The storage class specifiers auto and register cannot appear in an external
declaration. For each identifier in a translation unit declared with internal linkage,
no more than one external definition can be given. An external definition is an
external declaration that also defines an object or function; that is, it also allocates
storage. If an identifier declared with external linkage is used in an expression
(other than as part of the operand of sizeof), then exactly one external definition
of that identifier must be somewhere in the entire program.
mikroC allows later declarations of external names, such as arrays, structures, and
unions, to add information to earlier declarations. Here's an example:
page
88
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Storage Classes
Associating identifiers with objects requires each identifier to have at least two
attributes: storage class and type (sometimes referred to as data type). The mikroC
compiler deduces these attributes from implicit or explicit declarations in the
source code.
Storage class dictates the location (data segment, register, heap, or stack) of the
object and its duration or lifetime (the entire running time of the program, or dur-
ing execution of some blocks of code). Storage class can be established by the
syntax of the declaration, by its placement in the source code, or by both of these
factors:
auto
register
static
extern
Auto
Use the auto modifer to define a local variable as having a local duration. This is
the default for local variables and is rarely used. You cannot use auto with glob-
als. See also Functions.
Register
page
89
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Static
Global name declared with static specifier has internal linkage, meaning that it
is local for a given file. See Linkage for more information.
Local name declared with static specifier has static duration. Use static with
a local variable to preserve the last value between successive calls to that function.
See Duration for more information.
Extern
Name declared with extern specifier has external linkage, unless it has been pre-
viously declared as having internal linkage. Declaration is not a definition if it has
extern specifier and is not initialized. The keyword extern is optional for a
function prototype.
Use the extern modifier to indicate that the actual storage and initial value of a
variable, or body of a function, is defined in a separate source code module.
Functions declared with extern are visible throughout all source files in a pro-
gram, unless you redefine the function as static.
page
90
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Type Qualifiers
Type qualifiers const and volatile are optional in declarations and do not actu-
ally affect the type of declared object.
Qualifier const
Qualifier const implies that the declared object will not change its value during
runtime. In declarations with const qualifier, you need to initialize all the objects
in the declaration.
Effectively, mikroC treats objects declared with const qualifier same as literals or
preprocessor constants. Compiler will report an error if trying to change an object
declared with const qualifier.
For example:
Qualifier volatile
Qualifier volatile implies that variable may change its value during runtime
indepent from the program. Use the volatile modifier to indicate that a variable
can be changed by a background routine, an interrupt routine, or an I/O port.
Declaring an object to be volatile warns the compiler not to make assumptions
concerning the value of the object while evaluating expressions in which it occurs
because the value could change at any moment.
page
91
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Typedef Specifier
Specifier typedef introduces a synonym for a specified type. You can use type-
def declarations to construct shorter or more meaningful names for types already
defined by the language or for types that you have declared. You cannot use the
typedef specifier inside a function definition.
Declaration starting with the typedef specifier does not introduce an object or
function of a given type, but rather a new name for a given type. That is, the
typedef declaration is identical to “normal” declaration, but instead of objects, it
declares types. It is a common practice to name custom type identifiers with start-
ing capital letter — this is not required by C.
For example:
In typedef declaration, as in any declaration, you can declare several types at once.
For example:
Here, Pti is synonym for type “pointer to int”, and Array is synonym for type
“array of 10 int elements”.
page
92
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
asm Declaration
You can group assembly instructions by the asm keyword (or _asm, or __asm):
asm {
block of assembly instructions
}
For example, the following code will not be compiled, as linker won’t be able to
recognize variable myvar:
unsigned myvar;
void main() {
asm {
MOVLW 10 // just a test
MOVLW test_main_global_myvar_1
}
}
Adding the following line (or similar) above asm block would let linker know that
variable is used:
myvar := 0;
Note: mikroC will not check if the banks are set appropriately for your variable.
You need to set the banks manually in assembly code.
page
93
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Initialization
At the time of declaration, you can set the initial value of a declared object, i.e.
initialize it. Part of the declaration which specifies the initialization is called the
initializer.
Initializers for globals and static objects must be constants or constant expressions.
The initializer for an automatic object can be any legal expression that evaluates to
an assignment-compatible value for the type of the variable involved.
Scalar types are initialized with a single expression, which can optionally be
enclosed in braces. The initial value of the object is that of the expression; the
same constraints for type and conversions apply as for simple assignments.
For example:
int i = 1;
char *s = "hello";
struct complex c = {0.1, -0.2};
// where 'complex' is a structure (float, float)
For structures or unions with automatic storage duration, the initializer must be
one of the following:
- an initializer list,
- a single expression with compatible union or structure type. In this case, the
initial value of the object is that of the expression.
Also, you can initialize arrays of character type with a literal string, optionally
enclosed in braces. Each character in the string, including the null terminator, ini-
tializes successive elements in the array. For more information, refer to Arrays.
Automatic Initialization
mikroC does not provide automatic initialization for objects. Uninitialized globals
and objects with static duration will take random values from memory.
page
94
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
FUNCTIONS
Functions are central to C programming. Functions are usually defined as subpro-
grams which return a value based on a number of input parameters. Return value
of a function can be used in expressions – technically, function call is considered
an operator like any other.
C allows a function to create results other than its return value, referred to as side
effects. Often, function return value is not used at all, depending on the side
effects. These functions are equivalent to procedures of other programming lan-
guages, such as Pascal. C does not distinguish between procedure and function –
functions play both roles.
Each program must have a single external function named main marking the entry
point of the program. Functions are usually declared as prototypes in standard or
user-supplied header files, or within program files. Functions have external linkage
by default and are normally accessible from any file in the program. This can be
restricted by using the static storage class specifier in function declaration (see
Storage Classes and Linkage).
Note: Check the PIC Specifics for more info on functions’ limitations on PIC
micros.
Function Declaration
Functions are declared in your source files or made available by linking precom-
piled libraries. Declaration syntax of a function is:
type function_name(parameter-declarator-list);
The function_name must be a valid identifier. This name is used to call the
function; see Function Calls for more information. The type represents the type
of function result, and can be any standard or user-defined type. For functions that
do not return value, you should use void type. The type can be omitted in global
function declarations, and function will assume int type by default.
Function type can also be a pointer. For example, float* means that the func-
tion result is a pointer to float. Generic pointer, void* is also allowed. Function
cannot return array or another function.
page
95
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Unlike with variable declaration, each argument in the list needs its own type
specifier and a possible qualifier const or volatile.
Function Prototypes
A given function can be defined only once in a program, but can be declared sev-
eral times, provided the declarations are compatible. If you write a nondefining
declaration of a function, i.e. without the function body, you do not have to specify
the formal arguments. This kind of declaration, commonly known as the function
prototype, allows better control over argument number and type checking, and
type conversions.
Name of the parameter in function prototype has its scope limited to the prototype.
This allows different parameter names in different declarations of the same func-
tion:
Function prototypes greatly aid in documenting code. For example, the function
Cf_Init takes two parameters: Control Port and Data Port. The question is,
which is which? The function prototype
makes it clear. If a header file contains function prototypes, you can that file to get
the information you need for writing programs that call those functions. If you
include an identifier in a prototype parameter, it is used only for any later error
messages involving that parameter; it has no other effect.
page
96
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Function Definition
Function definition consists of its declaration and a function body. The function
body is technically a block – a sequence of local definitions and statements
enclosed within braces {}. All variables declared within function body are local to
the function, i.e. they have function scope.
The function itself can be defined only within the file scope. This means that func-
tion declarations cannot be nested.
To return the function result, use the return statement. Statement return in
functions of void type cannot have a parameter – in fact, you can omit the
return statement altogether if it is the last statement in the function body.
Here is a sample function which depends on side effects rather than return value:
#include <math.h>
page
97
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Function Calls
A function is called with actual arguments placed in the same sequence as their
matching formal parameters. Use a function-call operator ():
Each expression in the function call is an actual argument. Number and types of
actual arguments should match those of formal function parameters. If types dis-
agree, implicit type conversions rules apply. Actual arguments can be of any com-
plexity, but you should not depend on their order of evaluation, because it is not
specified.
Upon function call, all formal parameters are created as local objects initialized by
values of actual arguments. Upon return from a function, temporary object is cre-
ated in the place of the call, and it is initialized by the expression of return state-
ment. This means that function call as an operand in complex expression is treated
as the function result.
If the function is without result (type void) or you don’t need the result, you can
write the function call as a self-contained expression.
Argument Conversions
When a function prototype has not been previously declared, mikroC converts
integral arguments to a function call according to the integral widening (expan-
sion) rules described in Standard Conversions. When a function prototype is in
scope, mikroC converts the given argument to the type of the declared parameter
as if by assignment.
page
98
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
If a prototype is present, the number of arguments must match. The types need to
be compatible only to the extent that an assignment can legally convert them. You
can always use an explicit cast to convert an argument to a type that is acceptable
to a function prototype.
Note: If your function prototype does not match the actual function definition,
mikroC will detect this if and only if that definition is in the same compilation unit
as the prototype. If you create a library of routines with a corresponding header
file of prototypes, consider including that header file when you compile the
library, so that any discrepancies between the prototypes and the actual definitions
will be caught.
The compiler is also able to force arguments to the proper type. Suppose you have
the following code:
main() {
//...
res = func(limit, ch); // function call
}
Since it has the function prototype for func, this program converts limit and ch
to long, using the standard rules of assignment, before it places them on the stack
for the call to func.
Without the function prototype, limit and ch would have been placed on the
stack as an integer and a character, respectively; in that case, the stack passed to
func would not match in size or content what func was expecting, leading to
problems.
page
99
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
OPERATORS
Operators are tokens that trigger some computation when applied to variables and
other objects in an expression.
- Arithmetic Operators
- Assignment Operators
- Bitwise Operators
- Logical Operators
- Reference/Indirect Operators (see Pointer Arithmetic)
- Relational Operators
- Structure Member Selectors (see Structure Member Access)
- sizeof Operator
There are 15 precedence categories, some of which contain only one operator.
Operators in the same category have equal precedence with each other.
Where duplicates of operators appear in the table, the first occurrence is unary, the
second binary. Each category has an associativity rule: left-to-right or right-to-left.
In the absence of parentheses, these rules resolve the grouping of expressions with
operators of equal precedence.
page
100
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
15 2 () [] . -> left-to-right
! ~ ++ -- + - *
14 1 right-to-left
& (type) sizeof
13 2 * / % left-to-right
12 2 + - left-to-right
9 2 == != left-to-right
8 2 & left-to-right
7 2 ^ left-to-right
6 2 | left-to-right
5 2 && left-to-right
4 2 || left-to-right
3 3 ?: left-to-right
= *= /= %= += -=
2 2 right-to-left
&= ^= |= <<= >>=
1 2 , left-to-right
page
101
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Arithmetic Operators
+ addition 12
- subtraction 12
* multiplication 13
/ division 13
Note: Operator * is context sensitive and can also represent the pointer reference
operator. See Pointers for more information.
page
102
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
/* for example: */
7 / 4; // equals 1
7 * 3 / 4; // equals 5
/* but: */
7. * 3./ 4.; // equals 5.25 as we are working with floats
Remainder operand % works only with integers; sign of result is equal to the sign
of first operand:
/* for example: */
9 % 3; // equals 0
7 % 3; // equals 1
-7 % 3; // equals -1
Unary operators ++ and -- are the only operators in C which can be either prefix
(e.g. ++k, --k) or postfix (e.g. k++, k--).
For example:
int j = 5; j = ++k;
/* k = k + 1, j = k, which gives us j = 6, k = 6 */
int j = 5; j = k++;
/* j = k, k = k + 1, which gives us j = 5, k = 6 */
page
103
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Relational Operators
== equal 9
!= not equal 9
Always bear in mind that relational operators return either 0 or 1. Consider the fol-
lowing examples:
page
104
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Bitwise Operators
Use the bitwise operators to modify the individual bits of numerical operands.
Bitwise operators associate from left to right. The only exception is the bitwise
complement operator ~ which associates from right to left.
Note: Operator & can also be the pointer reference operator. Refer to Pointers for
more information.
/* because ..
page
105
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
/* Similarly: */
Binary operators << and >> move the bits of the left operand for a number of posi-
tions specified by the right operand, to the left or right, respectively. Right operand
has to be positive.
With shift left (<<), left most bits are discarded, and “new” bytes on the right are
assigned zeros. Thus, shifting unsigned operand to left by n positions is equivalent
to multiplying it by 2n if all the discarded bits are zero. This is also true for signed
operands if all the discarded bits are equal to sign bit.
With shift right (>>), right most bits are discarded, and the “freed” bytes on the
left are assigned zeros (in case of unsigned operand) or the value of the sign bit
zeros (in case of signed operand). Shifting operand to right by n positions is equiv-
alent to dividing it by 2n.
Be aware of the principle difference between how bitwise and logical operators
work. For example:
page
106
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Logical Operators
Logical operators && and || associate from left to right. Logical negation operator
! associates from right to left.
|| logical OR 4
! logical negation 14
c >= '0' && c <= '9'; // reads as: (c>='0') && (c<='9')
a + 1 == b || ! f(x;) // reads as: ((a+1)== b) || (!(f(x)))
Logical AND (&&) returns 1 only if both expressions evaluate to be nonzero, oth-
erwise returns 0. If the first expression evaluates to false, the second expression is
not evaluated. For example:
page
107
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
General rule with complex logical expressions is that the evaluation of consecutive
logical operands stops the very moment the final result is known. For example, if
we have an expression:
a && b && c
where a is false (0), then operands b and c will not be evaluated. This is very
important if b and c are expressions, as their possible side effects will not take
place!
Be aware of the principle difference between how bitwise and logical operators
work. For example:
page
108
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Conditional Operator ? :
The conditional operator ? : is the only ternary operator in C. Syntax of the con-
ditional operator is:
2. Both of compatible struct or union types. The resulting type is the structure or
union type of expression2 and expression3.
page
109
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
5. One operand is a pointer, and the other is a null pointer constant. The resulting
type is a pointer to a type qualified with all the type qualifiers of the types
pointed to by both operands.
Assignment Operators
expression1 = expression2
page
110
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Thus, we have 10 different compound assignment operators: +=, -=, *=, /=,
%=, &=, |=, ^=, <<=, and >>=. All of these associate from right to left. Spaces
separating compound operators (e.g. + =) will generate error.
expression1 += expression2
is the same as
Assignment Rules
For both simple and compound assignment, the operands expression1 and
expression2 must obey one of the following rules:
page
111
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Sizeof Operator
Prefix unary operator sizeof returns an integer constant that gives the size in
bytes of how much memory space is used by its operand (determined by its type,
with some exceptions).
If applied to a type identifier, sizeof returns the size of the specified type. Unit
for type size is the sizeof(char) which is equivalent to one byte. Operation
sizeof(char) gives the result 1, whether the char is signed or unsigned.
sizeof(char) /* returns 1 */
sizeof(int) /* returns 2 */
sizeof(unsigned long) /* returns 4 */
When the operand is a non-parameter of array type, the result is the total number
of bytes in the array (in other words, an array name is not converted to a pointer
type):
int i, j, a[10];
//...
j = sizeof(a[1]); /* j = sizeof(int) = 2 */
i = sizeof(a); /* i = 10*sizeof(int) = 20 */
page
112
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
EXPRESSIONS
An expression is a sequence of operators, operands, and punctuators that specifies
a computation. Formally, expressions are defined recursively: subexpressions can
be nested without formal limit. However, the compiler will report an out-of-mem-
ory error if it can’t compile an expression that is too complex.
In ANSI C, the primary expressions are: constant (also referred to as literal), iden-
tifier, and (expression), defined recursively.
Comma Expressions
One of the specifics of C is that it allows you to use comma as a sequence opera-
tor to form the so-called comma expressions or sequences. Comma expression is a
comma-delimited list of expressions – it is formally treated as a single expression
so it can be used in places where an expression is expected. The following
sequence:
expression_1, expression_2;
results in the left-to-right evaluation of each expression, with the value and type of
expression_2 giving the result of the whole expression. Result of expres-
sion_1 is discarded.
page
113
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Binary operator comma (,) has the lowest precedence and associates from left to
right, so that a, b, c is same as (a, b), c. This allows us to write sequences
with any number of expressions:
this results in the left-to-right evaluation of each expression, with the value and
type of expression_n giving the result of the whole expression. Results of other
expressions are discarded, but their (possible) side-effect do occur.
For example:
result = (a = 5, b /= 2, c++);
/* returns preincremented value of variable c, but also
intializes a, divides b by 2, and increments c */
Note
Do not confuse comma operator (sequence operator) with the comma punctuator
which separates elements in a function argument list and initializator lists. Mixing
the two uses of comma is legal, but you must use parentheses to distinguish them.
To avoid ambiguity with the commas in function argument and initializer lists, use
parentheses. For example,
calls function func with three arguments (i, 5, k), not four.
page
114
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
STATEMENTS
Statements specify the flow of control as a program executes. In the absence of
specific jump and selection statements, statements are executed sequentially in the
order of appearance in the source code.
- Labeled Statements
- Expression Statements
- Selection Statements
- Iteration Statements (Loops)
- Jump Statements
- Compound Statements (Blocks)
Labeled Statements
Every statement in program can be labeled. Label is an identifier added before the
statement like this:
label_identifier : statement;
Labels have their own namespace: label identifier can match any other identifier in
the program.
1. The label identifier serves as a target for the unconditional goto statement,
2. The label identifier serves as a target for the switch statement. For this
purpose, only case and default labeled statements are used:
page
115
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Expression Statements
expression;
The null statement is a special case, consisting of a single semicolon (;). The null
statement does nothing, and is therefore useful in situations where the mikroC syn-
tax expects a statement but your program does not need one. For example, null
statement is commonly used in “empty” loops:
Selection Statements
If Statement
The else keyword is optional, but no statements can come between the if and
the else.
page
116
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Nested if statements
Nested if statements require additional attention. General rule is that the nested
conditionals are parsed starting from the innermost conditional, with each else
bound to the nearest available if on its left:
if (expression1) statement1
else if (expression2)
if (expression3) statement2
else statement3 /* this belongs to: if (expression3) */
else statement4 /* this belongs to: if (expression2) */
Note: The #if and #else preprocessor statements (directives) look similar to the
if and else statements, but have very different effects. They control which
source file lines are compiled and which are ignored. See Preprocessor for more
information.
Switch Statement
Use the switch statement to pass control to a specific program branch, based on a
certain condition. Syntax of switch statement is:
switch (expression) {
case constant-expression_1 : statement_1;
.
.
.
case constant-expression_n : statement_n;
[default : statement;]
}
page
117
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
For example, if variable i has value between 1 and 3, following switch would
always return it as 4:
switch (i) {
case 1: i++;
case 2: i++;
case 3: i++;
}
To avoid evaluating any other cases and relinquish control from the switch, ter-
minate each case with break.
Conditional switch statements can be nested – labels case and default are
then assigned to the innermost enclosing switch statement.
Here is a simple example with switch. Let’s assume we have a variable with only
3 different states (0, 1, or 2) and a corresponding function (event) for each of these
states. This is how we could switch the code to the appopriate routine:
switch (state) {
case 0: Lo(); break;
case 1: Mid(); break;
case 2: Hi(); break;
default: Message("Invalid state!");
}
page
118
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Iteration Statements
Iteration statements let you loop a set of statements. There are three forms of itera-
tion statements in C: while, do, and for.
While Statement
The statement executes repeatedly until the value of expression is false. The test
takes place before statement executes. Thus, if expression evaluates to false
on the first pass, the loop does not execute.
Here is an example of calculating scalar product of two vectors, using the while
statement:
int s = 0, i = 0;
while (i < n) {
s += a[i] * b[i];
i++;
}
page
119
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Do Statement
The do statement executes until the condition becomes false. Syntax of do state-
ment is:
Note that do is the only control structure in C which explicitly ends with semi-
colon (;). Other control structures end with statement which means that they
implicitly include a semicolon or a closing brace.
s = 0; i = 0;
do {
s += a[i] * b[i];
i++;
} while (i < n);
For Statement
The for statement implements an iterative loop. Syntax of for statement is:
Before the first iteration of the loop, expression init-exp sets the starting vari-
ables for the loop. You cannot pass declarations in init-exp.
Expression condition-exp is checked before the first entry into the block;
statement is executed repeatedly until the value of condition-exp is false.
After each iteration of the loop, increment-exp increments a loop counter.
Consequently, i++ is functionally the same as ++i.
page
120
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
for ( ; ; ) {...}
The only way to break out of this loop is by means of break statement.
Here is an example of calculating scalar product of two vectors, using the for
statement:
but this is considered a bad programming style. Although legal, calculating the
sum should not be a part of the incrementing expression, because it is not in the
service of loop routine. Note that we used a null statement (;) for a loop body.
page
121
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Jump Statements
A jump statement, when executed, transfers control unconditionally. There are four
such statements in mikroC: break, continue, goto, and return.
Break Statement
Sometimes, you might need to stop the loop from within its body. Use the break
statement within loops to pass control to the first statement following the inner-
most switch, for, while, or do block.
Break is commonly used in switch statements to stop its execution upon the first
positive match. For example:
switch (state) {
case 0: Lo(); break;
case 1: Mid(); break;
case 2: Hi(); break;
default: Message("Invalid state!");
}
Continue Statement
You can use the continue statement within loops (while, do, for) to “skip the
cycle”. It passes control to the end of the innermost enclosing end brace belonging
to a looping construct. At that point the loop continuation condition is re-evaluat-
ed. This means that continue demands the next iteration if loop continuation con-
dition is true.
Goto Statement
Use the goto statement to unconditionally jump to a local label — for more infor-
mation on labels, refer to Labeled Statements. Syntax of goto statement is:
goto label_identifier;
page
122
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
You can use goto to break out from any level of nested control structures. But,
goto cannot be used to jump into block while skipping that block’s initializations
– for example, jumping into loop’s body, etc.
for (...) {
for (...) {
...
if (disaster) goto Error;
...
}
}
.
.
.
Error: /* error handling code */
Return Statement
Use the return statement to exit from the current function back to the calling
routine, optionally returning a value. Syntax is:
return [expression];
This will evaluate the expression and return the result. Returned value will be
automatically converted to the expected function type, if needed. The expres-
sion is optional; if omitted, function will return a random value from memory.
page
123
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
For example, for loop expects one statement in its body, so we can pass it a com-
pound statement:
Note that, unlike other statements, compound statements do not end with semi-
colon (;), i.e. there is never a semicolon following the closing brace.
page
124
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
PREPROCESSOR
Preprocessor is an integrated text processor which prepares the source code for
compiling. Preprocessor allows:
Note that preprocessor analyzes text at token level, not at individual character
level. Preprocessor is controled by means of preprocessor directives and pre-
processor operators.
Preprocessor Directives
Any line in source code with a leading # is taken as a preprocessing directive (or
control line), unless the # is within a string literal, in a character constant, or
embedded in a comment. The initial # can be preceded or followed by whitespace
(excluding new lines).
The null directive consists of a line containing the single character #. This line is
always ignored.
Preprocessor directives are usually placed at the beginning of the source code, but
they can legally appear at any point in a program. The mikroC preprocessor
detects preprocessor directives and parses the tokens embedded in them. Directive
is in effect from its declaration to the end of the program file.
page
125
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
If you need to break directive into multiple lines, you can do it by ending the line
with a backslash (\):
Macros
After each individual macro expansion, a further scan is made of the newly
expanded text. This allows for the possibility of nested macros: The expanded text
can contain macro identifiers that are subject to replacement. However, if the
macro expands into what looks like a preprocessing directive, such a directive will
not be recognized by the preprocessor. Any occurrences of the macro identifier
found within literal strings, character constants, or comments in the source code
are not expanded
page
126
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
A macro won’t be expanded during its own expansion (so #define MACRO
MACRO won’t expand indefinitely).
main() {
EVERLOOP {
...
if (error) {Lcd_Out_Cp(ERR_MSG); break;}
...
}
}
#ifndef BLOCK_SIZE
#define BLOCK_SIZE 512
#endif
page
127
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Note there can be no whitespace between the macro_identifier and the “(”.
The optional arg_list is a sequence of identifiers separated by commas, not
unlike the argument list of a C function. Each comma-delimited identifier plays
the role of a formal argument or placeholder.
macro_identifier(<actual_arg_list>)
in the subsequent source code. The syntax is identical to that of a function call;
indeed, many standard library C “functions” are implemented as macros.
However, there are some important semantic differences.
A macro call results in two sets of replacements. First, the macro identifier and the
parenthesis-enclosed arguments are replaced by the token sequence. Next, any for-
mal arguments occurring in the token sequence are replaced by the corresponding
real arguments appearing in the actual_arg_list. As with simple macro defini-
tions, rescanning occurs to detect any embedded macro identifiers eligible for
expansion.
page
128
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Undefining Macros
#undef macro_identifier
Directive #undef detaches any previous token sequence from the macro_iden-
tifier; the macro definition has been forgotten, and the macro_identifier is
undefined. No macro expansion occurs within #undef lines.
After a macro identifier has been undefined, it can be redefined with #define,
using the same or a different token sequence.
page
129
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
File Inclusion
The preprocessor directive #include pulls in header files (extension .h) into the
source code. Do not rely on preprocessor to include source files (extension .c) —
see Projects for more information.
#include <header_name>
#include "header_name"
The preprocessor removes the #include line and replaces it with the entire text
of the header file at that point in the source code. The placement of the #include
can therefore influence the scope and duration of any identifiers in the included
file.
The difference between the two formats lies in the searching algorithm employed
in trying to locate the include file.
If #include directive was used with the <header_name> version, the search is
made successively in each of the following locations, in this particular order:
1. the project folder (folder which contains the project file .ppc),
2. mikroC installation folder > “include” folder,
3. your custom search paths.
Explicit Path
If you place an explicit path in the header_name, only that directory will be
searched. For example:
#include "C:\my_files\test.h"
page
130
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Note: There is also a third version of #include directive, rarely used, which
assumes that neither < nor " appears as the first non-whitespace character follow-
ing #include:
#include macro_identifier
It assumes a macro definition exists that will expand the macro identifier into a
valid delimited header name with either of the <header_name> or
"header_name" formats.
Preprocessor Operators
The # (pound sign) is a preprocessor directive when it occurs as the first non-
whitespace character on a line. Also, # and ## perform operator replacement and
merging during the preprocessor scanning phase.
Operator #
If you need an actual argument (the exact sequence of characters within quotes) as
result of preprocessing, you can use the # operator in macro body. It can be placed
in front of a formal macro argument in definition in order to convert the actual
argument to a string after replacement.
For example, let’s have macro LCD_PRINT for printing variable name and value
on LCD:
page
131
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
LCD_PRINT(temp)
Operator ##
Operator ## is used for token pasting: you can paste (or merge) two tokens togeth-
er by placing ## in between them (plus optional whitespace on either side). The
preprocessor removes the whitespace and the ##, combining the separate tokens
into one new token. This is commonly used for constructing identifiers.
For example, we could define macro SPLICE for pasting two tokens into one iden-
tifier:
#define SPLICE(x,y) x ## _ ## y
Note: mikroC does not support the older nonportable method of token pasting
using (l/**/r).
Conditional Compilation
page
132
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
The conditional directives #if, #elif, #else, and #endif work very similar to
the common C conditional statements. If the expression you write after the #if
has a nonzero value, the line group immediately following the #if directive is
retained in the translation unit.
Syntax is:
#if constant_expression_1
<section_1>
[#elif constant_expression_2
<section_2>]
...
[#elif constant_expression_n
<section_n>]
[#else
<final_section>]
#endif
Each #if directive in a source file must be matched by a closing #endif direc-
tive. Any number of #elif directives can appear between the #if and #endif
directives, but at most one #else directive is allowed. The #else directive, if
present, must be the last directive before #endif.
The sections can be any program text that has meaning to the compiler or the pre-
processor. The preprocessor selects a single section by evaluating the
constant_expression following each #if or #elif directive until it finds a
true (nonzero) constant expression. The constant_expressions are subject to
macro expansion.
page
133
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Any processed section can contain further conditional clauses, nested to any
depth. Each nested #else, #elif, or #endif directive belongs to the closest pre-
ceding #if directive.
The net result of the preceding scenario is that only one code section (possibly
empty) will be compiled.
You can use the #ifdef and #ifndef directives anywhere #if can be used. The
#ifdef and #ifndef conditional directives let you test whether an identifier is
currently defined or not. The line
#ifdef identifier
has exactly the same effect as #if 1 if identifier is currently defined, and the
same effect as #if 0 if identifier is currently undefined. The other directive,
#ifndef, tests true for the “not-defined” condition, producing the opposite
results.
The syntax thereafter follows that of the #if, #elif, #else, and #endif.
page
134
MikroElektronika: Development tools - Books - Compilers
CHAPTER
4
mikroC Libraries
mikroC provides a number of built-in and library routines which help you develop
your application faster and easier. Libraries for ADC, CAN, USART, SPI, I2C, 1-
Wire, LCD, PWM, RS485, numeric formatting, bit manipulation, and many other
are included along with practical, ready-to-use code examples.
BUILT-IN ROUTINES
mikroC compiler provides a set of useful built-in utility functions. Built-in func-
tions do not require any header files to be included; you can use them in any part
of your project.
Delay_us
Delay_ms
Delay_Cyc
Clock_Khz
Delay_us
Delay_ms
page
136
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Vdelay_ms
Delay_Cyc
Description Creates a delay based on MCU clock. Delay lasts for 10 times the input parameter in
MCU cycles. Input parameter needs to be in range 3 .. 255.
Note that Delay_Cyc is library function rather than a built-in routine; it is presented in
this topic for the sake of convenience.
Clock_Khz
page
137
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
LIBRARY ROUTINES
mikroC provides a set of libraries which simplifies the initialization and use of
PIC MCU and its modules. Library functions do not require any header files to be
included; you can use them anywhere in your projects.
- ADC Library
- CAN Library
- CANSPI Library
- Compact Flash Library
- Conversions Library
- EEPROM Library
- Ethernet Library
- Flash Memory Library
- Graphic LCD Library
- I2C Library
- Keypad Library
- LCD Library
- LCD8 Library
- Manchester Code Library
- Multi Media Card Library
- OneWire Library
- PS/2 Library
- PWM Library
- RS-485 Library
- Secure Digital Library
- Software I2C Library
- Software SPI Library
- Software UART Library
- Sound Library
- USART Library
- USB HID Library
- Util Library
- ANSI C Standard Libraries
- Conversions Library
- Trigonometry Library
page
138
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
ADC Library
ADC (Analog to Digital Converter) module is available with a number of PIC
MCU models. Library function Adc_Read is included to provide you comfortable
work with the module.
Adc_Read
Returns 10-bit unsigned value read from the specified ADC channel.
Description Initializes PIC’s internal ADC module to work with RC clock. Clock determines the
time period necessary for performing AD conversion (min 12TAD).
Parameter channel represents the channel from which the analog value is to be
acquired. For channel-to-pin mapping please refer to documentation for the appropriate
PIC MCU.
Requires PIC MCU with built-in ADC module. You should consult the Datasheet documentation
for specific device (most devices from PIC16/18 families have it).
Before using the function, be sure to configure the appropriate TRISA bits to designate
the pins as input. Also, configure the desired pin as analog input, and set Vref (voltage
reference value).
page
139
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Library Example
/* This code snippet reads analog value from channel 2 and displays
it on PORTD (lower 8 bits) and PORTB (2 most significant bits). */
unsigned temp_res;
void main() {
ADCON1 = 0x80; // Configure analog inputs and Vref
TRISA = 0xFF; // PORTA is input
TRISB = 0x3F; // Pins RB7, RB6 are outputs
TRISD = 0; // PORTD is output
do {
temp_res = Adc_Read(2); // Get results of AD conversion
PORTD = temp_res; // Send lower 8 bits to PORTD
PORTB = temp_res >> 2; // Send 2 most significant bits to RB7, RB6
} while(1);
}
Hardware Connection
PIC16F877A
+5V 330R
+5V LB7
MCLR/Vpp/THV RB7/PGD
RA0/AN0 RB6/PGC
10K
330R
RE1/WR/AN6 Vdd LD6
+5V
RE2/CS/AN7 Vss
Vdd RD7/PSP7 330R
LD5
Vss RD6/PSP6
OSC1 RD5/PSP5
330R
OSC2 RD4/PSP4 LD4
RCO/T1OSO RC7/RX/DT
RC1/T1OSI RC6/TX/CK 330R LD3
RC2/CCP1 RC5
RC3 RC4
RD0/PSP0 RD3/PSP3 330R
4MHz LD2
RD1/PSP1 RD2/PSP2
330R LD1
330R
LD0
page
140
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
CAN Library
mikroC provides a library (driver) for working with the CAN module.
CAN is a very robust protocol that has error detection and signalling, self–check-
ing and fault confinement. Faulty CAN data and remote frames are re-transmitted
automatically, similar to the Ethernet.
Data transfer rates vary from up to 1 Mbit/s at network lengths below 40m to 250
Kbit/s at 250m cables, and can go even lower at greater network distances, down
to 200Kbit/s, which is the minimum bitrate defined by the standard. Cables used
are shielded twisted pairs, and maximum cable length is 1000m.
Note: Be sure to check CAN constants necessary for using some of the functions.
See page 145.
Library Routines
CANSetOperationMode
CANGetOperationMode
CANInitialize
CANSetBaudRate
CANSetMask
CANSetFilter
CANRead
CANWrite
RegsToCANID
CANIDToRegs
page
141
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
CANSetOperationMode
Description Sets CAN to requested mode, i.e. copies mode to CANSTAT. Parameter mode needs to
be one of CAN_OP_MODE constants (see CAN constants).
Requires CAN routines are currently supported only by P18XXX8 PICmicros. Microcontroller
must be connected to CAN transceiver (MCP2551 or similar) which is connected to
CAN bus.
CANGetOperationMode
Requires CAN routines are currently supported only by P18XXX8 PICmicros. Microcontroller
must be connected to CAN transceiver (MCP2551 or similar) which is connected to
CAN bus.
page
142
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
CANInitialize
Prototype void CANInitialize(char SJW, char BRP, char PHSEG1, char PHSEG2,
char PROPSEG, char CAN_CONFIG_FLAGS);
Description Initializes CAN. All pending transmissions are aborted. Sets all mask registers to 0 to
allow all messages.
Parameters:
Requires CAN must be in Config mode; otherwise the function will be ignored.
page
143
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
CANSetBaudRate
Prototype void CANSetBaudRate(char SJW, char BRP, char PHSEG1, char PHSEG2,
char PROPSEG, char CAN_CONFIG_FLAGS);
Description Sets CAN baud rate. Due to complexity of CAN protocol, you cannot simply force a bps
value. Instead, use this function when CAN is in Config mode. Refer to datasheet for
details.
Parameters:
Requires CAN must be in Config mode; otherwise the function will be ignored.
page
144
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
CANSetMask
Description Function sets mask for advanced filtering of messages. Given value is bit adjusted to
appropriate buffer mask registers.
Requires CAN must be in Config mode; otherwise the function will be ignored.
Example // Set all mask bits to 1, i.e. all filtered bits are relevant:
CANSetFilter
Description Function sets mask for advanced filtering of messages. Given value is bit adjusted to
appropriate buffer mask registers.
Requires CAN must be in Config mode; otherwise the function will be ignored.
page
145
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
CANRead
Description Function reads message from receive buffer. If at least one full receive buffer is found, it
is extracted and returned. If none found, function returns zero.
CANWrite
Description If at least one empty transmit buffer is found, function sends message on queue for
transmission. If buffer is full, function returns 0.
page
146
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
CAN Constants
There is a number of constants predefined in CAN library. To be able to use the
library effectively, you need to be familiar with these. You might want to check
the example at the end of the chapter.
CAN_OP_MODE
CAN_CONFIG_FLAGS
// continues..
page
147
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
// ..continued
You may use bitwise AND (&) to form config byte out of these values. For exam-
ple:
init = CAN_CONFIG_SAMPLE_THRICE & CAN_CONFIG_PHSEG2_PRG_ON &
CAN_CONFIG_STD_MSG & CAN_CONFIG_DBL_BUFFER_ON &
CAN_CONFIG_VALID_XTD_MSG & CAN_CONFIG_LINE_FILTER_OFF;
//...
CANInitialize(1, 1, 3, 3, 1, init); // initialize CAN
CAN_TX_MSG_FLAGS
You may use bitwise AND (&) to adjust the appropriate flags. For example:
/* form value to be used with CANSendMessage: */
send_config = CAN_TX_PRIORITY_0 && CAN_TX_XTD_FRAME &
CAN_TX_NO_RTR_FRAME;
//...
CANSendMessage(id, data, 1, send_config);
page
148
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
CAN_RX_MSG_FLAGS
You may use bitwise AND (&) to adjust the appropriate flags. For example:
CAN_MASK
#define CAN_MASK_B1 0
#define CAN_MASK_B2 1
CAN_FILTER
#define CAN_FILTER_B1_F1 0
#define CAN_FILTER_B1_F2 1
#define CAN_FILTER_B2_F1 2
#define CAN_FILTER_B2_F2 3
#define CAN_FILTER_B2_F3 4
#define CAN_FILTER_B2_F4 5
page
149
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Library Example
unsigned short aa, aa1, len, aa2;
unsigned char data[8];
long id;
unsigned short zr, cont, oldstate;
//........
void main() {
PORTC = 0;
TRISC = 0;
PORTD = 0;
TRISD = 0;
aa = 0;
aa1 = 0;
aa2 = 0;
data[0] = 0;
// Initialize CAN
CANInitialize(1,1,3,3,1,aa);
id = -1;
// continues ..
page
150
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
// .. continued
PORTD = 0xFF;
id = 12111;
CANWrite(id,data,1,aa1); // Send message via CAN
while (1) {
oldstate = 0;
zr = CANRead(&id, data , &len, &aa2);
if ((id == 3) & zr) {
PORTD = 0xAA;
PORTC = data[0]; // Output data at PORTC
data[0]++ ;
data[1] = 0xFF;
id = 12111;
CANWrite(id, data, 2,aa1); // Send incremented data back
}
}
}//~!
page
151
MikroElektronika: Development tools - Books - Compilers
making it simple...
mikroC
10K
RA1/AN1 RB5/PGM RA1/AN1 RB5/PGM
RA2/AN2/Vref- RB4 RA2/AN2/Vref- RB4
RA3/AN3/Vref+ RB3/CANRX RA3/AN3/Vref+ RB3/CANRX
RA4/TOCKI RB2/CANTX/INT2 RA4/TOCKI RB2/CANTX/INT2
RA5/AN4/SS/LVDIN RB1/INT1 RA5/AN4/SS/LVDIN RB1/INT1
RE0/AN5/RD/ RB0/INT0 TX-CAN RS
Reset
RE0/AN5/RD/ RB0/INT0
Reset
+5V GND CANH
RE1/AN6/WR/C1OUT Vdd RE1/AN6/WR/C1OUT Vdd
+5V VCC +5V
RE2/AN7/CS/C2OUT Vss CANL RE2/AN7/CS/C2OUT Vss
RXD Vref
10R
Vdd RD7/PSP7/P1D Vdd RD7/PSP7/P1D
Vss RD6/PSP6/P1C PCA82C250 Vss RD6/PSP6/P1C
mikroC - C Compiler for Microchip PIC microcontrollers
10R
RD0/PSP0/C1IN+ RD3/PSP3/C2IN- RD0/PSP0/C1IN+ RD3/PSP3/C2IN-
RD1/PSP1/C1IN- RD2/PSP2/C2IN+ RD1/PSP1/C1IN- RD2/PSP2/C2IN+
PCA82C250
or
MCP2551
Hardware Connection
152
page
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
CANSPI Library
SPI module is available with a number of PICmicros. mikroC provides a library
(driver) for working with the external CAN modules (such as MCP2515 or
MCP2510) via SPI.
In mikroC, each routine of CAN library has its CANSPI counterpart with identical
syntax. For more information on the Controller Area Network, consult the CAN
Library. Note that the effective communication speed depends on the SPI, and is
certainly slower than the “real” CAN.
Note: CANSPI functions are supported by any PIC MCU that has SPI interface on
PORTC. Also, CS pin of MCP2510 or MCP2515 must be connected to RC0.
Example of HW connection is given at the end of the chapter.
Note: Be sure to check CAN constants necessary for using some of the functions.
See page 145.
Library Routines
CANSPISetOperationMode
CANSPIGetOperationMode
CANSPIInitialize
CANSPISetBaudRate
CANSPISetMask
CANSPISetFilter
CANSPIRead
CANSPIWrite
RegsToCANSPIID
CANSPIIDToRegs
page
153
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
CANSPISetOperationMode
Description Sets CAN to requested mode, i.e. copies mode to CANSTAT. Parameter mode needs to
be one of CAN_OP_MODE constants (see CAN constants, page 145).
Requires CANSPI functions are supported by any PIC MCU that has SPI interface on PORTC.
Also, CS pin of MCP2510 or MCP2515 must be connected to RC0.
CANSPIGetOperationMode
page
154
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
CANSPIInitialize
Description Initializes CANSPI. All pending transmissions are aborted. Sets all mask registers to 0
to allow all messages.
Parameters:
Requires CANSPI must be in Config mode; otherwise the function will be ignored.
page
155
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
CANSPISetBaudRate
Description Sets CANSPI baud rate. Due to complexity of CANSPI protocol, you cannot simply
force a bps value. Instead, use this function when CANSPI is in Config mode. Refer to
datasheet for details.
Parameters:
Requires CANSPI must be in Config mode; otherwise the function will be ignored.
page
156
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
CANSPISetMask
Description Function sets mask for advanced filtering of messages. Given value is bit adjusted to
appropriate buffer mask registers.
Requires CANSPI must be in Config mode; otherwise the function will be ignored.
Example // Set all mask bits to 1, i.e. all filtered bits are relevant:
CANSPISetFilter
Description Function sets mask for advanced filtering of messages. Given value is bit adjusted to
appropriate buffer mask registers.
Requires CANSPI must be in Config mode; otherwise the function will be ignored.
page
157
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
CANSPIRead
Description Function reads message from receive buffer. If at least one full receive buffer is found, it
is extracted and returned. If none found, function returns zero.
CANSPIWrite
Description If at least one empty transmit buffer is found, function sends message on queue for
transmission. If buffer is full, function returns 0.
page
158
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Library Example
The code is a simple demonstration of CANSPI protocol. It is a simple data exchange between 2
PIC’s, where data is incremented upon each bounce. Data is printed on PORTC (lower byte) and
PORTD (higher byte) for a visual check.
void main(){
TRISB = 0;
Spi_Init(); // Initialize SPI module
TRISC.F2 = 0; // Clear (TRISC,2)
PORTC.F2 = 0; // Clear (PORTC,2)
PORTC.F0 = 1; // Set (PORTC,0)
TRISC.F0 = 0; // Clear (TRISC,0)
PORTD = 0;
TRISD = 0;
aa = 0;
aa1 = 0;
aa2 = 0;
// continues ..
page
159
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
// .. continued
while (1) {
zr = CANSPIRead(&id , &Data , &len, &aa2); // Receive data, if any
if (id == 12111 & zr ) {
PORTB = data[0]++ ; // Output data on PORTB
id = 3;
Delay_ms(500);
page
160
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Hardware Connection
+5V
10K
+5V
PIC16F877A
MCLR/Vpp/THV RB7/PGD
100K
100K
100K
RA0/AN0 RB6/PGC
RA1/AN1 RB5
Reset
+5V RA2/AN2/Vref- RB4
RA3/AN3/Vref+ RB3/PGM
RA4/TOCKI RB2
TX-CAN Vdd RA5/AN4 RB1
RX-CAN RST RE0/RD/AN5 RB0/INT
CLKOUT CS RE1/WR/AN6 Vdd
TX0RTS SO +5V
RE2/CS/AN7 Vss
TX1RTS SI
Vdd RD7/PSP7
TX2RTS SCK
Vss RD6/PSP6
OSC2 INT
OSC1 RD5/PSP5
OSC1 RX0BF
Vss OSC2 RD4/PSP4
RX1BF
8MHz RCO/T1OSO RC7/RX/DT
MCP2510 4MH z RC1/T1OSI RC6/TX/CK
RC2/CCP1 RC5
RC3 RC4
RD0/PSP0 RD3/PSP3
RD1/PSP1 RD2/PSP2
TX-CAN RS
GND CANH
+5V VCC CANL
RXD
10R
Vref
PCA82C250
page
161
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
In CF card, data is divided into sectors, one sector usually comprising 512 bytes
(few older models have sectors of 256B). Read and write operations are not per-
formed directly, but successively through 512B buffer. Following routines can be
used for CF with FAT16, and FAT32 file system. Note that routines for file han-
dling can be used only with FAT16 file system.
Important! Before write operation, make sure you don’t overwrite boot or FAT
sector as it could make your card on PC or digital cam unreadable. Drive mapping
tools, such as Winhex, can be of a great assistance.
Library Routines
Cf_Init
Cf_Detect
Cf_Total_Size
Cf_Enable
Cf_Disable
Cf_Read_Init
Cf_Read_Byte
Cf_Read_Word
Cf_Write_Init
Cf_Write_Byte
Cf_Write_Word
Cf_Find_File
Cf_File_Write_Init
Cf_File_Write_Byte
Cf_Read_Sector
Cf_Write_Sector
Cf_Set_File_Date
Cf_File_Write_Complete
page
162
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Cf_Init
Description Initializes ports appropriately for communication with CF card. Specify two different
ports: ctrlport and dataport.
Cf_Detect
Cf_Total_Size
page
163
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Cf_Enable
Description Enables the device. Routine needs to be called only if you have disabled the device by
means of Cf_Disable. These two routines in conjuction allow you to free/occupy data
line when working with multiple devices. Check the example at the end of the chapter.
Example Cf_Enable();
Cf_Disable
Description Routine disables the device and frees the data line for other devices. To enable the
device again, call Cf_Enable. These two routines in conjuction allow you to free/occu-
py data line when working with multiple devices. Check the example at the end of the
chapter.
Example Cf_Disable();
Cf_Read_Init
Description Initializes CF card for reading. Parameter address specifies sector address from where
data will be read, and sectcnt is the number of sectors prepared for reading operation.
page
164
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Cf_Read_Byte
Cf_Read_Word
Cf_Write_Init
Description Initializes CF card for writing. Parameter address specifies sector address where data
will be stored, and sectcnt is total number of sectors prepared for write operation.
page
165
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Cf_Write_Byte
Description Writes one byte (data) to CF. All 512 bytes are transferred to a buffer.
Example Cf_Write_Byte(100);
Cf_Write_Word
Description Writes one word (data) to CF. All 512 bytes are transferred to a buffer.
Example Cf_Write_Word(1000);
Cf_Find_File
Description Routine looks for files on CF card. Parameter find_first can be non-zero or zero; if
non-zero, routine looks for the first file on card, in order of physical writing. Otherwise,
routine “moves forward” to the next file from the current position, again in physical
order. If file is found, routine writes its name and extension in the string file_name. If
no file is found, the string will be filled with zeroes.
page
166
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Cf_File_Write_Init
Example Cf_File_Write_Init();
Cf_File_Write_Byte
Description Adds one byte (data) to file. You can supply ASCII value as parameter, for example 48
for zero.
Cf_Read_Sector
page
167
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Cf_Write_Sector
Cf_Set_File_Date
Description Writes system timestamp to a file. Use this routine before finalizing a file; otherwise,
file will be appended a random timestamp.
Cf_File_Write_Complete
Description Finalizes writing to file. Upon all data has be written to file, use this function to close
the file and make it readable. Parameter filename must be 8 chars long in uppercase.
Example Cf_File_Write_Complete("MY_FILE1","txt");
page
168
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Library Example
The following example writes 512 bytes at sector no.590, and then reads the data and prints on
PORTC for a visual check.
unsigned i;
void main() {
TRISC = 0; // PORTC is output
Cf_Init(PORTB, PORTD); // Initialize ports
do nop;
while (!Cf_Detect()); // Wait until CF card is inserted
Delay_ms(500);
Cf_Write_Init(590, 1); // Initialize write at sector address 590
PORTC = 0xFF;
Delay_ms(1000);
Cf_Read_Init(590, 1); // Initialize read at sector address 590
page
169
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Next example waits until the CF card is inserted, and when plugged, it creates 5 text files on the
card. Each file will be appended the same timestamp.
unsigned short index;
unsigned i1;
char *fname, *ext;
void Init(void) {
TRISC = 0; // PORTC is output
Cf_Init(PORTB, PORTD); // Initialize ports
do nop;
while (!Cf_Detect()); // Wait until CF card is inserted
void main() {
ext = "TXT";
index = 0; // Index of file to be written
i1 = 0;
index++;
}
PORTC = 0xFF;
} //~!
page
170
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple...
HW Connection
+5V
PIC16F877A
+5V
MCLR/Vpp/THV RB7/PGD
RA0/AN0 RB6/PGC
50
10K
RA1/AN1 RB5 25
49
24
RA2/AN2/Vref- RB4 48
23
47
RA3/AN3/Vref+ RB3/PGM 22
46
21
RA4/TOCKI RB2 45
20
44
RB1 19
RA5/AN4 43
18
42
RE0/RD/AN5 RB0/INT 17
41
16
RE1/WR/AN6 Vdd 40 Compact Flash Card
+5V 15
39
Reset
RE2/CS/AN7 Vss 14
38
13
Vdd RD7/PSP7 37
12
36
Vss RD6/PSP6 11
35
10
OSC1 RD5/PSP5 34
9
33
8
page
171
mikroC - C Compiler for Microchip PIC microcontrollers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
EEPROM Library
EEPROM data memory is available with a number of PICmicros. mikroC includes
library for comfortable work with EEPROM.
Library Routines
Eeprom_Read
Eeprom_Write
Eeprom_Read
Description Reads data from the specified address. Parameter address is of byte type, which means
it can address only 256 locations. For PIC18 micros with more EEPROM data locations,
it is programmer’s responsibility to set SFR EEADRH register appropriately.
Ensure minimum 20ms delay between successive use of routines Eeprom_Write and
Eeprom_Read. Although PIC will write the correct value, Eeprom_Read might return
an undefined result.
page
172
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Eeprom_Read
Description Writes data to the specified address. Parameter address is of byte type, which means it
can address only 256 locations. For PIC18 micros with more EEPROM data locations, it
is programmer’s responsibility to set SFR EEADRH register appropriately.
Be aware that all interrupts will be disabled during execution of EEPROM_Write rou-
tine (GIE bit of INTCON register will be cleared). Routine will set this bit on exit.
Ensure minimum 20ms delay between successive use of routines Eeprom_Write and
Eeprom_Read. Although PIC will write the correct value, Eeprom_Read might return
an undefined result.
Example Eeprom_Write(0x32);
Library Example
unsigned short i = 0, j = 0;
void main() {
PORTB = 0;
TRISB = 0;
j = 4;
for (i = 0; i < 20u; i++)
Eeprom_Write(i, j++);
page
173
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Ethernet Library
This library is designed to simplify handling of the underlying hardware
(RTL8019AS). However, certain level of knowledge about the Ethernet and
Ethernet-based protocols (ARP, IP, TCP/IP, UDP/IP, ICMP/IP) is expected from
the user. The Ethernet is a high–speed and versatile protocol, but it is not a simple
one. Once you get used to it, however, you will make your favorite PIC available
to a much broader audience than you could do with the RS232/485 or CAN.
Library Routines
Eth_Init
Eth_Set_Ip_Address
Eth_Inport
Eth_Scan_For_Event
Eth_Get_Ip_Hdr_Len
Eth_Load_Ip_Packet
Eth_Get_Hdr_Chksum
Eth_Get_Source_Ip_Address
Eth_Get_Dest_Ip_Address
Eth_Arp_Response
Eth_Get_Icmp_Info
Eth_Ping_Response
Eth_Get_Udp_Source_Port
Eth_Get_Udp_Dest_Port
Eth_Get_Udp_Port
Eth_Set_Udp_Port
Eth_Send_Udp
Eth_Load_Tcp_Header
Eth_Get_Tcp_Hdr_Offset
Eth_Get_Tcp_Flags
Eth_Set_Tcp_Data
Eth_Tcp_Response
page
174
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Eth_Init
Parameter addrP is a pointer to address port, which handles the addressing lines.
Parameter dataP is pointer to data port. Parameter ctrlP is the control port. Parameter
pinReset is the reset/enable pin for the ethernet card chip (on control port). Parameter
pinIOW is the I/O Write request control pin. Parameter pinIOR is the I/O read request
control pin.
Requires As specified for the entire library (please see top of this page).
Eth_Set_Ip_Address
Prototype void Eth_Set_Ip_Address(char ip1, char ip2, char ip3, char ip4);
Description Sets the IP address of the connected and initialized Ethernet network card. The
arguments are the IP address numbers, in IPv4 format (e.g. 127.0.0.1).
Requires This function should be called immediately after the NIC initialization (see Eth_Init).
You can change your IP address at any time, anywhere in the code.
page
175
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Eth_Set_Inport
Description Retrieves a byte from the specified address of the Ethernet card chip.
Eth_Scan_For_Event
Returns Type of the ethernet packet received. Two types are distinguished: ARP (MAC-IP
address data request) and IP (Internet Protocol).
Description Retrieves sender’s MAC (hardware) address and type of the packet received. The
function argument is an (internal) pointer to the next data packet in RTL8019’s buffer,
and is of no particular importance to the end user.
Requires The card (NIC) must be properly initialized. See Eth_Init. Also, the function must be
called in a proper sequence, i.e. right after the card init, and IP address/UDP port init.
page
176
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Eth_Get_Ip_Hdr_Len
Description Returns header length of the received IP packet. Before other data based upon the IP
protocol (TCP, UDP, ICMP) can be analyzed, the sub-protocol data must be properly
loaded from the received IP packet.
Requires The card (NIC) must be properly initialized. See Eth_Init. The function must be
called in a proper sequence, i.e. immediately after determining that the packet received
is the IP packet.
Eth_Load_Ip_Packet
Requires The card (NIC) must be properly initialized. See Eth_Init. Also, a proper sequence of
calls must be obeyed (see the Ip_Event function in the supplied Ethernet example).
Example Eth_Load_Ip_Packet();
page
177
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Eth_Get_Hdr_Chksum
Description Loads and returns the header checksum of the received IP packet.
Requires The card (NIC) must be properly initialized. See Eth_Init. Also, a proper sequence of
calls must be obeyed (see the Ip_Event function in the supplied Ethernet example).
Example Eth_Get_Hdr_Chksum();
Eth_Get_Source_Ip_Address
Description Loads and returns the IP address of the sender of the received IP packet.
Requires The card (NIC) must be properly initialized. See Eth_Init. Also, a proper sequence of
calls must be obeyed (see the Ip_Event function in the supplied Ethernet example).
Example Eth_Get_Source_Ip_Address();
Eth_Get_Dest_Ip_Address
Description Loads the IP address of the received IP packet for which the packet is designated.
Requires The card (NIC) must be properly initialized. See Eth_Init. Also, a proper sequence of
calls must be obeyed (see the Ip_Event function in the supplied Ethernet example).
Example Eth_Get_Dest_Ip_Address();
page
178
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Eth_Arp_Response
Description An automated ARP response. User should simply call this function once he detects the
ARP event on the NIC.
Example Eth_Arp_Response();
Eth_Get_Icmp_Info
Description Loads ICMP protocol information (from the header of the received ICMP packet) and
stores it to the PIC’s Ethernet variables.
Requires The card (NIC) must be properly initialized. See Eth_Init. Also, this function must be
called in a proper sequence, and before the Eth_Ping_Response.
Example Eth_Get_Icmp_Info();
Eth_Ping_Response
Description An automated ICMP (Ping) response. User should call this function when answerring to
an ICMP/IP event.
Example Eth_Ping_Response();
page
179
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Eth_Get_Udp_Source_Port
Returns Returns the source port (socket) of the received UDP packet.
Description The function returns the source port (socket) of the received UDP packet. After the
reception of valid IP packet is detected and its type is determined to be UDP, the UDP
packet header must be interpreted. UDP source port is the first data in the UDP header.
Requires This function must be called in a proper sequence, i.e. immediately after interpretation
of the IP packet header (at the very beginning of UDP packet header retrieval).
Eth_Get_Udp_Dest_Port
Description The function returns the destination port of the received UDP packet. The second
information contained in the UDP packet header is the destination port (socket) to which
the packet is targeted.
Requires This function must be called in a proper sequence, i.e. immediately after calling the
Eth_Get_Udp_Source_Port function.
page
180
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Eth_Get_Udp_Port
Returns Returns the UDP port (socket) number that is set for the PIC’s Ethernet card.
Description The function returns the UDP port (socket) number that is set for the PIC's Ethernet
card. After the UDP port is set at the beginning of the session (Eth_Set_Udp_Port), its
number is later used to test whether the received UDP packet is targeted at the port we
are using.
Requires The network card must be properly initialized (see Eth_Init), and the UDP port
propely set (see Eth_Set_Udp_Port). This library currently supports working with
only one UDP port (socket) at a time.
Eth_Set_Udp_Port
Description Sets up the default UDP port, which will handle user requests. The user can decide,
upon receiving the UDP packet, which port was this packet sent to, and whether it will
be handled or rejected.
Example Eth_Set_Udp_Port(10001);
page
181
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Eth_Send_Udp
Unlike ICMP and TCP, the UDP packets are generally not generated as a response to the
client request. UDP provides no guarantees for message delivery and sender retains no
state on UDP messages once sent onto the network. This is why UDP packets are simply
sent, instead of being a response to someone’s request.
Requires As specified for the entire library. Also, the message to be sent must be formatted as a
null-terminated string. The message length, including the trailing “0”, must not exceed
16 characters.
Example Eth_Send_Udp(udp_tx_message);
Eth_Load_Tcp_Header
Description Loads various TCP Header data into PIC’s Ethernet variables.
Requires This function must be called in a proper sequence, i.e. immediately after retrieving the
source and destination port (socket) of the TCP message.
page
182
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Eth_Get_Tcp_Hdr_Offset
Returns Returns the length (or offset) of the TCP packet header in bytes.
Description The function returns the length (or offset) of the TCP packet header in bytes. Upon
receiving a valid TCP packet, its header is to be analyzed in order to respond properly
(e.g. respond to other's request, merge several packets into the message, etc.). The head-
er length is important to know in order to be able to extract the information contained in
it.
Requires This function must be called after the Eth_Load_Tcp_Header, since it initializes the
private variables used for this function.
Eth_Get_Tcp_Flags
Returns Returns the flags data from the header of the received TCP packet.
Description The function returns the flags data from the header of the received TCP packet. TCP
flags show various information, e.g. SYN (syncronize request), ACK (acknowledge
receipt), and similar. It is upon these flags that, for example, a proper HTTP communi-
cation is established.
Requires This function must be called after the Eth_Load_Tcp_Header, since it initializes the
private variables used for this function.
page
183
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Eth_Set_Tcp_Data
Description Prepares data to be sent on HTTP request. This library can handle only HTTP requests,
so sending other TCP-based protocols, such as FTP, will cause an error. Note that
TCP/IP was not designed with 8-bit MCU’s in mind, so be gentle with your HTTP
requests.
Eth_Tcp_Response
Description Performs user response to TCP/IP event. User specifies data to be sent, depending on the
request received (HTTP, HTTPD, FTP, etc). This is performed by the function
Eth_Set_Tcp_Data.
Requires Hardware requirements are as specified for the entire library. Prior to using this func-
tion, user must prepare the data to be sent through TCP; see Eth_Set_Tcp_Data.
Example Eth_Tcp_Response();
page
184
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Library Example
HW Connection
200 8
+5V 1K T1 : FL1012 7
6
RJ45
5
1K 8 9 4
3
1K 7 10 2
1
6 11
0.1u
+5V 3 14 J2
0.1u +5V 2 15
0.1u 1 16
0.1u 0.1u 0.1u
2KV 2KV
80
79
78
77
76
75
74
73
72
71
70
69
68
67
66
65
64
63
62
61
60
59
58
57
56
55
54
53
52
51
20MHz
Vdd
BA18
BD4
BD5
BD7
BA14
BA16
BA17
BA19
BA20
JP
AUI
LED1
LEDBNC
TPIN+
Vdd
RX-
CD+
GND
EECS
BD6
BCSB
BA15
BA21
LED2
LED0
TPIN-
RX+
CD-
OSCO
81
BD3 OSCI
50 RD7
82 49
BD2 TX+
83
GND TX- 48 RD6
84 47
BD1 Vdd
0.1u 85 BD0 LD 46 RD5
86 45
GND HD
+5V 87
SD15 GND
44 RD4
88 43
SD14 SD7
89 42 RD3
90
Vdd
SD13
RTL8019AS SD6
SD5
41
91 40 RD2
92
SD12
SD11
U5 SD4
SD3 39
93 38
94
SD10 SD2
37
RD1
SD9 SD1
95 36
96
SD8 SD0
35
RD0
IOCS16B IOCHRDY
97 34
INT7 AEN
98 33
99
INT6 RSTDRV
32
+5V
INT5 SMEMWB
100 31
INT4 SMEMRB
IOWB
SA13
SA14
SA16
SA18
SA19
IORB
SA10
SA12
SA15
SA17
AS11
GND
GND
INT3
INT2
INT0
INT1
SA5
SA6
SA1
SA3
SA4
SA7
SA9
SA0
SA2
SA8
Vdd
Vdd
+5V
1K
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
RES
IOW
IOR
0.1u
+5V
RB0
RB1
RB2
RB3
RB4
page
185
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Library Routines
Flash_Read
Flash_Write
Flash_Read
Example Flash_Read(0x0D00);
Flash_Write
Description Writes chunk of data to Flash memory. With PIC18, data needs to be exactly 64 bytes in
size. Keep in mind that this function erases target memory before writing Data to it.
This means that if write was unsuccessful, previous data will be lost.
// initialize array:
for (i = 0; i < 63; i++) toWrite[i] = i;
Flash_Write(0x0D00, toWrite);
page
186
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Library Example
The example demonstrates simple data exchange via USART. When PIC MCU
receives data, it immediately sends the same data back. If PIC is connected to the
PC (see the figure below), you can test the example from mikroC terminal for
RS232 communication, menu choice Tools > Terminal.
char i = 0, j = 0;
long addr;
unsigned short dataRd;
unsigned short dataWr[64] =
{1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,
1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,
1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,
1,2,3,4};
void main() {
PORTB = 0;
TRISB = 0;
PORTC = 0;
TRISC = 0;
addr = 0x00000A30;
for (i = 0; i < 64; i++) {
dataRd = Flash_Read(addr++);
PORTB = dataRd;
Delay_ms(500);
}
}//~!
page
187
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
I2C Library
I²C full master MSSP module is available with a number of PIC MCU models.
mikroC provides I2C library which supports the master I²C mode.
Note: This library supports module on PORTB or PORTC, and will not work with
modules on other ports. Examples for PICmicros with module on other ports can
be found in your mikroC installation folder, subfolder “Examples”.
Library Routines
I2C_Init
I2C_Start
I2C_Repeated_Start
I2C_Is_Idle
I2C_Rd
I2C_Wr
I2C_Stop
I2C_Init
Description Initializes I²C with desired clock (refer to device data sheet for correct values in
respect with Fosc). Needs to be called before using other functions of I2C Library.
Example I2C_Init(100000);
page
188
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
I2C_Start
Requires I²C must be configured before using this function. See I2C_Init.
Example I2C_Start();
I2C_Repeated_Start
Requires I²C must be configured before using this function. See I2C_Init.
Example I2C_Repeated_Start();
I2C_Is_Idle
Requires I²C must be configured before using this function. See I2C_Init.
page
189
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
I2C_Rd
Description Reads one byte from the slave, and sends not acknowledge signal if parameter ack is 0,
otherwise it sends acknowledge.
Requires START signal needs to be issued in order to use this function. See I2C_Start.
Example temp = I2C_Rd(0); // Read data and send not acknowledge signal
I2C_Wr
Requires START signal needs to be issued in order to use this function. See I2C_Start.
Example I2C_Write(0xA3);
I2C_Stop
Requires I²C must be configured before using this function. See I2C_Init.
page
190
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Library Example
This code demonstrates use of I²C Library functions. PIC MCU is connected
(SCL, SDA pins ) to 24c02 EEPROM. Program sends data to EEPROM (data is
written at address 2). Then, we read data via I2C from EEPROM and send its
value to PORTD, to check if the cycle was successful (see the figure below how to
interface 24c02 to PIC).
void main(){
PORTB = 0;
TRISB = 0;
I2C_Init(100000);
I2C_Start(); // Issue I2C start signal
I2C_Wr(0xA2); // Send byte via I2C (command to 24cO2)
I2C_Wr(2); // Send byte (address of EEPROM location)
I2C_Wr(0xF0); // Send data (data to be written)
I2C_Stop();
Delay_ms(100);
page
191
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
HW Connection
PIC16F877A
+5V +5V
MCLR/Vpp/THV RB7/PGD
RA0/AN0 RB6/PGC
10K RA1/AN1
10K
RB5
10K
RA2/AN2/Vref- RB4
RA3/AN3/Vref+ RB3/PGM
RA4/TOCKI RB2
RA5/AN4 RB1
+5V
Reset
RE0/RD/AN5 RB0/INT
RE1/WR/AN6 Vdd
+5V
RE2/CS/AN7 Vss
1 8
Vdd RD7/PSP7
A0 Vcc
2 7 Vss RD6/PSP6
A1 WP
3 6 OSC1 RD5/PSP5
NC SCL
4 5 OSC2 RD4/PSP4
GND SDA RCO/T1OSO RC7/RX/DT
4MHz
RC1/T1OSI RC6/TX/CK
24C04 RC2/CCP1 RC5
RC3 RC4
RD0/PSP0 RD3/PSP3
RD1/PSP1 RD2/PSP2
page
192
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Keypad Library
mikroC provides library for working with 4x4 keypad; routines can also be used
with 4x1, 4x2, or 4x3 keypad. Check the connection scheme at the end of the
topic.
Library Routines
Keypad_Init
Keypad_Read
Keypad_Released
Keypad_Init
Description Initializes port to work with keypad. The function needs to be called before using other
routines of the Keypad library.
Example Keypad_Init(&PORTB);
Keypad_Read
Description Checks if any key is pressed. Function returns 1 to 16, depending on the key pressed, or
0 if no key is pressed.
Example kp = Keypad_Read();
page
193
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Keypad_Released
Description Call to Keypad_Released is a blocking call: function waits until any key is pressed
and released. When released, function returns 1 to 16, depending on the key.
Example kp = Keypad_Released();
page
194
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Library Example
The following code can be used for testing the keypad. It supports keypads with 1 to 4 rows and 1
to 4 columns. The code returned by the keypad functions (1..16) is transformed into ASCII codes
[0..9,A..F]. In addition, a small single-byte counter displays the total number of keys pressed in
the second LCD row.
void main() {
cnt = 0;
Keypad_Init(&PORTC);
Lcd_Init(&PORTB); // Initialize LCD on PORTC
Lcd_Cmd(LCD_CLEAR); // Clear display
Lcd_Cmd(LCD_CURSOR_OFF); // Cursor off
do {
kp = 0;
cnt++;
} while (1);
}//~!
page
195
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
HW Connection
PIC16F877A
+5V
+5V MCLR/Vpp/THV RB7/PGD
RA0/AN0 RB6/PGC T1 T2 T3 T4
10K
RA1/AN1 RB5
RA2/AN2/Vref- RB4
RA3/AN3/Vref+ RB3/PGM
RA4/TOCKI RB2 T5 T6 T7 T8
RA5/AN4 RB1
RE0/RD/AN5 RB0/INT
Reset
RE1/WR/AN6 Vdd
+5V
RE2/CS/AN7 Vss T9 T10 T11 T12
Vdd RD7/PSP7
Vss RD6/PSP6
OSC1 RD5/PSP5
OSC2 RD4/PSP4 T13 T14 T15 T16
RCO/T1OSO RC7/RX/DT
RC1/T1OSI RC6/TX/CK
RC2/CCP1 RC5
RC3 RC4
page
196
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Note: Be sure to designate port with LCD as output, before using any of the fol-
lowing library functions.
Library Routines
Lcd_Config
Lcd_Init
Lcd_Out
Lcd_Out_Cp
Lcd_Chr
Lcd_Chr_Cp
Lcd_Cmd
Lcd_Config
Prototype void Lcd_Config(char *port, char RS, char EN, char WR, char D7,
char D6, char D5, char D4);
Description Initializes LCD at port with pin settings you specify: parameters RS, EN, WR, D7 .. D4
need to be a combination of values 0–7 (e.g. 3,6,0,7,2,1,4).
Example Lcd_Config(PORTD,1,2,0,3,5,4,6);
page
197
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Lcd_Init
Description Initializes LCD at port with default pin settings (see the connection scheme at the end of
the chapter): D7 -> PORT.7, D6 -> PORT.6, D5 -> PORT.5, D4 -> PORT.4,
E -> PORT.3, RS -> PORT.2.
Example Lcd_Init(PORTB);
Lcd_Out
Description Prints text on LCD at specified row and column (parameter row and col). Both string
variables and literals can be passed as text.
Lcd_Out_Cp
Description Prints text on LCD at current cursor position. Both string variables and literals can be
passed as text.
page
198
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Lcd_Chr
Description Prints character on LCD at specified row and column (parameters row and col).
Both variables and literals can be passed as character.
Lcd_Chr_Cp
Description Prints character on LCD at current cursor position. Both variables and literals can be
passed as character.
Lcd_Cmd
Description Sends command to LCD. You can pass one of the predefined constants to the function.
The complete list of available commands is shown on the following page.
page
199
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
LCD Commands
page
200
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
void main() {
TRISB = 0; // PORTB is output
Lcd_Init(&PORTB); // Initialize LCD connected to PORTB
Lcd_Cmd(Lcd_CLEAR); // Clear display
Lcd_Cmd(Lcd_CURSOR_OFF); // Turn cursor off
Lcd_Out(1, 1, text); // Print text to LCD, 2nd row, 1st column
}//~!
Hardware Connection
PIC MCU
any port (with 8 pins)
+5V
LCD cont rast
PIC LCD
PIN7 D7
PIN6 D6
PIN5 D5 1
Vss Vdd Vee RS R/W E D0 D1 D2 D3 D4 D5 D6 D7
PIN4 D4
PIN3 E
PIN2 RS m i k ro el E kt ron i ka
PIN1
PIN0
page
201
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
void main() {
TRISD = 0; // PORTD is output
Lcd_Config(&PORTD,1,2,0,3,5,4,6); // Initialize LCD on PORTD
Lcd_Cmd(Lcd_CURSOR_OFF); // Turn off cursor
Lcd_Out(1, 1, text); // Print Text at LCD
}
Hardware Connection
PIC MCU
PORTD
+5V
LCD cont rast
PIC LCD
PIN7
PIN6 D4
PIN5 D6 1
Vss Vdd Vee RS R/W E D0 D1 D2 D3 D4 D5 D6 D7
PIN4 D5
PIN3 D7
PIN2 E m i k ro el E kt ron i ka
PIN1 RS
PIN0
page
202
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Note: Be sure to designate Control and Data ports with LCD as output, before
using any of the following functions.
Library Routines
Lcd8_Config
Lcd8_Init
Lcd8_Out
Lcd8_Out_Cp
Lcd8_Chr
Lcd8_Chr_Cp
Lcd8_Cmd
Lcd8_Config
Description Initializes LCD at Control port (ctrlport) and Data port (dataport) with pin settings
you specify: Parameters RS, EN, and WR need to be in range 0–7; Parameters D7 .. D0
need to be a combination of values 0–7 (e.g. 3,6,5,0,7,2,1,4).
Example Lcd8_Config(PORTC,PORTD,0,1,2,6,5,4,3,7,1,2,0);
page
203
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Lcd8_Init
Description Initializes LCD at Control port (ctrlport) and Data port (dataport) with default pin set-
tings (see the connection scheme at the end of the chapter):
E -> ctrlport.3, RS -> ctrlport.2, R/W -> ctrlport.0, D7 -> dataport.7, D6 -> dataport.6,
D5 -> dataport.5, D4 -> dataport.4, D3 -> dataport.3, D2 -> dataport.2, D1 -> dataport.1,
D0 -> dataport.0
Lcd8_Out
Description Prints text on LCD at specified row and column (parameter row and col). Both string
variables and literals can be passed as text.
Lcd8_Out_Cp
Description Prints text on LCD at current cursor position. Both string variables and literals can be
passed as text.
page
204
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Lcd8_Chr
Description Prints character on LCD at specified row and column (parameters row and col).
Both variables and literals can be passed as character.
Lcd8_Chr_Cp
Description Prints character on LCD at current cursor position. Both variables and literals can be
passed as character.
Lcd8_Cmd
Description Sends command to LCD. You can pass one of the predefined constants to the function.
The complete list of available commands is on the page 186.
page
205
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
void main() {
TRISB = 0; // PORTB is output
TRISC = 0; // PORTC is output
Lcd8_Init(&PORTB, &PORTC); // Initialize LCD at PORTB and PORTC
Lcd8_Cmd(Lcd_CURSOR_OFF); // Turn off cursor
Lcd8_Out(1, 1, text); // Print text on LCD
}
Hardware Connection
PIC MCU
any port (with 8 pins)
PIN0 PIN2 PIN3 PIN0 PIN1 PIN2 PIN3 PIN4 PIN5 PIN6 PIN7
E
R/W
RS
+5V
LCD cont rast
1
Vss Vdd Vee RS R/W E D0 D1 D2 D3 D4 D5 D6 D7
m i k ro el E ktron i ka
page
206
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
void main() {
TRISB = 0; // PORTB is output
TRISD = 0; // PORTD is output
Hardware Connection
PIC MCU
any port (with 8 pins)
PIN0 PIN2 PIN3 PIN0 PIN1 PIN2 PIN3 PIN4 PIN5 PIN6 PIN7
E
R/W
RS
+5V
LCD cont rast
1
Vss Vdd Vee RS R/W E D0 D1 D2 D3 D4 D5 D6 D7
m i k ro el E ktron i ka
page
207
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
GLCD Library
mikroC provides a library for drawing and writing on Graphic LCD. These rou-
tines work with commonly used GLCD 128x64, and work only with the PIC18
family.
Note: Be sure to designate port with GLCD as output, before using any of the fol-
lowing functions.
Library Routines
Basic routines:
Glcd_Init
Glcd_Disable
Glcd_Set_Side
Glcd_Set_Page
Glcd_Set_X
Glcd_Read_Data
Glcd_Write_Data
Advanced routines:
Glcd_Fill
Glcd_Dot
Glcd_Line
Glcd_V_Line
Glcd_H_Line
Glcd_Rectangle
Glcd_Box
Glcd_Circle
Glcd_Set_Font
Glcd_Write_Char
Glcd_Write_Text
Glcd_Image
Glcd_Partial_Image
page
208
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Glcd_Init
Prototype void Glcd_Init(unsigned char *ctrl_port, char cs1, char cs2, char
rs, char rw, char rst, char en, unsigned char *data_port);
Description Initializes GLCD at lower byte of data_port with pin settings you specify. Parameters
cs1, cs2, rs, rw, rst, and en can be pins of any available port. This function needs to
be called befored using other routines of GLCD library.
Glcd_Disable
Description Routine disables the device and frees the data line for other devices. To enable the
device again, call any of the library routines; no special command is required.
Example Glcd_Disable();
Glcd_Set_Side
Description Selects side of GLCD, left or right. Parameter x specifies the side: values from 0 to 63
specify the left side, and values higher than 64 specify the right side. Use the functions
Glcd_Set_Side, Glcd_Set_X, and Glcd_Set_Page to specify an exact position on
GLCD. Then, you can use Glcd_Write_Data or Glcd_Read_Data on that location.
Example Glcd_Select_Side(0);
page
209
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Glcd_Set_Page
Description Selects page of GLCD, technically a line on display; parameter page can be 0..7.
Example Glcd_Set_Page(5);
Glcd_Set_X
Description Positions to x dots from the left border of GLCD within the given page.
Example Glcd_Set_X(25);
Glcd_Read_Data
Description Reads data from from the current location of GLCD memory. Use the functions
Glcd_Set_Side, Glcd_Set_X, and Glcd_Set_Page to specify an exact position on
GLCD. Then, you can use Glcd_Write_Data or Glcd_Read_Data on that location.
Requires Reads data from from the current location of GLCD memory.
page
210
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Glcd_Write_Data
Description Writes data to the current location in GLCD memory and moves to the next location.
Example Glcd_Write_Data(data);
Glcd_Fill
Description Fills the GLCD memory with byte pattern. To clear the GLCD screen, use
Glcd_Fill(0); to fill the screen completely, use Glcd_Fill($FF).
Glcd_Dot
Description Draws a dot on the GLCD at coordinates (x, y). Parameter color determines the dot
state: 0 clears dot, 1 puts a dot, and 2 inverts dot state.
Example Glcd_Dot(0, 0, 2); // Invert the dot in the upper left corner
page
211
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Glcd_Line
Prototype void Glcd_Line(int x1, int y1, int x2, int y2, char color);
Description Draws a line on the GLCD from (x1, y1) to (x2, y2). Parameter color determines
the dot state: 0 draws an empty line (clear dots), 1 draws a full line (put dots), and 2
draws a “smart” line (invert each dot).
Glcd_V_Line
Description Similar to GLcd_Line, draws a vertical line on the GLCD from (x, y1) to
(x, y2).
Glcd_H_Line
Description Similar to GLcd_Line, draws a horizontal line on the GLCD from (x1, y) to
(x2, y).
page
212
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Glcd_Rectangle
Description Draws a rectangle on the GLCD. Parameters (x1, y1) set the upper left corner,
(x2, y2) set the bottom right corner. Parameter color defines the border: 0 draws an
empty border (clear dots), 1 draws a solid border (put dots), and 2 draws a “smart” bor-
der (invert each dot).
Glcd_Box
Description Draws a box on the GLCD. Parameters (x1, y1) set the upper left corner, (x2, y2)
set the bottom right corner. Parameter color defines the fill: 0 draws a white box (clear
dots), 1 draws a full box (put dots), and 2 draws an inverted box (invert each dot).
page
213
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Glcd_Circle
Description Draws a circle on the GLCD, centered at (x, y) with radius. Parameter color defines the
circle line: 0 draws an empty line (clear dots), 1 draws a solid line (put dots), and 2
draws a “smart” line (invert each dot).
Glcd_Set_Font
Description Sets font for routines Glcd_Write_Char and Glcd_Write_Text. Parameter font
needs to formatted in an array of byte.
Parameters font_width and font_height specify the width and height of characters
in dots. Font width should not exceed 128 dots, and font height shouldn’t exceed 8 dots.
You can create your own fonts by following the guidelines given in file
“GLcd_Fonts.c”. This file contains the default fonts for GLCD, and is located in your
installation folder, “Extra Examples” > “GLCD”.
page
214
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Glcd_Write_Char
Description Prints character at page (one of 8 GLCD lines, 0..7), x dots away from the left bor-
der of display. Parameter color defines the “fill”: 0 prints a “white” letter (clear dots),
1 prints a solid letter (put dots), and 2 prints a “smart” letter (invert each dot).
Glcd_Write_Text
Description Prints text at page (one of 8 GLCD lines, 0..7), x dots away from the left border of
display. Parameter color defines the “fill”: 0 prints a “white” letters (clear dots), 1
prints solid letters (put dots), and 2 prints “smart” letters (invert each dot).
page
215
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Glcd_Image
Description Displays bitmap image on the GLCD. Parameter image should be formatted as an array
of integers. Use the mikroC’s integrated Bitmap-to-LCD editor (menu option Tools >
BMP2LCD) to convert image to a constant array suitable for display on GLCD.
Example Glcd_Image(my_image);
Glcd_Partial_Image
Description Displays partial bitmap image on the GLCD. Parameter image should be formatted as
an array of 1024 bytes. Parameters (x1, y1) set the upper left corner, and (x2, y2) set
the lower right corner of the clip. Parameter color defines the fill: 0 draws a “white”
image (clear dots), 1 draws a “black” image (put dots), and 2 draws an inverted image
(invert each dot).
Use the mikroC’s integrated Bitmap-to-LCD editor (menu option Tools > Graphic LCD
Editor) to convert image to a constant array suitable for display on GLCD.
page
216
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Library Example
void main() {
Glcd_Init(PORTB, 2, 0, 3, 5, 7, 1, PORTD);
do {
// Draw circles
Glcd_Fill(0); // Clear screen
Glcd_Write_Text("Circles", 0, 0, 1);
j = 4;
while (j < 31) {
Glcd_Circle(63, 31, j, 2);
j += 4;
}
Delay_ms(4000);
// Draw boxes
Glcd_Fill(0); // Clear screen
Glcd_Write_Text("Rectangles", 0, 0, 1);
j = 0;
while (j < 31) {
Glcd_Box(j, 0, j + 20, j + 25, 2);
j += 4;
}
Delay_ms(4000);
// Draw Lines
Glcd_Fill(0); // Clear screen
Glcd_Write_Text("Lines", 0, 0, 1);
for (j = 0; j < 16; j++) {
k = j*4 + 3;
Glcd_Line(0, 0, 127, k, 2);
}
for (j = 0; j < 31; j++) {
k = j*4 + 3;
Glcd_Line(0, 63, k, 0, 2);
}
Delay_ms(4000);
} while (1);
}//~!
page
217
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Hardware Connection
"Hello world"
mikroElektronika
K 18 1
GND
VOUT
RESET
CS2
CS1
D7
D6
D5
D4
D3
D2
D1
D0
E
R/ W
RS
Vee
Vcc
10k
GND
10
+ 5V
page
218
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Bi-phase coding
1 0
2.4ms Example of transmission
1 1 0 0 01 0 0 01 1
Library Routines
Man_Receive_Config
Man_Receive_Init
Man_Receive
Man_Send_Config
Man_Send_Init
Man_Send
page
219
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Man_Receive_Config
Description The function prepares PIC for receiving signal. You need to specify the port and
rxpin (0–7) of input signal. In case of multiple errors on reception, you should call
Man_Receive_Init once again to enable synchronization.
Man_Receive_Init
Description The function prepares PIC for receiving signal. You need to specify the port; rxpin is
pin 6 by default. In case of multiple errors on reception, you should call
Man_Receive_Init once again to enable synchronization.
Example Man_Receive_Init(&PORTD);
Man_Receive
Description Function extracts one byte from signal. If signal format does not match the expected,
error flag will be set to 255.
Requires To use this function, you must first prepare the PIC for receiving. See
Man_Receive_Config or Man_Receive_Init.
page
220
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Man_Send_Config
Description The function prepares PIC for sending signal. You need to specify port and txpin
(0–7) for outgoing signal. Baud rate is const 500 bps.
Man_Send_Init
Description The function prepares PIC for sending signal. You need to specify port for outgoing
signal; txpin is pin 0 by default. Baud rate is const 500 bps.
Example Man_Send_Init(&PORTD);
Man_Send
Requires To use this function, you must first prepare the PIC for sending. See
Man_Send_Config or Man_Send_Init.
page
221
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Library Example
void main() {
ErrorCount = 0;
TRISC = 0; // Error indicator
PORTC = 0;
Man_Receive_Config(&PORTD, 6); // Synchronize receiver
Lcd_Init(&PORTB); // Initialize LCD on PORTB
page
222
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Hardware Connection
RA1/AN1 RB5
RA2/AN2/Vref- RB4
RA3/AN3/Vref+ RB3/PGM
RA4/TOCKI RB2
Vcc
RA5/AN4 RB1
Reset
PIC16F877A
+5V
MCLR/Vpp/THV RB7/PGD
RA0/AN0 RB6/PGC
10K
RA1/AN1 RB5
RA2/AN2/Vref- RB4
RA3/AN3/Vref+ RB3/PGM
Ant en na
RA4/TOCKI RB2
RA5/AN4 RB1
RR3
Reset
RE0/RD/AN5 RB0/INT
RE1/WR/AN6 Vdd
Receiver RF Module +5V
RE2/CS/AN7 Vss
+5V Vdd RD7/PSP7
Vss RD6/PSP6
OSC1 RD5/PSP5
OSC2 RD4/PSP4
RCO/T1OSO RC7/RX/DT
RC1/T1OSI RC6/TX/CK
RC2/CCP1 RC5
RC3 RC4
page
223
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Notes:
- Library works with PIC18 family only;
- Library functions create and read files from the root directory only;
- Library functions populate both FAT1 and FAT2 tables when writing to files, but
the file data is being read from the FAT1 table only; i.e. there is no recovery if
T1 table is corrupted.
Library Routines
Mmc_Init
Mmc_Read_Sector
Mmc_Write_Sector
Mmc_Read_Cid
Mmc_Read_Csd
Mmc_Fat_Init
Mmc_Fat_Assign
Mmc_Fat_Reset
Mmc_Fat_Rewrite
Mmc_Fat_Append
Mmc_Fat_Read
Mmc_Fat_Write
Mmc_Set_File_Date
Mmc_Init
Returns Returns 0 if MMC card is present and successfully initialized, otherwise returns 1.
Description Initializes MMC through hardware SPI communication, with chip select pin being given
by the parameters port and pin; communication port and pins are designated by the
hardware SPI settings for the respective MCU. Function returns 1 if MMC card is pres-
ent and successfully initialized, otherwise returns 0.
page
224
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Mmc_Read_Sector
Description Function reads one sector (512 bytes) from MMC card at sector address sector. Read
data is stored in the array data. Function returns 0 if read was successful, or 1 if an
error occurred.
Mmc_Write_Sector
Returns Returns 0 if write was successful; returns 1 if there was an error in sending write com-
mand; returns 2 if there was an error in writing.
Description Function writes 512 bytes of data to MMC card at sector address sector. Function
returns 0 if write was successful, or 1 if there was an error in sending write command,
or 2 if there was an error in writing.
page
225
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Mmc_Read_Cid
Description Function reads CID register and returns 16 bytes of content into
data_for_registers.
Mmc_Read_Csd
Description Function reads CSD register and returns 16 bytes of content into
data_for_registers.
page
226
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Mmc_Fat_Init
Returns Returns 0 if MMC card is present and successfully initialized, otherwise returns 1.
Description Initializes hardware SPI communication; designated CS line for communication is RC2.
The function returns 0 if MMC card is present and successfully initialized, otherwise
returns 1.
This function needs to be called before using other functions of MMC FAT library.
Mmc_Fat_Assign
Description This routine designates (“assigns”) the file we’ll be working with. Function looks for the
file specified by the filename in the root directory. If the file is found, routine will ini-
tialize it by getting its start sector, size, etc. If the file is not found, an empty file will be
created with the given name. The filename must be 8 + 3 characters in uppercase.
page
227
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Mmc_Fat_Reset
Description Function resets the file pointer (moves it to the start of the file) of the assigned file, so
that the file can be read. Parameter size stores the size of the assigned file, in bytes.
Example Mmc_Fat_Reset(&filesize);
Mmc_Fat_Rewrite
Description Function resets the file pointer and clears the assigned file, so that new data can be writ-
ten into the file.
Example Mmc_Fat_Rewrite();
Mmc_Fat_Append
Description The function moves the file pointer to the end of the assigned file, so that data can be
appended to the file.
Example Mmc_Fat_Append();
page
228
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Mmc_Fat_Read
Description Function reads the byte at which the file pointer points to and stores data into parameter
data. The file pointer automatically increments with each call of Mmc_Fat_Read.
Example Mmc_Fat_Read(&mydata);
Mmc_Fat_Write
Description Function writes a chunk of data_len bytes (fdata) to the currently assigned file, at
the position of the file pointer.
Mmc_Set_File_Date
Description Writes system timestamp to a file. Use this routine before each writing to the file; other-
wise, file will be appended a random timestamp.
page
229
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Library Example
The following code tests MMC library routines. First, we fill the buffer with 512 “M” characters
and write it to sector 56; then we repeat the sequence with character “E” at sector 56. Finally, we
read the sectors 55 and 56 to check if the write was successful.
unsigned i;
unsigned short tmp;
unsigned short data[512];
void main() {
Usart_Init(9600);
}//~!
page
230
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Library Example
The following program tests MMC FAT routines. It creates 5 different files in the root of MMC
card, and fills them with some data. You can check the file dates which should be different.
void main() {
PORTB = 0;
TRISB = 0;
Usart_Init(19200); // Set up USART for reading the files
if (!Mmc_Fat_Init(&PORTC, 2)) { // Try to find the FAT
tmp = 0;
while (FAT_ERROR[tmp])
Usart_Write(FAT_ERROR[tmp++]);
}
for (loop = 1; loop <= 5; loop++) { // We want 5 files on our MMC card
filename[7] = loop + 64; // Set number 1, 2, 3, 4 or 5
Mmc_Fat_Assign(&filename); // If file not found, create new file
Mmc_Fat_Rewrite(); // Clear the file, start with new data
file_contents[0] = loop / 10 + 48;
file_contents[1] = loop % 10 + 48;
Mmc_Fat_Write(file_contents, 41); // Write data to the assigned file
Mmc_Fat_Append(); // Add more data to file
Mmc_Fat_Write(file_contents, 41); // Write data to file
Delay_ms(200);
}
// Now if we want to add more data to those same files
for (loop = 1; loop <= 5; loop++) {
filename[7] = loop + 64;
Mmc_Fat_Assign(&filename); // Assign a file
Mmc_Fat_Append();
Mmc_Set_File_Date(2005,6,21,10,loop,0);
Mmc_Fat_Write(" for mikroElektronika 2005\r\n", 30);
Mmc_Fat_Append();
Mmc_Fat_Write(file_contents, 41);
Mmc_Fat_Reset(&size); // To read file, returns file size
for (i = 1; i <= size; i++) { // Write whole file to USART
Mmc_Fat_Read(&character);
Usart_Write(character);
}
Delay_ms(200);
}
}//~!
page
231
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Hardware Connection
+5V IC1
PIC18F458 MC33269-3.3 +3V3
+5V
MCLR/Vpp RB7/PGD
IN OUT
GND
100nF
22uF
RA0/AN0/Cvref RB6/PGC + +
10K
RA1/AN1 RB5/PGM
RA2/AN2/Vref- RB4
RA3/AN3/Vref+ RB3/CANRX
RA4/TOCKI RB2/CANTX/INT2
RA5/AN4/SS/LVDIN RB1/INT1
RE0/AN5/RD/ RB0/INT0
Reset
RE1/AN6/WR/C1OUT Vdd
+5V
RE2/AN7/CS/C2OUT Vss
Vdd RD7/PSP7/P1D
Vss RD6/PSP6/P1C
OSC1/CLKI RD5/PSP5/P1B
2K2
2K2
2K2
RD4/PSP4/ MMC
OSC2/CLKO/RA6
ECCP1/P1A
RC0/T1OSO/T1CKI RC7/RX/DT /CS
3K3
3K3
RC3/SCK/SCL RC4/SDI/SDA
CLK
RD0/PSP0/C1IN+ RD3/PSP3/C2IN-
4MHz GND
RD1/PSP1/C1IN- RD2/PSP2/C2IN+ Data_OUT
SV1
1 2 3 4 5 6 7
MMC
Back view
page
232
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
OneWire Library
OneWire library provides routines for communication via OneWire bus, for exam-
ple with DS1820 digital thermometer. This is a Master/Slave protocol, and all the
cabling required is a single wire. Because of the hardware configuration it uses
(single pullup and open collector drivers), it allows for the slaves even to get their
power supply from that line.
Each OneWire device also has a unique 64-bit registration number (8-bit device
type, 48-bit serial number and 8-bit CRC), so multiple slaves can co-exist on the
same bus.
Note that oscillator frequency Fosc needs to be at least 4MHz in order to use the
routines with Dallas digital thermometers.
Library Routines
Ow_Reset
Ow_Read
Ow_Write
page
233
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Ow_Reset
Description Issues OneWire reset signal for DS1820. Parameters port and pin specify the location
of DS1820.
Ow_Read
Returns Data read from an external device over the OneWire bus.
Ow_Write
Description Writes one byte of data (argument par) via OneWire bus.
page
234
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Library Example
unsigned temp;
unsigned short j;
void main() {
ADCON1 = 0xFF; // Configure RA5 pin as digital I/O
PORTA = 0xFF;
TRISA = 0x0F; // PORTA is input
PORTB = 0;
TRISB = 0; // PORTB is output
do {
OW_Reset(&PORTA,5);
OW_Write(&PORTA,5,0xCC); // Issue command SKIP_ROM
OW_Write(&PORTA,5,0xBE); // Issue command READ_SCRATCHPAD
Delay_ms(400);
} while (1);
}//~!
page
235
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Hardware Connection
+5V
10K
PIC16F877A
MCLR/Vpp/THV RB7/PGD
RA0/AN0 RB6/PGC
RA1/AN1 RB5
RA2/AN2/Vref- RB4
RA3/AN3/Vref+ RB3/PGM
RA4/TOCKI RB2
RA5/AN4 RB1
Reset
RE0/RD/AN5 RB0/INT
RE1/WR/AN6 Vdd
+5V
RE2/CS/AN7 Vss
D7
Vdd RD7/PSP7
D6
Vss RD6/PSP6
DS1820 +5V D5
+125 O
C OSC1 RD5/PSP5
D4
OSC2 RD4/PSP4
RCO/T1OSO RC7/RX/DT
GND
Vdd
DQ
RC1/T1OSI RC6/TX/CK
-55 4MHz
RC2/CCP1 RC5
RC3 RC4
E
RD0/PSP0 RD3/PSP3
RS
RD1/PSP1 RD2/PSP2
4K7
+5V
LCD contrast
1
Vss Vdd Vee RS R/W E D0 D1 D2 D3 D4 D5 D6 D7
m i k ro el E kt ron i ka
page
236
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
PS/2 Library
mikroC provides a library for communicating with common PS/2 keyboard.The
library does not utilize interrupts for data retrieval, and requires oscillator clock to
be 6MHz and above.
Library Routines
Ps2_Init
Ps2_Config
Ps2_Key_Read
Ps2_Init
Description Initializes port for work with PS/2 keyboard, with default pin settings. Port pin 0 is
Data line, and port pin 1 is Clock line.
You need to call either Ps2_Init or Ps2_Config before using other routines of PS/2
library.
Ps2_Config
Description Initializes port for work with PS/2 keyboard, with custom pin settings. Parameters
data and clock specify pins of port for Data line and Clock line, respectively. Data
and clock need to be in range 0..7 and cannot point to the same pin.
You need to call either Ps2_Init or Ps2_Config before using other routines of PS/2
library.
page
237
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Ps2_Key_Read
Returns Returns 1 if reading of a key from the keyboard was successful, otherwise 0.
Parameter value holds the value of the key pressed. For characters, numerals, punctua-
tion marks, and space, value will store the appropriate ASCII value. Routine “recog-
nizes” the function of Shift and Caps Lock, and behaves appropriately.
Parameter special is a flag for special function keys (F1, Enter, Esc, etc). If key
pressed is one of these, special will be set to 1, otherwise 0.
page
238
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Library Example
This simple example reads values of keys pressed on PS/2 keyboard and sends them via USART.
void main() {
CMCON = 0x07; // Disable analog comparators (comment this for PIC18)
INTCON = 0; // Disable all interrupts
Ps2_Init(&PORTA); // Init PS/2 Keyboard on PORTA
Delay_ms(100); // Wait for keyboard to finish
do {
if (Ps2_Key_Read(&keydata, &special, &down)) {
if (down && (keydata == 16)) {// Backspace
// ...do something with a backspace...
}
else if (down && (keydata == 13)) {// Enter
Usart_Write(13);
}
else if (down && !special && keydata) {
Usart_Write(keydata);
}
}
Delay_ms(10); // debounce
} while (1);
}//~!
page
239
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
PWM Library
CCP module is available with a number of PICmicros. mikroC provides library
which simplifies using PWM HW Module.
Note: These routines support module on RC2, and won’t work with modules on
other ports. You can find examples for PICmicros with module on other ports in
mikroC installation folder, subfolder “Examples”. Also, mikroC does not support
enhanced PWM modules.
Library Routines
Pwm_Init
Pwm_Change_Duty
Pwm_Start
Pwm_Stop
Pwm_Init
Description Initializes the PWM module with duty ratio 0. Parameter freq is a desired PWM fre-
quency in Hz (refer to device data sheet for correct values in respect with Fosc).
Pwm_Init needs to be called before using other functions from PWM Library.
Requires You need a CCP module on PORTC to use this library. Check mikroC installation fold-
er, subfolder “Examples”, for alternate solutions.
page
240
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Pwm_Change_Duty
Description Changes PWM duty ratio. Parameter duty_ratio takes values from 0 to 255, where 0
is 0%, 127 is 50%, and 255 is 100% duty ratio. Other specific values for duty ratio can
be calculated as (Percent*255)/100.
Requires You need a CCP module on PORTC to use this library. To use this function, module
needs to be initalized – see Pwm_Init.
Pwm_Start
Requires You need a CCP module on PORTC to use this library. To use this function, module
needs to be initalized – see Pwm_Init.
Example Pwm_Start();
Pwm_Stop
Requires You need a CCP module on PORTC to use this library. To use this function, module
needs to be initalized – see Pwm_Init.
Example Pwm_Stop();
page
241
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Library Example
/*The example changes PWM duty ratio on pin RC2 continually. If LED is connected
to RC2, you can observe the gradual change of emitted light. */
char i = 0, j = 0;
void main() {
PORTC = 0xFF; // PORTC is output
Pwm_Init(5000); // Initialize PWM module at 5KHz
Pwm_Start(); // Start PWM
while (1) {
// Slow down, allow us to see the change on LED:
for (i = 0; i < 20; i++) Delay_us(500);
j++;
Pwm_Change_Duty(j); // Change duty ratio
}
}
Hardware Connection
PIC16F877A
+5V
MCLR/Vpp/THV RB7/PGD
RA0/AN0 RB6/PGC
10K
RA1/AN1 RB5
RA2/AN2/Vref- RB4
RA3/AN3/Vref+ RB3/PGM
RA4/TOCKI RB2
RA5/AN4 RB1
RE0/RD/AN5 RB0/INT
Reset
RE1/WR/AN6 Vdd
+5V
RE2/CS/AN7 Vss
Vdd RD7/PSP7
Vss RD6/PSP6
OSC1 RD5/PSP5
OSC2 RD4/PSP4
RCO/T1OSO RC7/RX/DT
RC1/T1OSI RC6/TX/CK
RC2/CCP1 RC5
RC3 RC4
330R
page
242
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
RS-485 Library
RS-485 is a multipoint communication which allows multiple devices to be con-
nected to a single signal cable. mikroC provides a set of library routines to provide
you comfortable work with RS-485 system using Master/Slave architecture.
Master and Slave devices interchange packets of information, each of these pack-
ets containing synchronization bytes, CRC byte, address byte, and the data. Each
Slave has its unique address and receives only the packets addressed to it. Slave
can never initiate communication. It is programmer’s responsibility to ensure that
only one device transmits via 485 bus at a time.
Note: Address 50 is the common address for all Slaves (packets containing
address 50 will be received by all Slaves). The only exceptions are Slaves with
addresses 150 and 169, which require their particular address to be specified in the
packet.
Library Routines
RS485Master_Init
RS485Master_Receive
RS485Master_Send
RS485Slave_Init
RS485Slave_Receive
RS485Slave_Send
page
243
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
RS485Master_Init
Example RS485Master_Init();
RS485Master_Receive
Description Receives any message sent by Slaves. Messages are multi-byte, so this function must be
called for each byte received (see the example at the end of the chapter). Upon receiving
a message, buffer is filled with the following values:
Function automatically adjusts data[4] and data[5] upon every received message.
These flags need to be cleared from the program.
page
244
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
RS485Master_Send
Description Sends data from buffer to Slave(s) specified by address via RS-485; datalen is a
number of bytes in message (1 <= datalen <= 3).
It is programmer’s responsibility to ensure (by protocol) that only one device sends data
via 485 bus at a time.
RS485Slave_Init
Description Initializes MCU as Slave with a specified address in RS-485 communication. Slave
address can take any value between 0 and 255, except 50, which is common address
for all slaves.
page
245
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
RS485Slave_Receive
Description Receives message addressed to it. Messages are multi-byte, so this function must be
called for each byte received (see the example at the end of the chapter). Upon receiving
a message, buffer is filled with the following values:
Function automatically adjusts data[4] and data[5] upon every received message.
These flags need to be cleared from the program.
RS485Slave_Send
Description Sends data from buffer to Master via RS-485; datalen is a number of bytes in mes-
sage (1 <= datalen <= 3).
It is programmer’s responsibility to ensure (by protocol) that only one device sends data
via 485 bus at a time.
page
246
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Library Example
The example demonstrates working with PIC as Slave nod in RS-485 communication. PIC
receives only packets addressed to it (address 160 in our example), and general messsages with
target address 50. The received data is forwarded to PORTB, and sent back to Master.
void interrupt() {
/* Every byte is received by RS485Slave_Read(dat);
If message is received without errors,
data[4] is set to 255 */
void main() {
TRISB = 0;
TRISD = 0;
Usart_Init(9600); // Initialize usart module
RS485Slave_Init(160); // Initialize MCU as Slave with address 160
PIE1.RCIE = 1; // Enable interrupt
INTCON.PEIE = 1; // on byte received
PIE2.TXIE = 0; // via USART (RS485)
INTCON.GIE = 1;
PORTB = 0;
PORTD = 0;
dat[4] = 0; // Ensure that msg received flag is 0
dat[5] = 0; // Ensure that error flag is 0
do {
if (dat[5]) PORTD = 0xAA; // If there is error, set PORTD to $AA
if (dat[4]) { // If message received:
dat[4] = 0; // Clear message received flag
j = dat[3]; // Number of data bytes received
for (i = 1; i < j; i++)
PORTB = dat[--i]; // Output received data bytes
dat[0]++; // Increment received dat[0]
RS485Slave_Write(dat, 1); // Send it back to Master
}
} while (1);
}//~!
page
247
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Hardware Connection
RA1/AN1 RB5
be connected to
RA2/AN2/Vref- RB4 +5V
RS485 line
RA3/AN3/Vref+ RB3/PGM
RA4/TOCKI RB2
RA5/AN4 RB1
10K
+5V
Reset
RE0/RD/AN5 RB0/INT
RE1/WR/AN6 Vdd
+5V
RE2/CS/AN7 Vss
R0 Vcc
Vdd RD7/PSP7
RE B
Vss RD6/PSP6
DE A
OSC1 RD5/PSP5 GND
DI
OSC2 RD4/PSP4
RCO/T1OSO RC7/RX/DT LTC485
4MHz
RC1/T1OSI RC6/TX/CK
RC2/CCP1 RC5
Shielded pair
RC3 RC4
less than 300m
RD0/PSP0 RD3/PSP3
long
RD1/PSP1 RD2/PSP2
4.7uF +5V
+
620R
C1+ Vcc R0 Vcc
+
4.7uF
V+ GND RE B
C1- T1out DE A
+
4.7uF
page
248
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
mikroC provides a library for accessing data on SD Card via SPI communication.
Library Routines
Sd_Init
Sd_Read_Sector
Sd_Write_Sector
Sd_Read_Cid
Sd_Read_Csd
Sd_Init
Description Initializes hardware SPI communication; parameters port and pin designate the CS line
used in the communication (parameter pin should be 0..7). The function returns 0 if SD
card is present and successfully initialized, otherwise returns 1. Sd_Init needs to be
called before using other functions of this library.
page
249
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Sd_Read_Sector
Description Function reads one sector (512 bytes) from SD card at sector address sector. Read
data is stored in the array data. Function returns 0 if read was successful, or 1 if an
error occurred.
Sd_Write_Sector
Returns Returns 0 if write was successful; returns 1 if there was an error in sending write com-
mand; returns 2 if there was an error in writing.
Description Function writes 512 bytes of data to SD card at sector address sector. Function returns 0
if write was successful, or 1 if there was an error in sending write command, or 2 if
there was an error in writing.
page
250
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Sd_Read_Cid
Description Function reads CID register and returns 16 bytes of content into
data_for_registers.
Sd_Read_Csd
Description Function reads CSD register and returns 16 bytes of content into
data_for_registers.
page
251
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Library Example
The following code tests SD library routines. First, we fill the buffer with 512 “M” characters and
write it to sector 56; then we repeat the sequence with character “E” at sector 56. Finally, we read
the sectors 55 and 56 to check if the write was successful.
unsigned i;
unsigned short tmp;
unsigned short data[512];
void main() {
Usart_Init(9600);
// Initialize ports
tmp = Sd_Init(&PORTC, 2);
}//~!
page
252
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Hardware Connection
+5V IC1
PIC18F458 MC33269-3.3 +3V3
+5V
MCLR/Vpp
IN OUT
RB7/PGD
GND
100nF
22uF
RA0/AN0/Cvref RB6/PGC + +
10K
RA1/AN1 RB5/PGM
RA2/AN2/Vref- RB4
RA3/AN3/Vref+ RB3/CANRX
RA4/TOCKI RB2/CANTX/INT2
RA5/AN4/SS/LVDIN RB1/INT1
RE0/AN5/RD/ RB0/INT0
Reset
RE1/AN6/WR/C1OUT Vdd
+5V
RE2/AN7/CS/C2OUT Vss
Vdd RD7/PSP7/P1D
Vss RD6/PSP6/P1C
SD
OSC1/CLKI
2K2
2K2
2K2
RD5/PSP5/P1B
OSC2/CLKO/RA6 RD4/PSP4/
ECCP1/P1A
RC0/T1OSO/T1CKI RC7/RX/DT /CS
3K3
3K3
RC3/SCK/SCL RC4/SDI/SDA
CLK
RD0/PSP0/C1IN+ RD3/PSP3/C2IN-
4MHz GND
RD1/PSP1/C1IN- RD2/PSP2/C2IN+ Data_OUT
page
253
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Library Routines
Soft_I2C_Config
Soft_I2C_Start
Soft_I2C_Read
Soft_I2C_Write
Soft_I2C_Stop
Soft_I2C_Config
Prototype void Soft_I2C_Config(char *port, const char SDI, const char SD0,
const char SCK);
Description Configures software I²C. Parameter port specifies port of MCU on which SDA and SCL
pins are located. Parameters SCL and SDA need to be in range 0–7 and cannot point at
the same pin.
Soft_I2C_Config needs to be called before using other functions from Soft I2C
Library.
page
254
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Soft_I2C_Start
Description Issues START signal. Needs to be called prior to sending and receiving data.
Requires Soft I²C must be configured before using this function. See Soft_I2C_Config.
Example Soft_I2C_Start();
Soft_I2C_Read
Description Reads one byte from the slave, and sends not acknowledge signal if parameter ack is 0,
otherwise it sends acknowledge.
Requires START signal needs to be issued in order to use this function. See Soft_I2C_Start.
page
255
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Soft_I2C_Write
Requires START signal needs to be issued in order to use this function. See Soft_I2C_Start.
Example Soft_I2C_Write(0xA3);
Soft_I2C_Stop
Requires START signal needs to be issued in order to use this function. See Soft_I2C_Start.
Example Soft_I2C_Stop();
page
256
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Library Example
void main() {
}//~!
page
257
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Library Routines
Soft_Spi_Config
Soft_Spi_Read
Soft_Spi_Write
Soft_Spi_Config
Prototype void Soft_Spi_Config(char *port, const char SDI, const char SD0,
const char SCK);
Description Configures and initializes software SPI. Parameter port specifies port of MCU on which
SDI, SDO, and SCK pins will be located. Parameters SDI, SDO, and SCK need to be in
range 0–7 and cannot point at the same pin.
Soft_Spi_Config needs to be called before using other functions from Soft SPI
Library.
Example This will set SPI to master mode, clock = 50kHz, data sampled at the middle of interval,
clock idle state low and data transmitted at low to high edge. SDI pin is RB1, SDO pin
is RB2 and SCK pin is RB3:
Soft_Spi_Config(PORTB, 1, 2, 3);
page
258
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Soft_Spi_Read
Requires Soft SPI must be initialized and communication established before using this function.
See Soft_Spi_Config.
Soft_Spi_Write
Requires Soft SPI must be initialized and communication established before using this function.
See Soft_Spi_Config.
Example Soft_Spi_Write(1);
page
259
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Library Example
This is a sample program which demonstrates the use of the Microchip's MCP4921 12-bit D/A converter
with PIC mcu's. This device accepts digital input (number from 0..4095) and transforms it to the output
voltage, ranging from 0..Vref. In this example the D/A is connected to PORTC and communicates with
PIC through the SPI. The reference voltage on the mikroElektronika's DAC module is 5 V. In this exam-
ple, the entire DAC’s resolution range (12bit ? 4096 increments) is covered, meaning that you’ll need to
hold a button for about 7 minutes to get from mid-range to the end-of-range.
void InitMain() {
Soft_SPI_Config(&PORTB, 4,5,3);
TRISB &= ~(_CHIP_SELECT); // ClearBit(TRISC,CHIP_SELECT);
TRISC = 0x03;
}//~
// DAC increments (0..4095) --> output voltage (0..Vref)
void DAC_Output(unsigned valueDAC) {
char temp;
PORTB &= ~(_CHIP_SELECT); // ClearBit(PORTC,CHIP_SELECT);
temp = (valueDAC >> 8) & 0x0F; // Prepare hi-byte for transfer
temp |= 0x30; // It's a 12-bit number, so only
Soft_Spi_Write(temp); // lower nibble of high byte is used
temp = valueDAC; // Prepare lo-byte for transfer
Soft_Spi_Write(temp);
PORTB |= _CHIP_SELECT; // SetBit(PORTC,CHIP_SELECT);
}//~
void main() {
InitMain();
DAC_Output(2048); // When program starts, DAC gives
value = 2048; // the output in the mid-range
while (1) { // Main loop
if ((Button(&PORTC,0,1,1)==_TRUE) // Test button on B0 (increment)
&& (value < 4095)) {
value++ ;
} else {
if ((Button(&PORTC,1,1,1)==_TRUE) // If RB0 is not active then test
&& (value > 0)) { // RB1 (decrement)
value-- ;
}
}
DAC_Output(value); // Perform output
Delay_ms(100); // Slow down key repeat pace
}
}//~!
page
260
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Library Routines
Soft_Uart_Init
Soft_Uart_Read
Soft_Uart_Write
Soft_Uart_Init
Description Initalizes software UART. Parameter port specifies port of MCU on which RX and TX
pins are located; parameters rx and tx need to be in range 0–7 and cannot point at the
same pin; baud_rate is the desired baud rate. Maximum baud rate depends on PIC’s
clock and working conditions. Parameter inverted, if set to non-zero value, indicates
inverted logic on output.
Soft_Uart_Init needs to be called before using other functions from Soft UART
Library.
page
261
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Soft_Uart_Read
Description Function receives a byte via software UART. Parameter error will be zero if the
transfer was successful. This is a non-blocking function call, so you should test the
error manually (check the example below).
Requires Soft UART must be initialized and communication established before using this func-
tion. See Soft_Uart_Init.
do
data = Soft_Uart_Read(&error);
while (error);
Soft_Uart_Write
Requires Soft UART must be initialized and communication established before using this func-
tion. See Soft_Uart_Init.
Be aware that during transmission, software UART is incapable of receiving data – data
transfer protocol must be set in such a way to prevent loss of information.
page
262
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Library Example
The example demonstrates simple data exchange via software UART. When PIC
MCU receives data, it immediately sends the same data back. If PIC is connected
to the PC (see the figure below), you can test the example from mikroC terminal
for RS232 communication, menu choice Tools > Terminal.
void main() {
er = &ro;
do {
do {
data = Soft_Uart_Read(er); // Receive data
} while (*er);
Soft_Uart_Write(data); // Send data via UART
} while (1);
}//~!
page
263
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Sound Library
mikroC provides a Sound Library which allows you to use sound signalization in
your applications. You need a simple piezo speaker (or other hardware) on desig-
nated port.
Library Routines
Sound_Init
Sound_Play
Sound_Init
Description Prepares hardware for output at specified port and pin. Parameter pin needs to be within
range 0–7.
Sound_Play
Description Plays the sound at the specified port and pin (see Sound_Init). Parameter period_div_10
is a sound period given in MCU cycles divided by ten, and generated sound lasts for a
specified number of periods (num_of_periods).
Requires To hear the sound, you need a piezo speaker (or other hardware) on designated port.
Also, you must call Sound_Init to prepare hardware for output.
Example To play sound of 1KHz: T = 1/f = 1ms = 1000 cycles @ 4MHz. This gives us our first
parameter: 1000/10 = 100. Play 150 periods like this:
Sound_Play(100, 150);
page
264
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Library Example
The example is a simple demonstration of how to use sound library for playing
tones on a piezo speaker. The code can be used with any MCU that has PORTB
and ADC on PORTA. Sound frequencies in this example are generated by reading
the value from ADC and using the lower byte of the result as base for T (f = 1/T).
int adcValue;
void main() {
page
265
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
SPI Library
SPI module is available with a number of PIC MCU models. mikroC provides a
library for initializing Slave mode and comfortable work with Master mode. PIC
can easily communicate with other devices via SPI: A/D converters, D/A convert-
ers, MAX7219, LTC1290, etc. You need PIC MCU with hardware integrated SPI
(for example, PIC16F877).
Note: This library supports module on PORTB or PORTC, and will not work with
modules on other ports. Examples for PICmicros with module on other ports can
be found in your mikroC installation folder, subfolder “Examples”.
Library Routines
Spi_Init
Spi_Init_Advanced
Spi_Read
Spi_Write
Spi_Init
Default settings are: Master mode, clock Fosc/4, clock idle state low, data transmitted on
low to high edge, and input data sampled at the middle of interval.
Example Spi_Init();
page
266
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Spi_Init_Advanced
Parameter mast_slav determines the work mode for SPI; can have the values:
The data_sample determines when data is sampled; can have the values:
Parameter clock_idle determines idle state for clock; can have the following values:
Example This will set SPI to master mode, clock = Fosc/4, data sampled at the middle of interval,
clock idle state low and data transmitted at low to high edge:
Spi_Init_Advanced(MASTER_OSC_DIV4, DATA_SAMPLE_MIDDLE,
CLK_IDLE_LOW, LOW_2_HIGH)
page
267
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Spi_Read
Description Provides clock by sending buffer and receives data at the end of period.
Requires SPI must be initialized and communication established before using this function. See
Spi_Init_Advanced or Spi_Init.
Spi_Write
Description Writes byte data to SSPBUF, and immediately starts the transmission.
Requires SPI must be initialized and communication established before using this function. See
Spi_Init_Advanced or Spi_Init.
Example Spi_Write(1);
page
268
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Library Example
The code demonstrates how to use SPI library functions. Assumed HW configura-
tion is: max7219 (chip select pin) connected to RC1, and SDO, SDI, SCK pins are
connected to corresponding pins of max7219.
char i;
void main() {
Spi_Init(); // Standard configuration
TRISC &= 0xFD;
max7219_init1(); // Initialize max7219
for (i = 1; i <= 8u; i++) {
PORTC &= 0xFD; // Select max7219
Spi_Write(i); // Send i to max7219 (digit place)
Spi_Write(8 - i); // Send i to max7219 (digit)
PORTC |= 2; // Deselect max7219
}
TRISB = 0;
PORTB = i;
}//~!
page
269
MikroElektronika: Development tools - Books - Compilers
page
270
HW Connection
MAX7219
DIN DOUT
DIG0 SEGD
DIG4 SEGDP
8. 8. 8. 8. 8. 8. 8. 8.
GND SEGE
DIG6 SEGC
DIG2 V+ +5V
10K
DIG3 ISET
DIG7 SEGG
PIC16F877A
10K
GND SEGB
DIG5 SEGF
DIG1 SEGA MCLR/Vpp/THV RB7/PGD
LOAD CLK RA0/AN0 RB6/PGC
RA1/AN1 RB5
Reset
RA2/AN2/Vref- RB4
mikroC - C Compiler for Microchip PIC microcontrollers
RA3/AN3/Vref+ RB3/PGM
RA4/TOCKI RB2
RA5/AN4 RB1 g f K a b
RE0/RD/AN5 RB0/INT
RE1/WR/AN6 Vdd a
+5V RE2/CS/AN7 Vss
Vdd RD7/PSP7
Vss RD6/PSP6 f b
RD5/PSP5
g
OSC1
OSC2 RD4/PSP4
RCO/T1OSO RC7/RX/DT
RC1/T1OSI RC6/TX/CK e c
4MHz
RC2/CCP1 RC5
RC3 RC4
RD0/PSP0 RD3/PSP3 d dp
RD1/PSP1 RD2/PSP2
e d K c dp
8
USART Library
USART hardware module is available with a number of PICmicros. mikroC
USART Library provides comfortable work with the Asynchronous (full duplex)
mode.You can easily communicate with other devices via RS232 protocol (for
example with PC, see the figure at the end of the topic – RS232 HW connection).
You need a PIC MCU with hardware integrated USART, for example PIC16F877.
Then, simply use the functions listed below.
Library Routines
Usart_Init
Usart_Data_Ready
Usart_Read
Usart_Write
Note: Certain PICmicros with two USART modules, such as P18F8520, require
you to specify the module you want to use. Simply append the number 1 or 2 to a
function name. For example, Usart_Write2();
Usart_Init
Description Initializes hardware USART module with the desired baud rate. Refer to the device data
sheet for baud rates allowed for specific Fosc. If you specify the unsupported baud rate,
compiler will report an error.
Usart_Init needs to be called before using other functions from USART Library.
page
271
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Usart_Data_Ready
Requires USART HW module must be initialized and communication established before using
this function. See Usart_Init.
Usart_Read
Description Function receives a byte via USART. Use the function Usart_Data_Ready to test if
data is ready first.
Requires USART HW module must be initialized and communication established before using
this function. See Usart_Init.
page
272
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Usart_Write
Requires USART HW module must be initialized and communication established before using
this function. See Usart_Init.
Library Example
The example demonstrates simple data exchange via USART. When PIC MCU
receives data, it immediately sends the same data back. If PIC is connected to the
PC (see the figure below), you can test the example from mikroC terminal for
RS232 communication, menu choice Tools > Terminal.
unsigned short i;
void main() {
do {
if (Usart_Data_Ready()) { // If data is received
i = Usart_Read(); // Read the received data
Usart_Write(i); // Send data via USART
}
} while (1);
}//~!
page
273
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Hardware Connection
PIC16F877A
4.7uF +5V +5V
+
MCLR/Vpp/THV RB7/PGD
RA0/AN0 RB6/PGC
10K
RA1/AN1 RB5
C1+ Vcc RA2/AN2/Vref- RB4
4.7uF
+ V+ GN
D RA3/AN3/Vref+ RB3/PGM
SUB-D 9-pin connector C1- T1out
RA4/TOCKI RB2
+
4.7uF
C2+ R1in
RA5/AN4 RB1
C2- R1out
RE0/RD/AN5 RB0/INT
Reset
1
6 V- T1in
2 RE1/WR/AN6 Vdd
7
T2out T2in +5V
3 RE2/CS/AN7 Vss
R2in R2out
8 Vdd RD7/PSP7
4.7uF
4
9 + Vss RD6/PSP6
5 MAX232
OSC1 RD5/PSP5
OSC2 RD4/PSP4
RCO/T1OSO RC7/RX/DT
serial cable RC1/T1OSI RC6/TX/CK
(1 to 1) RC2/CCP1 RC5
RC3 RC4
1
6 4MHz RD0/PSP0 RD3/PSP3
Receive data (Rx)
2
7 RD1/PSP1 RD2/PSP2
3 Send data (Tx)
8
4
9
5
page
274
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
mikroC includes a library for working with human interface devices via Universal
Serial Bus. A human interface device or HID is a type of computer device that
interacts directly with and takes input from humans, such as the keyboard, mouse,
graphics tablet, and the like.
Library Routines
Hid_Enable
Hid_Read
Hid_Write
Hid_Disable
Hid_Enable
Description Enables USB HID communication. Parameters readbuff and writebuff are the Read
Buffer and the Write Buffer, respectively, which are used for HID communication.
This function needs to be called before using other routines of USB HID Library.
page
275
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Hid_Read
Description Receives message from host and stores it in the Read Buffer. Function returns the num-
ber of characters received in Read Buffer.
Requires USB HID needs to be enabled before using this function. See Hid_Enable.
Hid_Write
Description Function sends data from wrbuff to host. Write Buffer is the same parameter as used in
initialization. Parameter len should specify a length of the data to be transmitted.
Requires USB HID needs to be enabled before using this function. See Hid_Enable.
Hid_Disable
Requires USB HID needs to be enabled before using this function. See Hid_Enable.
Example Hid_Disable();
page
276
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Library Example
The following example continually sends sequence of numbers 0..255 to the PC via Universal
Serial Bus.
unsigned short m, k;
unsigned short userRD_buffer[64];
unsigned short userWR_buffer[64];
void interrupt() {
asm CALL _Hid_InterruptProc
asm nop
}//~
void Init_Main() {
// Disable all interrupts
// Disable GIE, PEIE, TMR0IE, INT0IE,RBIE
INTCON = 0;
INTCON2 = 0xF5;
INTCON3 = 0xC0;
// Disable Priority Levels on interrupts
RCON.IPEN = 0;
PIE1 = 0; PIE2 = 0; PIR1 = 0; PIR2 = 0;
// Ports Configuration
TRISA = 0; TRISB = 0; TRISC = 0xFF; TRISD = 0xFF; TRISE = 0x07;
LATA = 0; LATB = 0; LATC = 0; LATD = 0; LATE = 0;
page
277
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
// Timer 0
T0CON = 0x07;
TMR0H = (65536-156) >> 8;
TMR0L = (65536-156) & 0xFF;
INTCON.T0IE = 1; // Enable T0IE
T0CON.TMR0ON = 1;
}//~
void main() {
Init_Main();
Hid_Enable(&userRD_buffer, &userWR_buffer);
do {
for (k = 0; k < 255; k++) {
// Prepare send buffer
userWR_buffer[0] = k;
Hid_Disable();
}//~!
page
278
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
HW Connection
PIC18F4550
+5V
MCLR/Vpp/RE3 RB7/KBI3/PGD
RA0/AN0 RB6/KBI2/PGC
10K
RA1/AN1 RB5/KBI1/PGM
RB4/AN11/
RA2/AN2/Vref-
KBI0/CSSPP
RA3/AN3/Vref+ RB3/AN9/CCP2/VPO
RA4/TOCKI /
RB2/AN8/INT2/VMO
C1OUT/RCV
RA5/AN4/SS/ RB1/AN10/INT1/
HLVDIN/C2OUT SCK/SCL
RB0/AN12/INT0/
RE0/AN5/CK1SPP
Reset
FLT0/SDI/SDA
RE1/AN6/CK2SPP Vdd
+5V
RE2/AN7/OESPP Vss
Vdd RD7/SPP7/P1D
Vss RD6/SPP6/P1C
OSC1/CLKI RD5/SPP5/P1B
OSC2/CLKO/RA6 RD4/SPP4
+5V CN4
RC0/T1OSO/T13CKI RC7/RX/DT/SDO
Vcc
RC1/T1OSI/CCP2/UOE RC6/TX/CK D-
RC2/CCP1/P1A RC5/D+/VP D+
Vusb RC4/D-/VM GND
100nF
page
279
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Util Library
Util library contains miscellaneous routines useful for project development.
Button
Prototype char Button(char *port, char pin, char time, char active_state);
Description Function eliminates the influence of contact flickering upon pressing a button (debounc-
ing).
Parameters port and pin specify location of the button; parameter time specifies the
minimum time pin has to be in active state in order to return TRUE; parameter
active_state can be either 0 or 1, and it determines if button is active upon logical
zero or logical one.
Example Example reads RB0, to which the button is connected; on transition from 1 to 0 (release
of button), PORTD is inverted:
do {
if (Button(&PORTB, 0, 1, 1)) oldstate = 1;
if (oldstate && Button(&PORTB, 0, 1, 0)) {
PORTD = ~PORTD;
oldstate = 0;
}
} while(1);
page
280
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Note: Not all of the standard functions have been included. Functions have been
implemented according to the ANSI C standard, but certain functions have been
modified in order to facilitate PIC programming.
Library Routines
isalnum
isalpha
iscntrl
isdigit
isgraph
islower
isprint
ispunct
isspace
isupper
isxdigit
toupper
tolower
isalnum
Description Function returns 1 if the character is alphanumeric (A-Z, a-z, 0-9), otherwise returns
zero.
page
281
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
isalpha
Description Function returns 1 if the character is alphabetic (A-Z, a-z), otherwise returns zero.
iscntrl
Description Function returns 1 if the character is a control character or delete (decimal 0-31 and
127), otherwise returns zero.
isdigit
Description Function returns 1 if the character is a digit (0-9), otherwise returns zero.
isgraph
Description Function returns 1 if the character is a printable character, excluding the space (deci-
mal 32), otherwise returns zero.
page
282
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
islower
Description Function returns 1 if the character is a lowercase letter (a-z), otherwise returns zero.
isprint
Description Function returns 1 if the character is printable (decimal 32-126), otherwise returns
zero.
ispunct
Description Function returns 1 if the character is punctuation (decimal 32-47, 58-63, 91-96, 123-
126), otherwise returns zero.
isspace
Description Function returns 1 if the character is white space (space, CR, HT, VT, NL, FF), other-
wise returns zero.
page
283
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
isupper
Description Function returns 1 if the character is an uppercase letter (A-Z), otherwise returns 0.
isxdigit
Description Function returns 1 if the character is a hex digit (0-9, A-F, a-f), otherwise returns
zero.
toupper
Description If the character is a lowercase letter (a-z), function returns an uppercase letter.
Otherwise, function returns an unchanged input parameter.
tolower
Description If the character is an uppercase letter (A-Z), function returns a lowercase letter.
Otherwise, function returns an unchanged input parameter.
page
284
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Note: Functions have been implemented according to the ANSI C standard, but
certain functions have been modified in order to facilitate PIC programming.
Library Routines
acos
asin
atan
atan2
ceil
cos
cosh
exp
fabs
floor
frexp
ldexp
log
log10
modf
pow
sin
sinh
sqrt
tan
tanh
acos
Description Function returns the arc cosine of parameter x; that is, the value whose cosine is x.
Input parameter x must be between -1 and 1 (inclusive). The return value is in radians,
between 0 and pi (inclusive).
page
285
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
asin
Description Function returns the arc sine of parameter x; that is, the value whose sine is x. Input
parameter x must be between -1 and 1 (inclusive). The return value is in radians,
between -pi/2 and pi/2 (inclusive).
atan
Description Function computes the arc tangent of parameter x; that is, the value whose tangent is x.
The return value is in radians, between -pi/2 and pi/2 (inclusive).
atan2
Description This is the two argument arc tangent function. It is similar to computing the arc tangent
of y/x, except that the signs of both arguments are used to determine the quadrant of
the result, and x is permitted to be zero. The return value is in radians, between -pi and
pi (inclusive).
ceil
Description Function returns value of parameter num rounded up to the next whole number.
page
286
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
cos
Description Function returns the cosine of x in radians. The return value is from -1 to 1.
cosh
exp
Description Function returns the value of e — the base of natural logarithms — raised to the power
of x (i.e. ex).
fabs
page
287
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
floor
Description Function returns value of parameter num rounded down to the nearest integer.
frexp
Description Function splits a floating-point value num into a normalized fraction and an integral
power of 2. Return value is the normalized fraction, and the integer exp is stored in the
object pointed to by exp.
ldexp
Description Function returns the result of multiplying the floating-point number num by 2 raised to
the power exp (i.e. returns x*2exp).
log
page
288
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
log10
modf
Description Function returns the signed fractional component of num, placing its whole number
component into the variable pointed to by whole.
pow
Description Function returns the value of x raised to the power of y (i.e. xy). If the x is negative,
function will automatically cast the y into unsigned long.
sin
Description Function returns the sine of x in radians. The return value is from -1 to 1.
page
289
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
sinh
Description Function returns the hyperbolic sine of x, defined mathematically as (ex-e-x)/2. If the
value of x is too large (if overflow occurs), the function fails.
sqrt
tan
Description Function returns the tangent of x in radians. The return value spans the allowed range of
floating point in mikroC.
tan
page
290
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Note: Not all of the standard functions have been included. Functions have been
implemented according to the ANSI C standard, but certain functions have been
modified in order to facilitate PIC programming.
Library Routines
abs
atof
atoi
atol
div
ldiv
labs
max
min
rand
srand
xtoi
abs
atof
Description Function converts the input string s into a double precision value, and returns the value.
Input string s should conform to the floating point literal format, with an optional white-
space at the beginning. The string will be processed one character at a time, until the
function reaches a character which it doesn’t recognize (this includes a null character).
page
291
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
atoi
Description Function converts the input string s into an integer value, and returns the value. Input
string s should consist exclusively of decimal digits, with an optional whitespace and a
sign at the beginning. The string will be processed one character at a time, until the
function reaches a character which it doesn’t recognize (this includes a null character).
atol
Description Function converts the input string s into a long integer value, and returns the value.
Input string s should consist exclusively of decimal digits, with an optional whitespace
and a sign at the beginning. The string will be processed one character at a time, until
the function reaches a character which it doesn’t recognize (this includes a null charac-
ter).
div
Description Function computes the result of the division of the numerator numer by the denominator
denom; function returns a structure of type div_t comprising quotient (quot) and
remainder (rem).
page
292
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
ldiv
Description Function is similar to the div function, except that the arguments and the result struc-
ture members all have type long.
Function computes the result of the division of the numerator numer by the denominator
denom; function returns a structure of type div_t comprising quotient (quot) and
remainder (rem).
labs
Description Function returns the absolute (i.e. positive) value of a long integer num.
max
min
page
293
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
rand
Description Function returns a sequence of pseudo-random numbers between 0 and 32767. Function
will always produce the same sequence of numbers unless srand() is called to seed the
starting point.
srand
Description Function uses the seed as a starting point for a new sequence of pseudo-random num-
bers to be returned by subsequent calls to rand(). No values are returned by this func-
tion.
xtoi
Description Function converts the input string s consisting of hexadecimal digits into an integer
value. Input parametes s should consist exclusively of hexadecimal digits, with an
optional whitespace and a sign at the beginning. The string will be processed one char-
acter at a time, until the function reaches a character which it doesn’t recognize (this
includes a null character).
page
294
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Note: Not all of the standard functions have been included. Functions have been
implemented according to the ANSI C standard, but certain functions have been
modified in order to facilitate PIC programming.
Library Routines
memcmp
memcpy
memmove
memset
strcat
strchr
strcmp
strcpy
strlen
strncat
strncpy
strspn
memcmp
Description Function compares the first n characters of objects pointed to by s1 and s2, and returns
zero if the objects are equal, or returns a difference between the first differing characters
(in a left-to-right evaluation). Accordingly, the result is greater than zero if the object
pointed to by s1 is greater than the object pointed to by s2, and vice versa.
page
295
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
memcmp
Description Function copies n characters from the object pointed to by s2 into the object pointed to
by s1. Objects may not overlap. Function returns the value of s1.
memmove
Description Function copies n characters from the object pointed to by s2 into the object pointed to
by s1. Unlike with memcpy(), memory areas s1 and s2 may overlap. Function returns
the value of s1.
memset
Description Function copies the value of character c (converted to char) into each of the first n
characters of the object pointed by s. Function returns the value of s.
strcat
Description Function appends the string s2 to the string s1, overwriting the null character at the end
of s1. Then, a terminating null character is added to the result. Strings may not overlap,
and s1 must have enough space to store the result. Function returns a resulting string
s1.
page
296
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
strchr
Description Function locates the first occurrence of character c in the string s. Function returns a
pointer to the c, or a null pointer if c does not occur in s. The terminating null character
is considered to be a part of the string.
strcmp
Description Function compares strings s1 and s2, and returns zero if the strings are equal, or returns
a difference between the first differing characters (in a left-to-right evaluation).
Accordingly, the result is greater than zero if s1 is greater than s2, and vice versa.
strcpy
Description Function copies the string s2 into the string s1. If successful, function returns s1. The
strings may not overlap.
strlen
Description Function returns the length of the string s (the terminating null character does not count
against string’s length).
page
297
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
strncat
Description Function appends not more than n characters from the string s2 to s1. The initial char-
acter of s2 overwrites the null character at the end of s1. A terminating null character is
always appended to the result. Function returns s1.
strncpy
Description Function copies not more than n characters from string s2 to s1. The strings may not
overlap. If s2 is shorter than n characters, then s1 will be padded out with null charac-
ters to make up the difference. Function returns the resulting string s1.
strspn
Description Function returns the length of the maximum initial segment of s1 which consists entire-
ly of characters from s2. The terminating null character character at the end of the string
is not compared.
page
298
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Conversions Library
mikroC Conversions Library provides routines for converting numerals to strings,
and routines for BCD/decimal conversions.
Library Routines
You can get text representation of numerical value by passing it to one of the fol-
lowing routines:
ByteToStr
ShortToStr
WordToStr
IntToStr
LongToStr
FloatToStr
Following functions convert decimal values to BCD (Binary Coded Decimal) and
vice versa:
Bcd2Dec
Dec2Bcd
Bcd2Dec16
Dec2Bcd16
ByteToStr
Description Function creates an output string out of a small unsigned number (numerical value
less than 0x100). Output string has fixed width of 3 characters; remaining positions on
the left (if any) are filled with blanks.
page
299
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
ShortToStr
Description Function creates an output string out of a small signed number (numerical value less
than 0x100). Output string has fixed width of 4 characters; remaining positions on the
left (if any) are filled with blanks.
WordToStr
Description Function creates an output string out of an unsigned number (numerical value of
unsigned type). Output string has fixed width of 5 characters; remaining positions on
the left (if any) are filled with blanks.
IntToStr
Description Function creates an output string out of a signed number (numerical value of int
type). Output string has fixed width of 6 characters; remaining positions on the left (if
any) are filled with blanks.
page
300
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
LongToStr
Description Function creates an output string out of a large signed number (numerical value of
long type). Output string has fixed width of 11 characters; remaining positions on the
left (if any) are filled with blanks.
FloatToStr
Description Function creates an output string out of a floating-point number. The output string
contains a normalized format of the number (mantissa between 0 and 1) with sign at the
first position. Mantissa has fixed format of six digits, 0.ddddd; i.e. there will always be
5 digits following the dot. The output string must be at least 13 characters long.
Bcd2Dec
page
301
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Dec2Bcd
Bcd2Dec16
Example unsigned a;
...
a = Bcd2Dec16(1234); // equals 4660
Dec2Bcd16
Example unsigned a;
...
a = Dec2Bcd16(4660); // equals 1234
page
302
MikroElektronika: Development tools - Books - Compilers
mikroC
making it simple... mikroC - C Compiler for Microchip PIC microcontrollers
Trigonometry Library
mikroC implements fundamental trigonometry functions. These functions are
implemented as lookup tables, and return the result as integer, multiplied by 1000
and rounded up.
Library Routines
SinE3
CosE3
SinE3
Returns Function returns the sine of input parameter, multiplied by 1000 (1E3) and rounded up
to the nearest integer. The range of return values is from -1000 to 1000.
Description Function takes parameter angle_deg which represents angle in degrees, and returns its
sine multiplied by 1000 and rounded up to the nearest integer. The function is imple-
mented as a lookup table; maximum error obtained is ±1.
CosE3
Returns Function returns the cosine of input parameter, multiplied by 1000 (1E3) and rounded
up to the nearest integer. The range of return values is from -1000 to 1000.
Description Function takes parameter angle_deg which represents angle in degrees, and returns its
cosine multiplied by 1000 and rounded up to the nearest integer. The function is imple-
mented as a lookup table; maximum error obtained is ±1.
page
303
MikroElektronika: Development tools - Books - Compilers
mikroC
mikroC - C Compiler for Microchip PIC microcontrollers making it simple...
Contact us:
If you are experiencing problems with any of our products or you just want addi-
tional information, please let us know.
If you are experiencing any trouble with mikroC, please do not hesitate to con-
tact us - it is in our mutual interest to solve these issues.
If you want to report a delay in delivery or any other problem concerning distri-
bution of our products, please use the link given below.
Other
If you have any other question, comment or a business proposal, please contact
us:
mikroElektronika
Admirala Geprata 1B
11000 Belgrade
EUROPE
page
304
MikroElektronika: Development tools - Books - Compilers