Mikropascal Manual
Mikropascal Manual
mikroPASCAL
Making it simple
ICD
IN-CIRCUIT
PIC12, PIC16, and PIC18).
Highly sophisticated IDE provides the power you need with the
simplicity of a Windows based point-and-click environment.
DEBUGGER
With useful implemented tools, many practical code examples,
broad set of built-in routines, and a comprehensive Help,
SUPPORTED mikroPascal makes a fast and reliable tool, which can satisfy
from V6.0 needs of experienced engineers and beginners alike.
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Reader’s note
DISCLAIMER:
mikroPascal 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
copyrighted material (e.g., a book). The manual and the compiler may not be copied, par-
tially or as a whole without the written consent from the mikroElektronika. 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 mikroPascal compiler, you agree to the terms of this agreement. Only one
person may use licensed version of mikroPascal compiler at a time.
Copyright © mikroElektronika 2003 - 2006.
This manual covers mikroPascal version 6.0.2 and the related topics. New 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.mikroe.com
E-mail: office@mikroe.com
page
ii
mikroElektronika: Development tools - Books - Compilers
mikr oPascal User ’s manual
Table of Contents
Quick Overview 1
Code Editor 3
Code Explorer 6
Debugger 7
Error Window 10
Statistics 11
Integrated Tools 14
Keyboard Shortcuts 17
Projects 20
Source Files 21
Search Paths 21
Managing Source Files 21
Compilation 23
Output Files 23
Assembly View 23
Error Messages 24
PIC Specifics 28
mikroPascal Specifics 30
Predefined Globals and Constants 30
Accessing Individual Bits 30
Interrupts 31
Linker Directives 32
Code Optimization 34
mikro ICD (In-Circuit Debugger) 35
mikro ICD Debugger Options 37
mikro ICD Debugger Example 38
mikro ICD Overview 42
Lexical Elements 44
Whitespace 44
Comments 45
Tokens 46
page
iv
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Literals 47
Integer Literals 47
Floating Point Literals 47
Character Literals 48
String Literals 48
Keywords 49
Identifiers 50
Punctuators 51
Program Organization 53
Scope and Visibility 56
Units 57
Uses Clause 57
Main Unit 58
Other Units 59
Variables 60
Constants 61
Labels 62
Functions and Procedures 63
Functions 63
Procedures 64
Types 66
Simple Types 67
Arrays 68
Multi-Dimnesional Arrays 69
Strings 70
Pointers 72
Records 73
Types Conversions 75
Implicit Conversion 75
Explicit Conversion 76
Arithmetic Conversion 77
Operators 78
Precedence and Associativity 78
Arithmetic Operators 79
Relational Operators 80
Bitwise Operators 81
Expressions 85
Statements 86
asm Statement 86
Migration from older versions 87
Assignment Statements 88
Compound Statements 88
Conditional Statements 89
Iteration Statements 91
Jump Statements 93
page
mikroElektronika: Development tools - Books - Compilers
v
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Compiler Directives 96
page
vi
mikroElektronika: Development tools - Books - Compilers
CHAPTER
1
mikroPascal IDE
QUICK OVERVIEW
Watch
Window
Code
Explorer
Code
Editor
Error
Window
Code Breakpoints
Assistant Window
- Write your Pascal source code using the highly advanced Code Editor
- 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
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
CODE EDITOR
The Code Editor is advanced text editor fashioned to satisfy the needs of profes-
sionals. 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 te Editor Settings dialog. To access the
settings, click Tools > Options from the drop-down menu, or click the Tools icon.
Tools Icon.
page
mikroElektronika: Development tools - Books - Compilers
3
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
If you type first few letter of a word and then press CTRL+SPACE, all valid iden-
tifiers matching the letters you typed will be prompted to you 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 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 valid function or procedure
precedes the parenthesis, then the expected parameters will be prompted to you in
a floating panel. As you type the actual parameter, 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 Editor will automatically generate
code. Or you can click button from Code toolbar and select 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 the 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
mikroPASCAL
making it simple... mikroPASCAL - Pascal 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 from the Settings Toolbar, and then select the Auto Correct Tab. You
can also add your own preferences 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
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
mikroElektronika: Development tools - Books - Compilers
5
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
CODE EXPLORER
Code Explorer is placed to the left of the main window by default, and gives clear
view of every declared item in the source code. You can jump to declaration of
any item by right clicking it, or by clicking the Find Declaration icon. To expand
or collapse treeview in the Code Explorer, use the Collapse/Expand All icon.
Also, two more tab windows are available in the Code Explorer. QHelp Tab lists
all the available built-in and library functions, for a quick reference. Double-click-
Collapse/Expand ing a routine in QHelp Tab opens the relevant Help topic. Keyboard Tab lists all
All Icon. available keyboard shortcuts in mikroPascal.
page
6
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
DEBUGGER
Source-level Debugger is an integral component of mikroPascal development
environment. It is designed to simulate operations of Microchip Technology's
PICmicros and to assist users in debugging software written for these devices.
Start Debugger.
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 Debugger by
selecting Run > Debug from the drop-down menu, or by clicking 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
mikroElektronika: Development tools - Books - Compilers
7
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Watch Window
Debugger Watch Window is the main Debugger window which allows you to
monitor program items while running your program. To show the Watch Window,
select View > Debug Windows > Watch Window from the drop-down menu.
The Watch Window displays variables and registers of PIC, with their addresses
and values. Values are updated as you go through the simulation. Use the drop-
down menu to add and remove the items that you want to monitor. Recently
changed items are colored red.
Double clicking an item opens the Edit Value window in which you can assign a
new value to the selected variable/register. Also, you can change view to binary,
hex, char, or decimal for the selected item.
page
8
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal 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 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.
The View RAM Window displays the map of PIC’s RAM, with recently changed
items colored red. You can change value of any field by double-clicking it.
page
mikroElektronika: Development tools - Books - Compilers
9
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
ERROR WINDOW
In case that errors were encountered during compiling, compiler will report them
and won't generate a hex file. The Error Window will be prompted at the bottom
of the main window.
The Error Window is located under message tab, and displays location and type of
errors compiler has encountered. The compiler also reports warnings, but these do
not affect generating hex code. 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
10
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
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
mikroElektronika: Development tools - Books - Compilers
11
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
size, start and end address, calling frequency, return type, etc.
page
12
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
RAM Window
Summarizes all GPR and SFR registers and their addresses. It also displays sym-
bolic names of variables and their addresses.
ROM Window
Lists op-codes and their addresses in form of a human readable hex code.
page
mikroElektronika: Development tools - Books - Compilers
13
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
INTEGRATED TOOLS
USART Terminal
mikroPascal 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
14
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
EEPROM Editor
EEPROM Editor allows you to easily manage EEPROM of PIC microcontroller.
page
mikroElektronika: Development tools - Books - Compilers
15
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
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
16
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
KEYBOARD SHORTCUTS
Below is the complete list of keyboard shortcuts available in mikroPascal IDE.
You can also view keyboard shortcuts in the Code Explorer, tab Keyboard.
IDE Shortcuts
F1 Help
CTRL+SHIFT+E Edit Project
Ctrl+N New Unit
Ctrl+O Open
SHIFT+F9 Build all
Ctrl+F9 Compile
F11 Program
F12 Options
CTRL+F11 Compile and program
Ctrl+Shift+F5 View breakpoints
page
mikroElektronika: Development tools - Books - Compilers
17
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Debugger Shortcuts
F4 Run to Cursor
F5 Toggle Breakpoint
F6 Run/Pause Debugger
F7 Step into
F8 Step over
Ctrl+F8 Step out
F9 Debug
F2 Jump to Interrupt
Ctrl+F2 Reset
Ctrl+F5 Add to watch
page
18
mikroElektronika: Development tools - Books - Compilers
CHAPTER
2
Building
Applications
Creating applications in mikroPascal 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.
mikroPascal allows you to distribute your projects in as many units as you find
appropriate. 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 mikroBasic or mikroC!
PROJECTS
mikroPascal organizes applications into projects, consisting of a single project file
(extension .ppp) and one or more source files (extension .ppas). You can com-
pile 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 mikroPascal will create
the appropriate project file.
Also, an empty source file named after the project will be created by default.
mikroPascal does not require you to have source file named same as the project,
it’s just a matter of convenience.
Editing Project
Edit Project. Later, you can change project settings from the drop-down menu Project > Edit.
You can add or remove source files from project, 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.
page
20
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
SOURCE FILES
Source files containing Pascal code should have the extension .ppas. List of
source files relevant for the application is stored in project file with extension
.ppp, along with other project information. You can compile source files only if
they are part of a project.
Search Paths
You can specify your own custom search paths. This can be configured by select-
ing Tools > Options from the drop-down menu and Compiler > Search Paths.
When including source files with the uses clause, mikroPascal will look for the
file in following locations, in this particular order:
Select File > New from the 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 the 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 .ppas, is created automatically. mikroPascal does not require
you to have source file named same as the project, it’s just a matter of conven-
ience.
page
mikroElektronika: Development tools - Books - Compilers
21
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Open File. Select File > Open from the drop-down menu, or press CTRL+O, or click the
Open 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.
Print File.
Make sure that window containing the file you want to print is the active window.
Select File > Print from the drop-down menu, or press CTRL+P, or click the Print
icon. In the Print Preview Window, set the desired layout of the document and
click the OK button. The file will be printed on the selected printer.
Saving File
Save File.
Make sure that window containing the file you want to save is the active window.
Select File > Save from the drop-down menu, or press CTRL+S, or click the Save
icon. The file will be saved under the name on its window.
Save File As. Make sure that window containing the file you want to save is the active window.
Select File > Save As from the 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 the 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
22
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
COMPILATION
When you have created the project and written the source code, you will want to
compile it. Select Project > Build from the drop-down menu, or click the Build
Build Icon. Icon, or 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,
mikroPascal will generate output files.
Output Files
Upon successful compilation, mikroPascal will generate output files in the project
folder (folder which contains the project file .ppp). Output files are summarized
below:
Assembly View
After compiling your program in mikroPascal, you can click the View Assembly
Icon or select Project > View Assembly from the drop-down menu to review gen-
View Assembly erated assembly code (.asm file) in a new tab window. The assembler is human
Icon. readable with symbolic 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
mikroElektronika: Development tools - Books - Compilers
23
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
ERROR MESSAGES
Error Messages
page
24
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Hint: Variable "%s" has been declared, but was not used 1
Hint: Constant "%s" has been declared, but was not used 4
page
mikroElektronika: Development tools - Books - Compilers
25
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
page
26
mikroElektronika: Development tools - Books - Compilers
CHAPTER
3
mikroPascal
Language Reference
Why Pascal in the first place? The answer is simple: it is legible, easy-to-learn,
structured programming language, with sufficient power and flexibility needed for
programming microcontrollers. Whether you had any previous programming expe-
rience, you will find that writing programs in mikroPascal is very easy. This chap-
ter will help you learn or recollect Pascal syntax, along with the specifics of pro-
gramming PIC microcontrollers.
PIC SPECIFICS
In order to get the most from your mikroPascal compiler, you should be familiar
with certain aspects of PIC MCU. This knowledge is not essential, but it can pro-
vide 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 mikroPascal is capable of
handling 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 mikroPascal 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
28
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
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.
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
mikroElektronika: Development tools - Books - Compilers
29
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
mikroPascal SPECIFICS
Predefined Globals and Constants
All PIC SFR registers are implicitly declared as global variables of byte type, and
are visible in the entire project. When creating a project, mikroPascal will include
an appropriate .def file, containing declarations of available SFR and constants
(such as PORTB, TMR1, etc). Identifiers are all in uppercase, identical to nomen-
clature in Microchip datasheets. For the complete set of predefined globals and
constants, look for “Defs” in your mikroPascal installation folder, or probe the
Code Assistant for specific letters (CTRL+SPACE in Editor).
mikroPascal allows you to access individual bits of variables. Simply use the dot
(.) with a variable, followed by a number. For example:
There is no need for any special declarations; this kind of selective access is an
intrinsic feature of mikroPascal and can be used anywhere in the code. Provided
you are familiar with the particular chip, you can access bits by their name (e.g.
INTCON.TMR0F).
page
30
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Interrupts
Note: mikroPascal does not support low priority interrupts; for PIC18 family,
interrupts must be of high priority.
Calling functions and procedures from within the interrupt routine is now possible.
The compiler takes care about the registers being used, both in "interrupt" and in
"begin" thread, and performs "smart" context-switching between the two, saving
only the registers that have been used in both threads.
The functions and procedures that don't have their own frame (no arguments and
local variables) can be called both from the interrupt and the "begin" thread.
Here is a simple example of handling the interrupts from TMR0 (if no other inter-
rupts are allowed):
procedure interrupt;
begin
counter := counter + 1;
TMR0 := 96;
INTCON := $20;
end;
page
mikroElektronika: Development tools - Books - Compilers
31
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Linker Directives
Directive absolute
Directive absolute specifies the starting address in RAM for variable. If variable
is multi-byte, higher bytes are stored at consecutive locations.
Be careful when using absolute directive, as you may overlap two variables by
mistake. For example:
Directive org
Note: Directive org can be applied to any routine except the interrupt procedure.
Interrupt will always be located at address $4 (or $8 for P18), Page0.
page
32
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Directive volatile
Typical volatile variables are: STATUS, TIMER0, TIMER1, PORTA, PORTB etc.
page
mikroElektronika: Development tools - Books - Compilers
33
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Code Optimization
Optimizer has been added to extend the compiler usability, cuts down the amount
of code generated and speed-up its execution. Main features are:
Constant folding
All expressions that can be evaluated in the compile time (i.e. are constant) are
being replaced by their result. (3 + 5 -> 8);
Constant propagation
When a constant value is being assigned to certain variable, the compiler recog-
nizes this and replaces the use of the variable in the code that follows by constant,
as long as variable's value remains unchanged.
Copy propagation
The compiler recognizes that two variables have same value and eliminates one of
them in the further code.
Value numbering
The compiler "recognize" if the two expressions yield the same result, and can
therefore eliminate the entire computation for one of them.
Stack allocation
Temporary registers ("Stacks") are being used more rationally, allowing for VERY
complex expressions to be evaluated with minimum stack consumption.
page
34
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
If you have appropriate hardware and software for using mikro ICD then you have
to upon completion of writing your program to choose between Release build
Type or ICD Debug build type.
After you choose ICD Debug build type it's time to compile your project. After
you have successfully compiled your project you must program PIC using F11
shortcut. After successful PIC programming you have to select mikro ICD by
selecting Debugger › Select Debugger › mikro ICD Debugger from the drop-
down menu.
page
mikroElektronika: Development tools - Books - Compilers
35
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
You can run the mikro ICD by selecting Run › Debug from the drop-down menu,
or by clicking 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 high-
lighted (blue by default). There is also notification about program execution and it
can be found on Watch Window (yellow status bar). Note that some functions take
time to execute, so running of program is indicated on Watch Window.
page
36
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Run/ Pause
Debugger
Run or pause Debugger. [F6]
page
mikroElektronika: Development tools - Books - Compilers
37
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Here is a step by step mikro ICD Debugger Example. First you have to write a
program. We will show how mikro ICD works using this example:
program LCD_demo;
var text : string[21];
i : byte;
begin
PORTD := $00;
TRISD := $00;
text := 'mikroElektronika';
Lcd_Init(PORTD);
Lcd_Cmd(LCD_CLEAR);
Lcd_Cmd(LCD_CURSOR_OFF);
for i:=1 to 17 do
Lcd_Chr(1,i,text[i-1]);
end.
page
38
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
We will debug program line by line. Pressing F8 we are executing code line by
line. It is recommended that user does not use Step Into [F7] and Step Over [F8]
over Delays routines and routines containing delays. Instead use Run to cursor
[F4] and Breakpoints functions.
All changes are read from PIC and loaded into Watch Window. Note that TRISD
changed its value from 255 to 0.
page
mikroElektronika: Development tools - Books - Compilers
39
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Step Into [F7] and Step Over [F8] are mikro ICD debugger functions that are used
in stepping mode. There is also Real-Time mode supported by mikro ICD.
Functions that are used in Real-Time mode are Run/ Pause Debugger [F6] and
Run to cursor [F4]. Pressing F4 goes to line selected by user. User just have to
select line with cursor and press F4, and code will be executed until selected line
is reached.
Run(Pause) Debugger [F6] and Toggle Breakpoints [F5] are mikro ICD debugger
functions that are used in Real-Time mode. Pressing F5 marks line selected by
user for breakpoint. F6 executes code until breakpoint is reached. After reaching
breakpoint Debugger halts. Here at our example we will use breakpoints for writ-
ing "mikroElektronika" on LCD char by char. Breakpoint is set on LCD_Chr and
program will stop everytime this function is reached. After reaching breakpoint we
must press F6 again for continuing program execution.
page
40
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Breakpoints has been separated into two groups. There are hardware and software
break points. Hardware breakpoints are placed in PIC and they provide fastest
debug. Number of hardware breakpoints is limited (1 for P16 and 1 or 3 for P18).
If all hardware brekpoints are used, next breakpoints that will be used are software
breakpoint. Those breakpoints are placed inside mikro ICD, and they simulate
hardware breakpoints. Software breakpoints are much slower than hardware break-
points. This differences between hardware and software differences are not visible
in mikro ICD software but their different timings are quite notable, so it is impor-
tant to know that there is two types of breakpoints.
page
mikroElektronika: Development tools - Books - Compilers
41
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Watch Window
Debugger Watch Window is the main Debugger window which allows you to
monitor program items while running your program. To show the Watch Window,
select View › Debug Windows › Watch Window from the drop-down menu.
The Watch Window displays variables and registers of PIC, with their addresses
and values. Values are updated as you go through the simulation. Use the drop-
down menu to add and remove the items that you want to monitor. Recently
changed items are colored red.
Double clicking an item opens the Edit Value window in which you can assign a
new value to the selected variable/register. Also, you can change view to binary,
hex, char, or decimal for the selected item.
page
42
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Debugger View RAM Window is available from the drop-down menu, View ›
Debug Windows › View RAM.
The View RAM Window displays the map of PIC’s RAM, with recently changed
items colored red.
Common Errors
page
mikroElektronika: Development tools - Books - Compilers
43
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
LEXICAL ELEMENTS
These topics provide a formal definition of the mikroPascal 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 mikroPascal are derived
from a series of operations performed on your programs by the compiler.
Whitespace
Whitespace is the collective name given to spaces (blanks), horizontal and vertical
tabs, newline characters, and comments. Whitespace serves to indicate where
tokens start and end, but beyond this function, any surplus whitespace is discard-
ed.
var i : char;
j : word;
and
var
i : char;
j : word;
page
44
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Whitespace in Strings
The ASCII characters representing whitespace can occur within string literals, in
which case they are protected from the normal parsing process (they remain as
part of the string). For example, statement
some_string
:=
'mikro foo'
;
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 create comments in mikroPascal. You can use multi-line
comments:
or single-line comments:
page
mikroElektronika: Development tools - Books - Compilers
45
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
TOKENS
Token is the smallest element of a Pascal program that is meaningful to the com-
piler. 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:
end_flag := 0;
Note that end_flag would be parsed as a single identifier, rather than as the key-
word end followed by the identifier _flag.
page
46
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
LITERALS
Literals are tokens representing fixed numeric or character values.
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 Literals
The dollar-sign prefix ($) or the prefix 0x indicates a hexadecimal numeral (for
example, $8F or 0x8F).
The percent-sign prefix (%) indicates a binary numeral (for example, %0101).
The allowed range of values is imposed by the largest data type in mikroPascal –
longint. Compiler will report an error if the literal exceeds 2147483647
($7FFFFFFF).
- Decimal integer
- Decimal point
- Decimal fraction
- e or E and a signed integer exponent (optional)
You can omit either the decimal integer or the decimal fraction (but not both).
Negative floating constants are taken as positive constants with the unary operator
minus (-) prefixed.
page
mikroElektronika: Development tools - Books - Compilers
47
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Character Literals
Character literal is one character from the extended ASCII character set, enclosed
with apostrophes. Character literal can be assigned to variables of byte and char
type (variable of byte will be assigned the ASCII value of the character). Also,
you can assign character literal to a string variable.
String Literals
String literal is a sequence of up to 255 characters from the extended ASCII char-
acter set, enclosed with apostrophes. Whitespace is preserved in string literals, i.e.
parser does not “go into” strings but treats them as single tokens.
Length of string literal is the number of characters it consists of. String is stored
internally as the given sequence of characters plus a final null character (ASCII
zero). This appended “stamp” does not count against string’s total length. String
literal with nothing in between the apostrophes (null string) is stored as a single
null character. You can assign a string literal to a string variable or to an array of
char.
Apostrophe itself cannot be a part of the string literal, i.e. there is no escape
sequence. You could use the built-in function Chr to print an apostrophe:
Chr(39). Also, see Strings and String Splicing.
page
48
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
KEYWORDS
Keywords are words reserved for special purposes and must not be used as normal
identifier names.
Beside standard Pascal 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
mikroElektronika: Development tools - Books - Compilers
49
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
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
Pascal is not case sensitive, so Sum, sum, and suM represent an equivalent
identifier.
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.
Identifier Examples
temperature_V1
Pressure
no_hit
dat2string
SUM3
_vtext
page
50
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
PUNCTUATORS
The mikroPascal punctuators (also known as separators) include brackets, paren-
theses, comma, semicolon, colon, and dot.
Brackets
Parentheses
Comma
Lcd_Out(1, 1, txt);
var i, j, k : byte;
page
mikroElektronika: Development tools - Books - Compilers
51
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Semicolon
Colon
Colon (:) is used in declarations to separate identifier list from type identifier. For
example:
var
i, j : byte;
k : word;
start: nop;
...
goto start;
Dot
person.surname := 'Smith';
Dot is also a necessary part of floating point literals. Also, dot can be used for
accessing individual bits of registers in mikroPascal.
page
52
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
PROGRAM ORGANIZATION
mikroPascal imposes strict program organization. Below you can find models for
writing legible and organized source files. For more information on file inclusion
and scope, refer to Units and to Scope and Visibility.
Basically, main source file has two sections: declaration and program body.
Declarations should be in their proper place in the code, organized in an orderly
manner. Otherwise, compiler may not be able to comprehend the program
correctly.
When writing code, follow the model presented in the following page.
Units other than main start with the keyword unit; implementation section starts
with the keyword implementation. Follow the models presented in the follow-
ing two pages.
page
mikroElektronika: Development tools - Books - Compilers
53
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
//********************************************************
//* Declarations (globals):
//********************************************************
{ constants declarations }
const ...
{ variables declarations }
var ...
{ labels declarations }
label ...
{ procedures declarations }
procedure procedure_name
{ local declarations }
begin
...
end;
{ functions declarations }
function function_name
{ local declarations }
begin
...
end;
//********************************************************
//* Program body:
//********************************************************
begin
{ write your code here }
end.
page
54
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
//********************************************************
//* Interface (globals):
//********************************************************
{ constants declarations }
const ...
{ variables declarations }
var ...
{ procedures prototypes }
procedure procedure_name(...);
{ functions prototypes }
function function_name(...);
//********************************************************
//* Implementation:
//********************************************************
implementation
{ constants declarations }
const ...
{ variables declarations }
var ...
{ labels declarations }
label ...
{ procedures declarations }
procedure procedure_name
{ local declarations }
begin
...
end;
{ functions declarations }
function function_name
{ local declarations }
begin
...
end;
end.
page
mikroElektronika: Development tools - Books - Compilers
55
mikroPASCAL
mikroPASCAL - Pascal 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 which depend on
how and where identifiers are declared:
If identifier is declared in the declaration section of a main unit, out of any func-
tion or procedure, scope extends from the point where it is declared to the end of
the current file, including all routines enclosed within that scope. These identifiers
have a file scope, and are referred to as globals.
If identifier is declared in the function or procedure, scope extends from the point
where it is declared to the end of the current routine. These identifiers are referred
to as locals.
If identifier is declared in the interface section of a unit, scope extends the inter-
face section of a unit from the point where it is declared to the end of the unit, and
to any other unit or program that uses that unit.
If identifier is declared in the implementation section of a unit, but not within any
function or procedure, scope extends from the point where it is declared to the end
of the unit. The identifier is available to any function or procedure in the unit.
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.
page
56
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
UNITS
In mikroPascal, each project consists of a single project file, and one or more unit
files. Project file, with extension .ppp contains information about the project,
while units, with extension .ppas, contain the actual source code.
- break large programs into encapsulated units that can be edited separately,
- create libraries that can be used in different projects,
- distribute libraries to other developers without disclosing the source code.
Each unit is stored in its own file and compiled separately; compiled units are
linked to create an application. To build a project, the compiler needs either a
source file or a compiled unit file for each unit.
Uses Clause
Here’s an example:
page
mikroElektronika: Development tools - Books - Compilers
57
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Given a unit name, compiler will check for the presence of .mcl and .ppas files,
in order specified by the search paths.
- If both .ppas and .mcl files are found, compiler will check their dates and
include the newer one in the project. If the .ppas file is newer than the .mcl, new
library will be written over the old one;
- If only .ppas file is found, compiler will create the .mcl file and include it in
the project;
- If only .mcl file is present, i.e. no source code is available, compiler will
include it as found;
Main Unit
Every project in mikroPascal requires single main unit file. Main unit is identified
by the keyword program at the beginning; it instructs the compiler where to
“start”.
After you have successfully created an empty project with Project Wizard, Code
Editor will display a new main unit. It contains the bare-bones of a program:
program MyProject;
{ main procedure }
begin
{ Place program code here }
end.
Other than comments, nothing should precede the keyword program. After the
program name, you can optionally place the uses clause.
Place all global declarations (constants, variables, labels, routines) before the key-
word begin.
page
58
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Other Units
Modules other than main start with the keyword unit. Newly created blank unit
contains the bare-bones:
unit MyUnit;
implementation
end.
Other than comments, nothing should precede the keyword unit. After the unit
name, you can optionally place the uses clause.
Interface Section
You do not define routines in the interface section. Instead, state the prototypes of
routines (from implementation section) that you want to be visible outside the unit.
Prototypes must match the declarations exactly.
Implementation Section
Implementation section hides all the irrelevant innards from other units, allowing
encapsulation of code.
Everything declared below the keyword implementation is private, i.e. has its
scope limited to the file. When you declare an identifier in the implementation
section of a unit, you cannot use it outside the unit, but you can use it in any block
or routine defined within the unit.
By placing the prototype in the interface section of the unit (above the imple-
mentation) you can make the routine public, i.e. visible outside of unit.
Prototypes must match the declarations exactly.
page
mikroElektronika: Development tools - Books - Compilers
59
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
VARIABLES
Variable is object whose value can be changed during the runtime. Every variable
is declared under unique name which must be a valid identifier. This name is used
for accessing the memory location occupied by the variable.
Variables are declared in the declaration part of the file or routine — each variable
needs to be declared before it can be used. Global variables (those that do not
belong to any enclosing block) are declared below the uses statement, above the
keyword begin.
Specifying a data type for each variable is mandatory. Basic syntax for variable
declaration is:
For more details refer to Types and Types Conversions. For more information on
variables’ scope refer to the chapter Scope and Visibility.
Pascal allows shorthand syntax with only one keyword var followed by multiple
variable declarations. For example:
var i, j, k : byte;
samples : array[100] of word;
Every declared variable consumes part of RAM memory. Data type of variable
determines not only the allowed range of values, but also the space variable occu-
pies in RAM memory. Bear in mind that operations using different types of vari-
ables take different time to be completed. mikroPascal recycles local variable
memory space – local variables declared in different functions and procedures
share same memory space, if possible. There is no need to declare SFR explicitly,
as mikroPascal automatically declares relevant registers as global variables of
byte. For example: T0IE, INTF, etc.
page
60
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
CONSTANTS
Constant is data whose value cannot be changed during the runtime. Using a con-
stant in a program consumes no RAM memory. Constants can be used in any
expression, but cannot be assigned a new value.
Pascal allows shorthand syntax with only one keyword const followed by multi-
ple constant declarations. Here’s an example:
const
MAX : longint = 10000;
MIN = 1000; // compiler will assume word type
SWITCH = 'n'; // compiler will assume char type
MSG = 'Hello'; // compiler will assume string type
MONTHS : array[1..12] of byte =
(31,28,31,30,31,30,31,31,30,31,30,31);
page
mikroElektronika: Development tools - Books - Compilers
61
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
LABELS
Labels serve as targets for goto statements. Mark the desired statement with label
and a colon like this:
label_identifier : statement
Before marking a statement, you must first declare the label. Labels are declared
in declaration part of unit or routine, similar to variables and constants. Declare
labels using the keyword label:
Name of the label needs to be a valid identifier. The label declaration, marked
statement, and goto statement must belong to the same block. Hence it is not pos-
sible to jump into or out of a procedure or function. Do not mark more than one
statement in a block with the same label.
Here is an example of an infinite loop that calls the Beep procedure repeatedly:
label loop;
...
loop: Beep;
goto loop;
page
62
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Functions
The function_name represents a function’s name and can be any valid identifier.
The return_type is the type of return value and can be any simple type. Within
parentheses, parameter_list is a formal parameter list similar to variable dec-
laration. In mikroPascal, parameters are always passed to function by value; to
pass argument by the address, add the keyword var ahead of identifier.
A function is called by its name, with actual arguments placed in the same
sequence as their matching formal parameters. The compiler is able to coerce mis-
matching arguments to the proper type according to implicit conversion rules.
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.
In standard Pascal, function name is automatically created local variable that can
be used for returning a value of a function. Also, mikroPascal allows you to use
the automatically created local variable result to assign the return value of a
function if you find function name to be too ponderous.
page
mikroElektronika: Development tools - Books - Compilers
63
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Function calls are considered to be primary expressions, and can be used in situa-
tions where expression is expected. Function call can also be a self-contained
statement, in which case the return value is discarded.
Procedures
procedure procedure_name(parameter_list);
{ local declarations }
begin
{ procedure body }
end;
The procedure_name represents a procedure’s name and can be any valid identi-
fier. Within parentheses, parameter_list is a formal parameter list similar to
variable declaration. In mikroPascal, parameters are always passed to procedure
by value; to pass argument by the address, add the keyword var ahead of
identifier.
page
64
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
A procedure is called by its name, with actual arguments placed in the same
sequence as their matching formal parameters. The compiler is able to coerce mis-
matching arguments to the proper type according to implicit conversion rules.
Upon procedure call, all formal parameters are created as local objects initialized
by values of actual arguments.
Here’s an example procedure which transforms its input time parameters, prepar-
ing them for output on LCD:
page
mikroElektronika: Development tools - Books - Compilers
65
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
TYPES
Pascal is a strictly typed language, which means that every variable and constant
need to have a strictly defined type, known at the time of compilation.
In mikroPascal from v5.xx, you can define your own types.Types can be built
from other types by the type declaration.
Example:
Type Categories
- simple types
- arrays
- strings
- pointers
- records (user defined types)
page
66
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
SIMPLE TYPES
Simple types represent types that cannot be divided into more basic elements, and
are the model for representing elementary data on machine level.
±1.17549435082 * 10-38 ..
real 32-bit
±6.80564774407 * 1038
You can assign signed to unsigned or vice versa only using the explicit conversion.
Refer to Types Conversions for more information.
page
mikroElektronika: Development tools - Books - Compilers
67
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
ARRAYS
An array represents an indexed collection of elements of the same type (called the
base type). Because each element has a unique index, arrays, unlike sets, can
meaningfully contain the same value more than once.
var
weekdays : array[1..7] of byte;
samples : array[50] of word;
begin
// Now we can access elements of array variables, for example:
samples[0] := 1;
if samples[37] = 0 then ...
Constant Arrays
The number of assigned values must not exceed the specified length. Vice versa is
possible, when the trailing “excess” elements will be assigned zeroes.
page
68
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Multi-dimensional Arrays
An array is one-dimensional if it is of scalar type. One-dimensional arrays are
sometimes referred to as vectors.
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:
var
m: array[50] of array[20] of byte; // 2-dimensional array of size 50x20
n: array[4] of array[2] of array[7] of byte; // 3-dimensional array of size 4x2x7
begin
...
func(m);
end.
page
mikroElektronika: Development tools - Books - Compilers
69
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
STRINGS
A string represents a sequence of characters, and is an equivalent to an array of
char. It is declared like:
string_name string[length]
Specifier length is the number of characters string consists of. String is stored
internally as the given sequence of characters plus a final null character (zero).
This appended “stamp” does not count against string’s total length.
You can assign string literals or other strings to string variables. String on the right
side of an assignment operator has to be the shorter of the two, or of equal length.
For example:
var
msg1 : string[20];
msg2 : string[19];
begin
msg1 := 'This is some message';
msg2 := 'Yet another message';
msg1 := msg2; // this is ok, but vice versa would be illegal
var s : string[5];
//...
s := 'mik';
{
s[0] is char literal 'm'
s[1] is char literal 'i'
s[2] is char literal 'k'
s[3] is zero
s[4] is undefined
s[5] is undefined
}
Be careful when handling strings in this way, since overwriting the end of a string
can cause access violations.
page
70
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
String Splicing
mikroPascal allows you to splice strings by means of plus character. This kind of
concatenation is applicable to string variables/literals and character variables/liter-
als. For control characters, use the non-quoted hash sign and a numeral (e.g. #13
for CR).
The result of splicing is of string type, naturally. See also Strcat function.
Here is an example:
begin
//...
//...
page
mikroElektronika: Development tools - Books - Compilers
71
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
POINTERS
A pointer is a data type which holds a memory address. While a variable accesses
that memory address directly, a pointer can be thought of as a reference to that
memory address.
To declare a pointer data type, add a carat prefix (^) before type. For example, if
you are creating a pointer to an integer, you would write:
^integer;
To access the data at the pointer’s memory location, you add a carat after the vari-
able name. For example, let’s declare variable p which points to a word, and then
assign the pointed memory location value 5:
var p : ^word;
...
p^ := 5;
A pointer can be assigned to another pointer. However, note that only the address,
not the value, is copied. Once you modify the data located at one pointer, the other
pointer, when dereferenced, also yields modified data.
@ Operator
The @ operator returns the address of a variable or routine; that is, @ constructs a
pointer to its operand. The following rules apply to @:
page
72
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
RECORDS
A record (analogous to a structure in some languages) represents a heterogeneous
set of elements. Each element is called field; the declaration of a record type speci-
fies a name and type for each field. The syntax of a record type declaration is
where recordTypeName is a valid identifier, each type denotes a type, and each
fieldList is a valid identifier or a comma-delimited list of identifiers. The scope
of a field identifier is limited to the record in which it occurs, so you don’t need to
worry about naming conflicts between field identifiers and other variables.
Note: In mikroPascal, you cannot use the record construction directly in variable
declarations, i.e. without type.
For example, the following declaration creates a record type called TDot:
type
TDot = record
x, y : real;
end;
Each TDot contains two fields: x and y coordinates; memory is allocated when
you instantiate the record, like this:
var m, n: TDot;
page
mikroElektronika: Development tools - Books - Compilers
73
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Accessing Fields
You can access the fields of a record by means of dot (.) as a direct field selector.
If we declare variables circle1 and circle2 of previously defined type
TCircle:
circle1.radius := 3.7;
circle1.center.x := 0;
circle1.center.y := 0;
You cannot commit assignments between complex variables. See MemCpy for
more info.
page
74
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
TYPES CONVERSIONS
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). mikroPascal supports both implicit
and explicit conversions for built-in types.
Implicit Conversion
Promotion
When operands are of different types, implicit conversion promotes the less
complex to more complex type taking the following steps:
Higher bytes of extended unsigned operand are filled with zeroes. Higher bytes of
extended signed operand are filled with bit sign (if number is negative, fill higher
bytes with one, otherwise with zeroes).
page
mikroElektronika: Development tools - Books - Compilers
75
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Clipping
If expression evaluates to more complex type than expected, excess data will be
simply clipped (higher bytes are lost).
Explicit Conversion
Explicit conversion can be executed at any point by inserting type keyword (byte,
word, short, integer, or longint) ahead of the expression to be converted.
The expression must be enclosed in parentheses. Explicit conversion can be
performed only on the operand left of the assignment operator.
Special case is conversion between signed and unsigned types. Explicit conversion
between signed and unsigned data does not change binary representation of data; it
merely allows copying of source to destination.
For example:
You cannot execute explicit conversion on the operand left of the assignment
operator.
page
76
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal 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, mikroPascal performs implicit type conversions before the
expression 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.
In details:
Here are the steps mikroPascal uses to convert the operands in an arithmetic
expression:
First, any small integral types are converted according to the following rules:
page
mikroElektronika: Development tools - Books - Compilers
77
mikroPASCAL
mikroPASCAL - Pascal 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
- Bitwise Operators
- Boolean Operators
- Relational Operators
4 1 @ not + - right-to-left
* /
3 2 div mod and shl shr
left-to-right
2 2 + - or xor left-to-right
page
78
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Arithmetic Operators
+ addition 2
- subtraction 2
* multiplication 3
/ division 3
For example: b := -a
Division by Zero
If 0 (zero) is used explicitly as the second operand (i.e. x div 0), compiler will
report an error and will not generate code. But in case of implicit division by zero:
x div y , where y is 0 (zero), result will be the maximum value for the appropri-
ate type (for example, if x and y are words, the result will be $FFFF).
page
mikroElektronika: Development tools - Books - Compilers
79
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Relational Operators
= equal 1
page
80
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Bitwise Operators
Use the bitwise operators to modify the individual bits of numerical operands.
Operands need to be either both signed or both unsigned.
Bitwise operators associate from left to right. The only exception is the bitwise
complement operator not which associates from right to left.
Bitwise operators and, or, and xor perform logical operations on appropriate
pairs of bits of their operands. Operator not complements each bit of its operand.
For example:
{ because ..
page
mikroElektronika: Development tools - Books - Compilers
81
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Similarly:
If number is converted from less complex to more complex data type, upper bytes
are filled with zeroes. If number is converted from more complex to less complex
data type, data is simply truncated (upper bytes are lost).
For example:
If number is converted from less complex data type to more complex, upper bytes
are filled with ones if sign bit is 1 (number is negative); upper bytes are filled with
zeroes if sign bit is 0 (number is positive). If number is converted from more com-
plex data type to less complex, data is simply truncated (upper bytes are lost).
For example:
page
82
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Binary operators shl and shr move the bits of the left operand for a number of
positions specified by the right operand, to the left or right, respectively. Right
operand has to be positive and less than 255.
With shift left (shl), left most bits are discarded, and “new” bits on the right are
assigned zeroes. Thus, shifting unsigned operand to the 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 (shr), right most bits are discarded, and the “freed” bits on the left
are assigned zeroes (in case of unsigned operand) or the value of the sign bit (in
case of signed operand). Shifting operand to the right by n positions is equivalent
to dividing it by 2n.
page
mikroElektronika: Development tools - Books - Compilers
83
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
page
84
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
EXPRESSIONS
An expression is a sequence of operators, operands, and punctuators that returns a
value.
The primary expressions include: literals, variables, and function calls. From
these, using operators, more complex expressions can be created. Formally,
expressions are defined recursively: subexpressions can be nested up to the limits
of memory.
You cannot mix signed and unsigned data types in assignment expressions or in
expressions with arithmetic or logical operators. You can use explicit conversion
though.
page
mikroElektronika: Development tools - Books - Compilers
85
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
STATEMENTS
Statements define algorithmic actions within a program. Each statement needs to
be terminated by a semicolon (;). In the absence of specific jump and selection
statements, statements are executed sequentially in the order of appearance in the
source code.
The simplest statements include assignments, routine calls, and jump statements.
These can be combined to form loops, branches, and other structured statements.
- asm Statement
- Assignment Statements
- Compound Statements (Blocks)
- Conditional Statements
- Iteration Statements (Loops)
- Jump Statements
asm Statement
asm
block of assembly instructions
end;
Pascal comments are not allowed in embedded assembly code. Instead, you may
use one-line assembly comments starting with semicolon. If you plan to use a cer-
tain Pascal variable in embedded assembly only, be sure to at least initialize it
(assign it initial value) in Pascal code; otherwise, linker will issue an error. This
does not apply to predefined globals such as PORTB.
Note: mikroPascal will not check if the banks are set appropriately for your vari-
able. You need to set the banks manually in assembly code.
page
86
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
- _myVar, if it is global.
- FARG_+XX, if it is local (this is myVar's actual position in the local function
frame.
- _myVar_L0(+XX), if it is a local static variable (+XX to access further individ-
ual bytes).
The only types whose name remains the same in asm as it is in Pascal are con-
stants, e.g. INTCON, PORTB, WREG, GIE, etc.
Accessing individual bytes is different as well. For example, if you have a global
variable "g_var", that is of type long (i.e. 4 bytes), you are to access it like this:
Syntax for retrieving address of an object is different. For objects located in flash
ROM:
page
mikroElektronika: Development tools - Books - Compilers
87
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Assignment Statements
variable := expression;
The statement evaluates the expression and assigns its value to the variable.
All rules of the implicit conversion apply. Variable can be any declared variable
or array element, and expression can be any expression.
Do not confuse the assignment with relational operator = which tests for equality.
Compound Statements
begin
statements
end;
For example, while loop expects one statement in its body, so we can pass it a
compound statement:
while i < n do
begin
temp := a[i];
a[i] := b[i];
b[i] := temp;
n := n + 1;
end;
end.
page
88
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Conditional Statements
If Statement
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.
page
mikroElektronika: Development tools - Books - Compilers
89
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Case Statement
Use the case statement to pass control to a specific program branch, based on a
certain condition. The case statement consists of a selector expression (a condi-
tion) and a list of possible values. Syntax of case statement is:
case selector of
value_1 : statement_1
...
value_n : statement_n
[else default_statement]
end;
First, the selector expression (condition) is evaluated. The case statement then
compares it against all the available values. If the match is found, the state-
ment following the match evaluates, and case statement terminates. In case there
are multiple matches, the first matching statement will be executed. If none of the
values matches the selector, then the default_statement in the else
clause (if there is one) is executed.
case operator of
'*' : result := n1 * n2;
'+' : result := n1 + n2;
'-' : result := n1 - n2
else result := 0;
end;
Also, you can group values together for a match. Simply separate the items by
commas:
case reg of
1,2,3,4: opmode := 1;
5,6,7: opmode := 2;
end;
Note that case statements can be nested – values are then assigned to the inner-
most enclosing case statement.
page
90
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Iteration statements let you loop a set of statements. There are three forms of itera-
tion statements in mikroPascal: for, while, and repeat.
You can use the statements break and continue to control the flow of a loop
statement. The break terminates the statement in which it occurs, while
continue begins executing the next iteration of the sequence.
For Statement
The for statement implements an iterative loop and requires you to specify the
number of iterations. Syntax of for statement is:
The counter is a variable which increments (or decrements if you use downto)
with each iteration of the loop. Before the first iteration, counter is set to the
initial_value and will increment (or decrement) until it reaches the
final_value. With each iteration, statement will be executed.
s := 0;
for i := 0 to n do s := s + a[i] * b[i];
page
mikroElektronika: Development tools - Books - Compilers
91
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
While Statement
Here is an example of calculating scalar product of two vectors, using the while
statement:
s := 0; i := 0;
while i < n do
begin
s := s + a[i] * b[i];
i := i + 1;
end;
Repeat Statement
The repeat statement executes until the condition becomes false. Syntax of
repeat statement is:
The statement is executed repeatedly until the expression evaluates true. The
expression is evaluated after each iteration, so the loop will execute state-
ment at least once.
Here is an example of calculating scalar product of two vectors, using the repeat
statement:
s := 0; i := 0;
repeat
begin
s := s + a[i] * b[i];
i := i + 1;
end;
until i = n;
page
92
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Jump Statements
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 loop (for, while, or repeat block).
For example:
Continue Statement
You can use the continue statement within loops to “skip the cycle”:
- continue statement in for loop moves program counter to the line with the
keyword for; it does not change the loop counter,
- continue statement in while loop moves program counter to the line with loop
condition (top of the loop),
- continue statement in repeat loop moves program counter to the line with
loop condition (bottom of the loop).
page
mikroElektronika: Development tools - Books - Compilers
93
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Goto Statement
Use the goto statement to unconditionally jump to a local label — for more infor-
mation, refer to Labels. Syntax of goto statement is:
goto label_name;
This will transfer control to the location of a local label specified by label_name.
The goto line can come before or after the label.
The label declaration, marked statement, and goto statement must belong to the
same block. Hence it is not possible to jump into or out of a procedure or function.
You can use goto to break out from any level of nested control structures. Never
jump into a loop or other structured statement, since this can have unpredictable
effects.
for (...) do
begin
for (...) do
begin
...
if (disaster) then goto Error;
...
end;
end;
.
.
.
Error: // error handling code
page
94
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Exit Statement
The exit statement allows you to break out of a routine (function or procedure).
It passes the control to the first statement following the routine call.
procedure Proc1();
var error: byte;
begin
... // we're doing something here
if error = TRUE then exit;
... // some code, which won't be executed if error is true
end;
Note: If breaking out of a function, return value will be the value of the local
variable result at the moment of exit.
page
mikroElektronika: Development tools - Books - Compilers
95
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
COMPILER DIRECTIVES
mikroPascal treats comments beginning with a “$” immediately following the
opening brace as a compiler directive; for example, {$ELSE}. Compiler directives
are not case sensitive.
You can use conditional compilation to select particular sections of code to com-
pile while excluding other sections. All compiler directives must be completed in
the source file in which they begun.
$DEFINE
$UNDEFINE
$IFDEF
$ELSE
$ENDIF
Use directive $DEFINE to define a conditional compiler constant (“flag”). You can
use any identifier for a flag, with no limitations. No conflicts with program identi-
fiers are possible, as flags have a separate name space. Only one flag can be set
per directive.
For example:
{$DEFINE Extended_format}
Note: Pascal does not support macros; directives $DEFINE and $UNDEFINE do
not create/destroy macros; they only provide flags for directive $IFDEF to check
against.
page
96
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Directives $IFDEF..$ELSE
Directive $IFDEF is terminated by the $ENDIF directive, and can have an optional
$ELSE clause:
{$IFDEF flag}
<block of code>
{$ELSE}
<alternate block of code>
{$ENDIF}
First, $IFDEF checks if flag is defined by means of $DEFINE. If so, only <block
of code> will be compiled. Otherwise, <alternate block of code> will be
compiled. The $ENDIF ends the conditional sequence. The result of the preceding
scenario is that only one section of code (possibly empty) is passed on for further
processing.
The processed section can contain further conditional clauses, nested to any depth;
each $IFDEF must be matched with a closing $ENDIF.
Here is an example:
{$IFDEF resolution10}
// <code specific to 10-bit resolution>
{$ELSE}
{$IFDEF resolution12}
// <code specific to 12-bit resolution>
{$ELSE}
// <default code>
{$ENDIF}
{$ENDIF}
page
mikroElektronika: Development tools - Books - Compilers
97
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
$I is compiler directive for inserting content of given file into place where this
directive is called.
Here is an example:
{$I filename.txt}
Predefined Flags
mikroPascal has several predefined flags for configuring hardware. These can be
found in definition files (“defs” folder), specifying hardware settings for individual
chips. SFR are sorted under categories: ___SFR (umbrella for all registers),
___CONFIG_OSC (oscillator), ___CONFIG_WDT (Watchdog timer), and ___CON-
FIG_BORPOR (brown–out reset and power–on–timer).
page
98
mikroElektronika: Development tools - Books - Compilers
CHAPTER
4
mikroPascal
Libraries
mikroPascal 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, Serial Ethernet, Toshiba GLCD, Port Expander,
Serial GLCD, numeric formatting, bit manipulation, and many other are included
along with practical, ready-to-use code examples.
BUILT-IN ROUTINES
mikroPascal compiler provides a set of useful built-in utility functions. Built-in
routines can be used in any part of the project.
Inc
Dec
Chr
Ord
SetBit
ClearBit
TestBit
Lo
Hi
Higher
Highest
SizeOf
Swap
Clock_Khz
Clock_Mhz
Reset
ClrWdt
page
100
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Inc
Prototype function Inc(var par : longint) : longint;
Description Increases parameter par by 1. Note that the function may be called as a self-contained
statement. Function returns the value of increased parameter. This is an “inline” routine;
code is generated in the place of the call, so the call doesn’t count against the nested call
limit.
Dec
Prototype function Dec(var par : longint) : longint;
Description Decreases parameter par by 1. Note that the function may be called as a self-contained
statement. Function returns the value of decreased parameter. This is an “inline” routine;
code is generated in the place of the call, so the call doesn’t count against the nested call
limit.
Chr
Prototype function Chr(code : byte) : char;
Description Function returns a character associated with the specified character code. Numbers
from 0 to 31 are the standard nonprintable ASCII codes. This is an “inline” routine; code
is generated in the place of the call, so the call doesn’t count against the nested call
limit.
Ord
Prototype function Ord(character : char) : byte;
Description Function returns ASCII code of the character. This is an “inline” routine; code is gener-
ated in the place of the call, so the call doesn’t count against the nested call limit.
page
mikroElektronika: Development tools - Books - Compilers
101
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
SetBit
Description Function sets the bit rbit of register. Parameter rbit needs to be a variable or liter-
al with value 0..7. See Predefined globals and constants for more information on register
identifiers. This is an “inline” routine; code is generated in the place of the call, so the
call doesn’t count against the nested call limit.
ClearBit
Description Function clears the bit rbit of register. Parameter rbit needs to be a variable or lit-
eral with value 0..7. See Predefined globals and constants for more information on regis-
ter identifiers. This is an “inline” routine; code is generated in the place of the call, so
the call doesn’t count against the nested call limit.
TestBit
Description Function tests if the bit rbit of register is set. If set, function returns 1, otherwise
returns 0. Parameter rbit needs to be a variable or literal with value 0..7. See
Predefined globals and constants for more information on register identifiers. This is an
“inline” routine; code is generated in the place of the call, so the call doesn’t count
against the nested call limit.
page
102
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Lo
Description Function returns the lowest byte of number. Function does not interpret bit patterns of
number – it merely returns 8 bits as found in register.
Hi
Returns Returns byte next to the lowest byte of number, bits 8..15.
Description Function returns byte next to the lowest byte of number. Function does not interpret bit
patterns of number – it merely returns 8 bits as found in register.
Higher
Returns Returns byte next to the highest byte of number, bits 16..23.
Description Function returns byte next to the highest byte of number. Function does not interpret bit
patterns of number – it merely returns 8 bits as found in register.
page
mikroElektronika: Development tools - Books - Compilers
103
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Highest
Prototype function Highest(number : longint) : byte;
Description Function returns the highest byte of number. Function does not interpret bit patterns of
number – it merely returns 8 bits as found in register.
SizeOf
Prototype function SizeOf( variable_name : string[100]): word
Description This function gives the size in bytes of how much memory space is used by its operand.
Swap
Description Swaps higher nibble (bits <7..4>) and lower nibble (bits <3..0>) of arg.
page
104
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Clock_Khz
Clock_Mhz
Reset
Description This procedure is equal to assembler instruction reset. This procedure works only for
P18.
Example Reset; //Resets the PIC MCU
ClrWdt
page
mikroElektronika: Development tools - Books - Compilers
105
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
LIBRARY ROUTINES
mikroPascal provides a set of libraries which simplifies the initialization and use
of PIC MCU and its units. Library functions do not require any header files to be
included; you can use them anywhere in your projects. Currently available
libraries include:
page
106
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
ADC Library
ADC (Analog to Digital Converter) unit is available with a number of PIC MCU
models. Library function Acd_Read is included to provide you comfortable work
with the unit.
Adc_Read
Returns 10-bit unsigned value read from the specified ADC channel.
Description Initializes PIC’s internal ADC unit to work with RC clock. Clock determines the time
period necessary for performing AD conversion (min 12TAD). RC sources typically
have Tad 4uS.
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 unit. 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
mikroElektronika: Development tools - Books - Compilers
107
mikroPASCAL
mikroPASCAL - Pascal 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).
program Adc_Test;
var temp_res : word;
begin
ADCON1 := $80; // Configure analog inputs and Vref
TRISA := $FF; // PORTA is input
TRISB := $3F; // Pins RB7 and RB6 are output
TRISD := $0; // PORTD is output
while TRUE do
begin
temp_res := Adc_Read(2);
PORTD := temp_res; // Send lower 8 bits to PORTD
PORTB := word(temp_res shr 2); // Send 2 most significant bits to PORTB
end;
end.
Hardware Connection
330 LD0
VCC 40
RB7
39
RB6
38 330 LD1
RB5
4 37
RA2 RB4
36 330 LD2
RB3
PIC18F452
35
RB2
34 330 LD3
RB1
33
RB0
330 LD4
VCC
11 330 LD5
VCC
12
GND
13
OSC1
330 LD6
14
OSC2
330 LD7
VCC
10K
Reset 8MHz
page
108
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
CAN Library
mikroPascal provides a library (driver) for working with the CAN unit.
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 99.
Library Routines
CANSetOperationMode
CANGetOperationMode
CANInitialize
CANSetBaudRate
CANSetMask
CANSetFilter
CANRead
CANWrite
RegsToCANID
CANIDToRegs
page
mikroElektronika: Development tools - Books - Compilers
109
mikroPASCAL
mikroPASCAL - Pascal 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
110
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
CANInitialize
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
mikroElektronika: Development tools - Books - Compilers
111
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
CANSetBaudRate
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
112
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal 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:
CANSetMask(CAN_MASK_B1, -1, CAN_CONFIG_XTD_MSG);
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
mikroElektronika: Development tools - Books - Compilers
113
mikroPASCAL
mikroPASCAL - Pascal 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
114
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal 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
mikroElektronika: Development tools - Books - Compilers
115
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
// ..continued
You may use bitwise AND to form config byte out of these values. For example:
init := CAN_CONFIG_SAMPLE_THRICE and CAN_CONFIG_PHSEG2_PRG_ON and
CAN_CONFIG_STD_MSG and CAN_CONFIG_DBL_BUFFER_ON and
CAN_CONFIG_VALID_XTD_MSG and 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 and CAN_TX_XTD_FRAME and
CAN_TX_NO_RTR_FRAME;
//...
CANSendMessage(id, data, 1, send_config);
page
116
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
CAN_RX_MSG_FLAGS
You may use bitwise AND to adjust the appropriate flags. For example:
CAN_MASK
CAN_MASK constants define mask codes. Function CANSetMask expects one of these
as its argument:
const CAN_MASK_B1 = 0;
const CAN_MASK_B2 = 1;
CAN_FILTER
const CAN_FILTER_B1_F1 = 0;
const CAN_FILTER_B1_F2 = 1;
const CAN_FILTER_B2_F1 = 2;
const CAN_FILTER_B2_F2 = 3;
const CAN_FILTER_B2_F3 = 4;
const CAN_FILTER_B2_F4 = 5;
page
mikroElektronika: Development tools - Books - Compilers
117
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Library Example
The example demonstrates CAN 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 (high-
er byte) for a visual check. Note that the data exchange doesn’t start until you press a button;
check the code below.
program CAN_test;
begin
SetBit(TRISB,0); // pin RB0 is input
PORTC := 0;
TRISC := 0;
PORTD := 0;
TRISD := 0;
aa := 0; aa1 := 0; aa2 := 0;
// continues ..
page
118
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
// .. continued
cont := true;
while (cont) do cont := TestButton;
data[0] := 0;
// Initialize CAN
CANInitialize(1,1,3,3,1,aa);
ID := -1;
PORTD := $FF;
id := 12111;
while true do
begin
oldstate := 0;
zr := CANReceiveMessage(id , Data , len, aa2);
if (id = 3) and zr then
begin
PORTD := $AA;
PORTC := data[0]; // Output data at PORTC
data[0] := data[0]+1;
id := 12111;
CANSendMessage(id,data,1,aa1); // Send incremented data back
if len = 2 then // If message contains two data bytes
PORTD := data[1]; // send second byte to PORTD
end;
end;
end.
page
mikroElektronika: Development tools - Books - Compilers
119
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Hardware Connection
CAN TX of MCU
CAN RX of MCU
10
1 8
TX-CAN RS
2 7
GND CANH
3 6
VCC VCC CANL
4 5
RXD Vref
MCP2551
Shielded pair
no longer than 300m
page
120
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
CANSPI Library
SPI unit is available with a number of PICmicros. mikroPascal provides a library
(driver) for working with the external CAN units (such as MCP2515 or
MCP2510) via SPI.
In mikroPascal, 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 CAN Constants.
Library Routines
CANSPISetOperationMode
CANSPIGetOperationMode
CANSPIInitialize
CANSPISetBaudRate
CANSPISetMask
CANSPISetFilter
CANSPIRead
CANSPIWrite
RegsToCANSPIID
CANSPIIDToRegs
page
mikroElektronika: Development tools - Books - Compilers
121
mikroPASCAL
mikroPASCAL - Pascal 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 141).
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
122
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal 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:
page
mikroElektronika: Development tools - Books - Compilers
123
mikroPASCAL
mikroPASCAL - Pascal 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
124
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal 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:
CANSPISetMask(CAN_MASK_B1, -1, CAN_CONFIG_XTD_MSG);
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
mikroElektronika: Development tools - Books - Compilers
125
mikroPASCAL
mikroPASCAL - Pascal 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
126
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Library Example
The example demonstrates 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 (high-
er byte) for a visual check.
program CANSPI_test;
var
aa, aa1, len, aa2 : byte;
data : array[8] of byte;
id : longint;
zr : byte;
begin
TRISB := 0;
Spi_Init; // Must be performed before any other activity
ClearBit(TRISC,2); // This pin is connected to Reset pin of MCP2510
ClearBit(portc,2); // Keep MCP2510 in reset state
SetBit(PORTC,0); // Make sure that MCP2510 is not selected
ClearBit(TRISC,0); // Make RC0 output
PORTD := 0;
TRISD := 0; // PORTD is output
aa := 0;
aa1 := 0;
aa2 := 0;
// continues ..
page
mikroElektronika: Development tools - Books - Compilers
127
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
// .. continued
// Initialize MCP2510
CANSPIInitialize(1,2,3,3,1,aa);
ID := -1;
while true do
begin
zr := CANSPIRead(id, Data, len, aa2);
if (id = 12111) and zr then
begin
PORTD := $AA;
PORTB := data[0];
data[0]:=data[0]+1;
id := 3;
Delay_ms(10);
CANSPIWrite(id,data,1,aa1);
if len = 2 then PORTD := data[1];
end;
end;
end.
page
128
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Hardware Connection
VCC
100K VCC
1 18
TX Vdd
2 17
RX RST
PIC18F452
3 16
CLKO CS
4 15
TX0 SO 33
5 14 RB0
TX1 SI
6 13 VCC
TX2 SCK
7 12 11
OSC2 INT VCC
8 11 12
OSC1 RX0B GND
13
9 10 OSC1
Vss RX1B 14
8 MhZ OSC2
15
MCP2510 RC0
8 MhZ 24
RC5
18 23
RC3 RC4
10
1 8
TX-CAN RS
2 7
GND CANH
3 6
VCC VCC CANL
4 5
RXD Vref
MCP2551
Shielded pair
no longer than 300m
page
mikroElektronika: Development tools - Books - Compilers
129
mikroPASCAL
mikroPASCAL - Pascal 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_Read_Init
Cf_Read_Byte
Cf_Write_Init
Cf_Write_Byte
Cf_Write_Sector
Cf_Read_Sector
Cf_Fat_Init
Cf_Fat_Assign
Cf_Fat_Reset
Cf_Fat_Read
Cf_Fat_Rewrite
Cf_Fat_Append
Cf_Fat_Delete
Cf_Fat_Write
Cf_Fat_Set_File_Date
Cf_Fat_Get_File_Date
Cf_Fat_Get_File_Size
Cf_Fat_Get_Swap_File
page
130
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal 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_Read_Init
Description Initializes CF card for reading. Parameter address specifies sector address from where
data will be read, and sectcnt is total number of sectors prepared for read operation.
page
mikroElektronika: Development tools - Books - Compilers
131
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Cf_Read_Byte
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.
Cf_Write_Byte
Description Writes one byte (data) to CF. All 512 bytes are transferred to a buffer.
Example Cf_Write_Byte(100);
page
132
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Cf_Write_Sector
Prototype function Cf_Write_Sector(sector : longint; var data : array[512]
of byte) : byte;
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 CF 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.
Requires Ports must be initialized. See Cf_Init.
Example error := Cf_Write_Sector(sector, data);
Cf_Read_Sector
Prototype function Cf_Read_Sector(sector : longint; var data : array[512]
of byte) : byte;
Description Function reads one sector (512 bytes) from CF 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.
Requires Ports must be initialized. See Cf_Init.
Example error := Cf_Read_Sector(sector, data);
Cf_Fat_Init
Returns Returns 0 if initialization is successful, 1 if boot sector was not found and 255 if card
was not detected.
Description Initializes ports appropriately for FAT operations with CF card. Specify two different
ports: ctrlport and dataport.
Requires Nothing.
Example CF_Fat_Init(PORTD,PORTC);
page
mikroElektronika: Development tools - Books - Compilers
133
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Cf_Fat_Assign
Returns "1" is file is present (or file isn't present but new file is created), or "0" if file isn't pres-
ent and no new file is created.
Description Assigns file for FAT operations. If file isn't present, function creates new file with given
filename. filename parameter is name of file (filename must be in format 8.3 UPPER-
CASE). create_file is a parameter for creating new files. if create_file if different from 0
then new file is created (if there is no file with given filename).
Requires Ports must be initialized for FAT operations with CF. See Cf_Fat_Init.
Example Cf_Fat_Assign('MIKROELE.TXT',1);
Cf_Fat_Reset
Example Cf_Fat_Reset(size);
page
134
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Cf_Fat_Read
Returns Nothing.
Description Reads data from file. bdata is data read from file.
Example Cf_Fat_Read(character);
Cf_Fat_Rewrite
Returns Nothing.
Example Cf_Fat_Rewrite;
page
mikroElektronika: Development tools - Books - Compilers
135
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Cf_Fat_Append
Returns Nothing.
Description Opens file for writing. This procedure continues writing from the last byte in file.
Example Cf_Fat_Append;
Cf_Fat_Delete
Returns Nothing.
Example Cf_Fat_Delete;
page
136
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Cf_Fat_Write
Returns Nothing.
Description Writes data to CF.fdata parameter is data written to CF. data_len number of bytes that is
written to CF.
Cf_Fat_Set_File_Date
Returns Nothing.
Description Sets time attributes of file.You can set file year, month, day. hours, mins, seconds.
Example Cf_Fat_Set_File_Date(2005,9,30,17,41,0);
page
mikroElektronika: Development tools - Books - Compilers
137
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Cf_Fat_Get_File_Date
Returns Nothing.
Description Reads time attributes of file.You can read file year, month, day. hours, mins.
Cf_Fat_Get_File_Size
Example Cf_Fat_Get_File_Size;
page
138
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Cf_Fat_Get_Swap_File
Returns No. of start sector for the newly created swap file, if swap file was created; otherwise,
the function returns zero.
Description This function is used to create a swap file on the CF media. It accepts as sectors_cnt
argument the number of consecutive sectors that user wants the swap file to have.
During its execution, the function searches for the available consecutive sectors, their
number being specified by the sectors_cnt argument. If there is such space on the media,
the swap file named MIKROSWP.SYS is created, and that space is designated (in FAT
tables) to it. The attributes of this file are: system, archive and hidden, in order to dis-
tinct it from other files. If a file named MIKROSWP.SYS already exists on the media,
this function deletes it upon creating the new one.
The purpose of the swap file is to make reading and writing to CF media as fast as pos-
sible, without potentially damaging the FAT system. Swap file can be considered as a
"window" on the media where user can freely write/read the data, in any way (s)he
wants to. Its main purpose in mikroPascal library is to be used for fast data acquisition;
when the time-critical acquisition has finished, the data can be re-written into a "nor-
mal" file, and formatted in the most suitable way.
page
mikroElektronika: Development tools - Books - Compilers
139
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
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.
program Cf_example;
var i : word;
begin
TRISC := 0; // PORTC is output
Cf_Init(PORTB, PORTD); // Initialize ports
repeat nop;
until Cf_Detect(); // Wait until CF card is inserted
Delay_ms(500);
Cf_Write_Init(590, 1); // Initialize write at sector address 590
// of 1 sector (512 bytes)
for i := 0 to 511 do // Write 512 bytes to sector (590)
Cf_Write_Byte(i + 11);
PORTC := $FF;
Delay_ms(1000);
Cf_Read_Init(590, 1); // Initialize write at sector address 590
// of 1 sector (512 bytes)
for i := 0 to 511 do // Read 512 bytes from sector (590)
begin
PORTC := Cf_Read_Byte; // Read byte and display on PORTC
Delay_ms(1000);
end;
end.
page
140
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
HW Connection
40
RB7
39
RB6
38
RB5
37
RB4
36
RB3
PIC18F452
35
RB2
34
RB1
33
RB0
VCC
11 30
VCC RD7
12 29
GND RD6
13 28
OSC1 RD5
14 27
OSC2 RD4
15
RC0
8 MhZ
19 22
RD0 RD3
20 21
RD1 RD2
VCC
RD7
RD6
RD5
50
25
RD4 49
24
48
RD3 23
47
22
RD2 46
21
45
RD1 44
20
19
RD0 43
42
18 Compact Flash
17
41
16 Card
40
15
39
14
38
13
37
12
36
11
35
10
RB7 34
9
33
RB6 8
32
7
RB5 31
6
30
5
RB4 29
4
28
RB3 3
27
2
RB2 26
1
RB1
RB0
R25 VCC
10K
page
mikroElektronika: Development tools - Books - Compilers
141
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
EEPROM Library
EEPROM data memory is available with a number of PICmicros. mikroPascal
includes library for comfortable work with EEPROM.
Library Routines
Eeprom_Read
Eeprom_Write
Eeprom_Read
Description Reads data from 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 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
142
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Eeprom_Write
Description Writes data to 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 EEADRH register appropriately.
Be aware that all interrupts will be disabled during execution of Eeprom_Write routine
(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($32);
Library Example
The example writes values at 20 successive locations of EEPROM. Then, it reads the written data
and prints on PORTB for a visual check.
program Eeprom_Test;
var i, j : byte;
begin
TRISB := 0;
for i := 0 to 20 do
Eeprom_Write(i, i + 6);
for i := 0 to 20 do
begin
PORTB := Eeprom_Read(i);
for j := 0 to 200 do
Delay_us(500);
end;
end.
page
mikroElektronika: Development tools - Books - Compilers
143
mikroPASCAL
mikroPASCAL - Pascal 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
144
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal 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.
Eth_Set_Ip_Address
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 procedure 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
mikroElektronika: Development tools - Books - Compilers
145
mikroPASCAL
mikroPASCAL - Pascal 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
146
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Eth_Get_Ip_Hdr_Len
Description Function 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 prop-
erly 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
mikroElektronika: Development tools - Books - Compilers
147
mikroPASCAL
mikroPASCAL - Pascal 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
148
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal 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
mikroElektronika: Development tools - Books - Compilers
149
mikroPASCAL
mikroPASCAL - Pascal 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
150
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal 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
mikroElektronika: Development tools - Books - Compilers
151
mikroPASCAL
mikroPASCAL - Pascal 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
152
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal 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
mikroElektronika: Development tools - Books - Compilers
153
mikroPASCAL
mikroPASCAL - Pascal 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 proce-
dure, user must prepare the data to be sent through TCP; see Eth_Set_Tcp_Data.
Example Eth_Tcp_Response();
page
154
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal 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
RD3
RTL8019AS
89 42
Vdd SD6
90 41
SD13 SD5
91
SD12 U5 SD4
40 RD2
92 39
SD11 SD3
93
94
SD10 SD2 38
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
mikroElektronika: Development tools - Books - Compilers
155
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
The ENC28J60 meets all of the IEEE 802.3 specifications. It incorporates a num-
ber of packet filtering schemes to limit incoming packets. It also provides an inter-
nal DMA module for fast data throughput and hardware assisted IP checksum cal-
culations. Communication with the host controller is implemented via two inter-
rupt pins and the SPI, with data rates of up to 10 Mb/s. Two dedicated pins are
used for LED link and network activity indication.
Note: For advanced users there is a header in Uses\P16 and Uses\P18 folder
("enc28j60_libprivate.pas") with detailed description of all functions which are
implemented in SPI Ethernet Library.
Library Routines
SPI_Ethernet_Init
SPI_Ethernet_doPacket
SPI_Ethernet_putByte
SPI_Ethernet_getByte
SPI_Ethernet_UserTCP
SPI_Ethernet_UserUDP
page
156
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
SPI_Ethernet_Init
Returns Nothing.
Description Initialize ENC controller. This function is splited into 2 parts to help linker when com-
ing short of memory.
SPI_Ethernet_doPacket
Returns Nothing.
Requires SPI_Ethernet_init must have been called before using this function. This function
must be called as often as possible by user.
Example SPI_Ethernet_doPacket;
page
mikroElektronika: Development tools - Books - Compilers
157
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
SPI_Ethernet_putByte
Returns Nothing.
Requires SPI_Ethernet_init must have been called before calling this function.
Example SPI_Ethernet_putByte(0xa0);
SPI_Ethernet_getByte
Requires SPI_Ethernet_init must have been called before calling this function.
Example b := SPI_Ethernet_getByte;
page
158
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
SPI_Ethernet_UserTCP
Returns Returns the length in bytes of the HTTP reply, or 0 if nothing to transmit.
Description This function is called by the library. The user accesses to the HTTP request by succes-
sive calls to SPI_Ethernet_getByte the user puts data in the transmit buffer by succes-
sive calls to SPI_Ethernet_putByte the function must return the length in bytes of the
HTTP reply, or 0 if nothing to transmit. If you don't need to reply to HTTP requests, just
define this function with a return(0) as single statement.
Requires SPI_Ethernet_init must have been called before calling this function.
Example
SPI_Ethernet_UserUDP
Returns Returns the length in bytes of the UDP reply, or 0 if nothing to transmit.
Description This function is called by the library. The user accesses to the UDP request by succes-
sive calls to SPI_Ethernet_getByte. The user puts data in the transmit buffer by succes-
sive calls to SPI_Ethernet_putByte. The function must return the length in bytes of the
UDP reply, or 0 if nothing to transmit. If you don't need to reply to UDP requests,just
define this function with a return(0) as single statement.
Requires SPI_Ethernet_init must have been called before calling this function.
Example
page
mikroElektronika: Development tools - Books - Compilers
159
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Library Example
The following example is a simple demonstration of the SPI Ethernet Library. PIC
is assigned an IP address of 192.168.20.60, and will respond to ping if connected
to a local area network.
program enc_ethernet;
uses enc_eth;
{***********************************
* RAM variables
*}
var myMacAddr : array[6] of byte {= (0x00, 0x14, 0xA5, 0x76, 0x19, 0x3f)} ;
// my MAC address
myIpAddr : array[4] of byte {= (192, 168, 20, 60)} ;
// my IP address
begin
ADCON1 := 0x00 ; // ADC convertors will be used
PORTA := 0 ;
TRISA := 0xff ; // set PORTA as input for ADC
PORTB := 0 ;
TRISB := 0xff ; // set PORTB as input for buttons
PORTD := 0 ;
TRISD := 0 ; // set PORTD as output
httpCounter := 0;
myMacAddr[0] := 0x00;
myMacAddr[1] := 0x14;
myMacAddr[2] := 0xA5;
myMacAddr[3] := 0x76;
myMacAddr[4] := 0x19;
myMacAddr[5] := 0x3F;
myIpAddr[0] := 192;
myIpAddr[1] := 168;
myIpAddr[2] := 20;
myIpAddr[3] := 60;
// continues ...
page
160
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
// continued ...
{*
* starts ENC28J60 with :
* reset bit on RC0
* CS bit on RC1
* my MAC & IP address
* full duplex
*}
{*
* add your stuff here if needed
* SPI_Ethernet_doPacket() must be called as often as possible
* otherwise packets could be lost
*}
end;
end.
page
mikroElektronika: Development tools - Books - Compilers
161
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
HW Connection
PIC18F452
VCC
11
VCC
12
GND
13
OSC1
14
OSC2
15
RC0
8 Mhz 16
RC1
24
RC5
18 23
RC3 RC4
LD2 LD3
VCC LED LED
VCC3
E3 R2 R3
10uF
ENC28J60
500 500
1 28
VCAP VCC
2 27
1 14 GND LEDA
1A VCC 3 26
74HCT08N
2 13 CLKOUT LEDB
1B 4B 4 25
3 12 INT OSC-VCC
1Y 4A 5 24
4 11 WOL OSC2
2A 4Y 3B 6 23
5 10 SO OSC1
2B 3B RC5 7 22
6 9 SI OSCGND
2Y 3A RC3 8 21 25 MHz
7 8 RC4 SCK PLL-GND
GND 3Y RC1 9 20
CS PLL-VCC
RC0 10 19
RESET RX-VCC
11 18
GND-RX TX-GND R4
12 17
TPIN- TPOUT+ 51
13 16
TPIN+ TPOUT- R5
14 15
RBIAS TX-VCC 51
R1
2K
VCC3
R6
L1 51
FERRITE
BEAD R7
RJ45 51
12 11
K2 A2 1
TD+
3
CT
2
TD-
7
RD+
6
CT
8
RD-
K1 A1
C4 C3
10 9
100nF 10nF
page
162
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Flash_Read
Prototype function Flash_Read(address : word) : byte; // PIC16
function Flash_Read(address : longint) : byte; // PIC18
Flash_Write
Prototype procedure Flash_Write(Address : word; var Data : array[4] of
word); // PIC16
procedure Flash_Write(Address : longint; var Data : array[64] of
word); // PIC18
Description Writes chunk of data to Flash memory. With PIC18, data needs to be exactly 64 bytes in
size. The function erases target memory before writing data to it. This means that if
write was unsuccessful, previous data will be lost.
Example // Write consecutive values in 64 consecutive locations
for i := 0 to 63 do
toWrite[i] := i;
page
mikroElektronika: Development tools - Books - Compilers
163
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Flash_Erase
Prototype procedure Flash_Erase(address : word);
Description Erases 32 bytes memory block starting from a given address. Implemented only for
those MCU's whose flash memory does not support erase-and-write operations (refer to
datasheet for details).
Example //Erase 32 byte memory memory block, starting from address $0D00:
Flash_Erase($0D00);
Library Example
The example writes 64 consecutive values to 64 consecutive locations in flash memory. Then, it
verifies the written data, with error indication on PORTB.
// For PIC18
program flash_pic18;
var i : byte ;
addr : longint;
dataRd : byte;
dataWr : array[64] of byte ;
begin
PORTB := 0;
TRISB := 0;
for i := 0 to 63 do
dataWr[i] := i;
addr := 0x00000A30;
for i := 0 to 63 do
begin
dataRd := Flash_Read(addr);
PORTB := dataRd;
addr := addr + 1;
Delay_ms(200);
end;
end.
page
164
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
I2C Library
I²C full master MSSP unit is available with a number of PIC MCU models.
mikroPascal provides I2C library which supports the master I²C mode.
Note: Certain PICmicros with two I²C modules, such as P18F8722, require you to
specify the module you want to use. Simply append the number 1 or 2 to a I2C.
For example, I2C2_Wr; Also, for the sake of backward compabitility with previ-
ous compiler versions and easier code management, MCU's with multiple I2C
modules have I²C library which is identical to I2C1 (i.e. you can use I2C_Init;
instead of I2C1_Init; for I²C operations).
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
mikroElektronika: Development tools - Books - Compilers
165
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
I2C_Start
Requires I²C must be configured before using this function. See I2C_Init.
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
166
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
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 tmp := 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($A3);
I2C_Stop
Requires I²C must be configured before using this function. See I2C_Init.
page
mikroElektronika: Development tools - Books - Compilers
167
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Library Example
This code demonstrates use of I2C Library procedures and functions. PIC MCU is connected (pins
SCL, SDA) 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 (figure on the following page shows how to interface 24c02 to PIC).
program Eeprom_Test;
begin
I2C_Init(100000); // Initialize full master mode
TRISD := 0; // PORTD is output
PORTD := $FF; // Initialize PORTD
I2C_Start; // Issue I2C start signal
I2C_Wr($A2); // Send byte via I2C(command to 24cO2)
EE_adr := 2;
I2C_Wr(EE_adr); // Send byte(address for EEPROM)
EE_data := $AA;
I2C_Wr(EE_data); // Send data(data that will be written)
I2C_Stop; // Issue I2C stop signal
// Endless loop
while true do nop;
end.
page
168
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
HW Connection
VCC VCC
1 8
A0 Vcc
2 7
PIC18F452
A1 WP
VCC 3 6
NC SCL
4 5
GND SDA
24C02
10K
10K
11
VCC
12
GND
13
OSC1
14
OSC2
18 23
RC3 RC4
8 Mhz
page
mikroElektronika: Development tools - Books - Compilers
169
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Keypad Library
mikroPascal 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 procedure needs to be called before using other
routines from 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
170
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
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
mikroElektronika: Development tools - Books - Compilers
171
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
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.
program keypad_test;
begin
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
Lcd_Out(1, 1, 'Key :');
Lcd_Out(2, 1, 'Times:');
repeat
begin
kp := 0;
Inc(cnt);
page
172
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
HW Connection
40
RB7
39
RB6 1 2 3 A
38
RB5
37
RB4
36 4 5 6 B
RB3
PIC18F452
35
VCC RB2
34
RB1
7 8 9 C
33
RB0
0 # D
*
11
VCC
12
GND
13 KEYPAD
OSC1 4X4
14
OSC2
R-SIL 8/9
10K
8 Mhz
page
mikroElektronika: Development tools - Books - Compilers
173
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
mikroPascal provides a library for communicating with commonly used LCD (4-
bit interface). Figures showing HW connection of PIC and LCD are given at the
end of the chapter.
Library Routines
Lcd_Config
Lcd_Init
Lcd_Out
Lcd_Out_Cp
Lcd_Chr
Lcd_Chr_Cp
Lcd_Cmd
Lcd_Config
Description Initializes LCD data port and control port with pin settings you specify.
Example Lcd_Config(PORTD,3,2,1,0,PORTB,2,3,4);
page
174
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
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
mikroElektronika: Development tools - Books - Compilers
175
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
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 page 140.
page
176
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
LCD Commands
page
mikroElektronika: Development tools - Books - Compilers
177
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
program Lcd_default_test;
var text: array[20] of char;
begin
TRISB := 0; // PORTB is output
Lcd_Init(PORTB); // Initialize LCD on PORTB
Lcd_Cmd(Lcd_CURSOR_OFF); // Turn off cursor
text := 'mikroElektronika';
Lcd_Out(1, 1, text); // Print text at LCD
end.
page
178
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Hardware Connection
VCC
RB1
RB2
RB0
RD2
RB7
RD7
RC7
RB3
RD3
VDD
RB6
RD6
RC6
RB5
RD5
RC5
RB4
RD4
RC4
VSS
PICxxxx
MCLR
OSC1
OSC2
VDD
VSS
RD1
RA0
RA1
RA2
RA3
RA4
RA5
RC0
RC1
RC3
RD0
RE2
RC2
RE0
RE1
8 MhZ
14
D7
D6
D5
D4
D3
D2
D1
D0
E
R/W
RS
VEE
VCC
GND
Adjustment
1
Contrast
VCC
5K
P4
page
mikroElektronika: Development tools - Books - Compilers
179
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Library Routines
Lcd8_Init
Lcd8_Out
Lcd8_Out_Cp
Lcd8_Chr
Lcd8_Chr_Cp
Lcd8_Cmd
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
page
180
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
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
mikroElektronika: Development tools - Books - Compilers
181
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
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 140.
page
182
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
program Lcd8_default_test;
var text: array[20] of char;
begin
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
text := 'mikroElektronika';
Lcd8_Out(1, 1, text); // Print text at LCD
end.
Hardware Connection
MCLR RB7
RA0 RB6 E
R/W
RA1 RB5
RS
RA2 RB4
RA3 RB3
VCC RA4 RB2
VCC
PICxxxx
RA5 RB1
RE0 RB0
RE1 VDD
Contrast
RE2 VSS
P3 Adjustment D7
5K VDD RD7
D6
VSS RD6
D5
OSC1 RD5
D4
OSC2 RD4
1 14 RC0 RC7
GND
VCC
VEE
R/W
8 MhZ
D1
RS
D0
D2
D3
D7
D6
D5
D4
E
RC1 RC6
RC2 RC5
RC3 RC4
D0 D3
RD0 RD3
D1 D2
RD1 RD2
page
mikroElektronika: Development tools - Books - Compilers
183
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
GLCD Library
mikroPascal provides a library for drawing and writing on Graphic LCD. These
routines work with commonly used GLCD 128x64, and work only with the PIC18
family.
Library Routines
Basic routines:
Glcd_Init
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
page
184
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Glcd_Init
Prototype procedure Glcd_Init(var ctrlport : byte; cs1, cs2, rs, rw, rst,
en : byte; var dataport : byte);
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 procedure needs to be called befored using other routines of GLCD library.
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_Set_Side(0);
page
mikroElektronika: Development tools - Books - Compilers
185
mikroPASCAL
mikroPASCAL - Pascal 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
186
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal 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
mikroElektronika: Development tools - Books - Compilers
187
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Glcd_Line
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
188
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal 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).
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).
page
mikroElektronika: Development tools - Books - Compilers
189
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Glcd_Set_Font
Description Sets the font for text display routines, Glcd_Write_Char and Glcd_Write_Text.
Font needs to be formatted as an array of byte. Parameter font_address specifies the
address of the font; you can pass a font name with the @ operator. 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 should not exceed 8 dots. Parameter
font_offset determines the ASCII character from which the supplied font starts.
Demo fonts supplied with the library have an offset of 32, which means that they start
with space.
Example // Use the custom 5x7 font "myfont" which starts with space (32):
Glcd_Set_Font(@myfont, 5, 7, 32);
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 writes a “white” letter (clear dots),
1 writes a solid letter (put dots), and 2 writes a “smart” letter (invert each dot).
Use routine Glcd_Set_Font to specify font, or the default 5x7 font (included with the
library) will be used.
Requires GLCD needs to be initialized, see Glcd_Init. Use the Glcd_Set_Font to specify the
font for display; if no font is specified, the default 5x8 font supplied with the library will
be used.
page
190
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
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).
Use routine Glcd_Set_Font to specify font, or the default 5x7 font (included with the
library) will be used.
Requires GLCD needs to be initialized, see Glcd_Init. Use the Glcd_Set_Font to specify the
font for display; if no font is specified, the default 5x8 font supplied with the library will
be used.
Glcd_Image
Description Displays bitmap image on the GLCD. Parameter image should be formatted as an array
of 1024 bytes. Use the mikroPascal’s integrated Bitmap-to-LCD editor (menu option
Tools > Graphic LCD Editor) to convert image to a constant array suitable for display
on GLCD.
Example Glcd_Image(my_image);
page
mikroElektronika: Development tools - Books - Compilers
191
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Library Example
program Glcd_Test;
var j, k : byte;
begin
Glcd_Init(PORTB, 2, 0, 3, 5, 7, 1, PORTD);
repeat
begin
// Draw circles
Glcd_Fill(0); // Clear screen
Glcd_Write_Text('Circles', 0, 0, 1);
j := 4;
while j < 31 do
begin
Glcd_Circle(63, 31, j, 2);
j := j + 4;
end;
Delay_ms(4000);
// Draw boxes
Glcd_Fill(0); // Clear screen
Glcd_Write_Text('Rectangles', 0, 0, 1);
j := 0;
while j < 31 do
begin
Glcd_Box(j, 0, j + 20, j + 25, 2);
j := j + 4;
end;
Delay_ms(4000);
end
until FALSE;
end.
page
192
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple...
RST
Hardware Connection
E
D1
Vo
D0
D2
D3
D7
D6
D5
D4
RS
D5
Vee
CS1
CS2
R/W
RST
VCC
GND
LED-
OSC1 RD5
LED+
D4
OSC2 RD4
PICxxxx
page
193
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Library Routines
T6963C_Init
T6963C_writeData
T6963C_writeCommand
T6963C_setPtr
T6963C_waitReady
T6963C_fill
T6963C_dot
T6963C_write_char
T6963C_write_text
T6963C_line
T6963C_rectangle
T6963C_box
T6963C_circle
T6963C_image
T6963C_sprite
T6963C_set_cursor
T6963C_clearBit
T6963C_setBit
T6963C_negBit
T6963C_displayGrPanel
T6963C_displayTxtPanel
T6963C_setGrPanel
T6963C_setTxtPanel
T6963C_panelFill
T6963C_grFill
T6963C_txtFill
T6963C_cursor_height
T6963C_graphics
T6963C_text
T6963C_cursor
T6963C_cursor_blink
T6963C_Init_240x128
T6963C_Init_240x64
page
194
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
T6963C_init
Prototype procedure T6963C_init(width, height, fntW : word; var data :
word; var cntrl : word; wr, rd, cd, rst : word);
Description Initalizes the Graphic Lcd controller. This function must be called before all T6963C
Library Routines.
width - Number of horizontal (x) pixels in the display.
height - Number of vertical (y) pixels in the display.
fntW - Font width, number of pixels in a text character, must be set accordingly to the
hardware.
data - Address of the port on which the Data Bus is connected.
cntrl - Address of the port on which the Control Bus is connected.
wr - !WR line bit number in the *cntrl port.
rd - !RD line bit number in the *cntrl port.
cd - !CD line bit number in the *cntrl port.
rst - !RST line bit number in the *cntrl port.
Display RAM :
The library doesn't know the amount of available RAM.
The library cuts the RAM into panels : a complete panel is one graphics panel followed
by a text panel, The programer has to know his hardware to know how much panel he
has.
Requires Nothing.
page
mikroElektronika: Development tools - Books - Compilers
195
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
T6963C_writeData
Prototype procedure T6963C_writeData(data : byte);
Example T6963C_writeData(AddrL);
T6963C_writeCommand
Prototype procedure T6963C_writeCommand(data : byte);
Example T6963C_writeCommand(T6963C_CURSOR_POINTER_SET);
T6963C_setPtr
Prototype procedure T6963C_setPtr(p : word; c : byte);
T6963C_waitReady
Prototype procedure T6963C_waitReady;
Description This routine pools the status byte, and loops until ready.
Example T6963C_waitReady;
page
196
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
T6963C_fill
Prototype procedure T6963C_fill(v : byte; start, len : word);
Description This routine fills length with bytes to controller memory from start address.
Example T6963C_fill(0x33,0x00FF,0x000F);
T6963C_dot
Prototype procedure T6963C_dot(x, y : integer; color : byte);
Description This sets current text work panel. It writes string str row x line y. mode =
T6963C_ROM_MODE_[OR|EXOR|AND].
T6963C_write_char
Prototype procedure T6963C_write_char(c, x, y, mode : byte);
T6963C_write_text
Prototype procedure T6963C_write_text(var str : array[10] of byte; x, y,
mode : byte);
page
mikroElektronika: Development tools - Books - Compilers
197
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
T6963C_line
Prototype procedure T6963C_line(x0, y0, x1, y1 : integer; pcolor : byte);
T6963C_rectangle
Prototype procedure T6963C_rectangle(x0, y0, x1, y1 : integer; pcolor :
byte);
T6963C_box
page
198
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
T6963C_circle
Prototype procedure T6963C_circle(x, y : integer; r : longint; pcolor :
word);
T6963C_image
Prototype procedure T6963C_image(const pic : ^byte);
Example T6963C_image(my_image);
T6963C_sprite
Prototype procedure T6963C_sprite(px, py : byte; const pic : ^byte; sx, sy
: byte);
page
mikroElektronika: Development tools - Books - Compilers
199
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
T6963C_set_cursor
Prototype procedure T6963C_set_cursor(x, y : byte);
T6963C_clearBit
Prototype procedure T6963C_clearBit(b : byte);
Example T6963C_clearBit(b);
T6963C_setBit
Prototype procedure T6963C_setBit(b : byte);
Example T6963C_setBit(b);
T6963C_negBit
Prototype procedure T6963C_negBit(b : byte);
Example T6963C_negBit(b);
page
200
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
T6963C_displayGrPanel
Prototype procedure T6963C_displayGrPanel(n : word);
Example T6963C_displayGrPanel(n);
T6963C_displayTxtPanel
Prototype procedure T6963C_displayTxtPanel(n : word);
Example T6963C_displayTxtPanel(n);
T6963C_setGrPanel
Prototype procedure T6963C_setGrPanel(n : word);
Example T6963C_setGrPanel(n);
T6963C_setTxtPanel
Prototype procedure T6963C_setTxtPanel(n : word);
Example T6963C_setTxtPanel(n);
page
mikroElektronika: Development tools - Books - Compilers
201
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
T6963C_panelFill
Prototype procedure T6963C_panelFill(v : word);
Example T6963C_panelFill(v);
T6963C_grFill
Prototype procedure T6963C_grFill(v: word);
Example T6963C_grFill(v);
T6963C_txtFill
Prototype procedure T6963C_txtFill(v : word);
Example T6963C_txtFill(v);
T6963C_cursor_height
Prototype procedure T6963C_cursor_height(n: word);
Example T6963C_cursor_height(n);
page
202
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
T6963C_graphics
Prototype procedure T6963C_graphics(n : word);
Example T6963C_graphics(1);
T6963C_text
Prototype procedure T6963C_text(n : word);
Example T6963C_text(1);
T6963C_cursor
Prototype procedure T6963C_cursor(n : word);
Example T6963C_cursor(1);
T6963C_cursor_blink
Prototype procedure T6963C_cursor_blink(n : word);
Example T6963C_cursor_blink(0);
page
mikroElektronika: Development tools - Books - Compilers
203
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
T6963C_Init_240x128
Prototype procedure T6963C_Init_240x128;
Description Initialize T6963C based GLCD (240x128 pixels) with default settings for mE GLCD's.
Example T6963C_Init_240x128;
T6963C_Init_240x64
Prototype procedure T6963C_Init_240x64;
Description Initialize T6963C based GLCD (240x64 pixels) with default settings for mE GLCD's.
Example T6963C_Init_240x64;
Library Example
The following drawing demo tests advanced routines of T6963C GLCD library.
program T6963C;
uses bitmap, bitmap2;
var panel : byte; // current panel
i : word; // general purpose register
curs : byte; // cursor visibility
cposx,
cposy : word; // cursor x-y position
begin
TRISC := 0xFFFF;
TRISB := 0x0000;
PORTD := 0 ;
TRISD := 0 ;
{* init display for 240 pixel width and 128 pixel height
* 8 bits character width
* data bus on PORTD
* control bus on PORTB
* bit 3 is !WR
* bit 2 is !RD
* bit 1 is !CD
* bit 5 is RST}
T6963C_init(240, 128, 8, PORTD, PORTB, 3, 2, 1, 5) ;
// enable both graphics and text display at the same time
T6963C_graphics(1) ;
T6963C_text(1) ;
//continues...
page
204
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
//continues...
panel := 0;
i := 0;
curs := 0;
cposy := 0;
cposx := 0;
{*
* text messages
*}
T6963C_write_text(' GLCD LIBRARY DEMO, WELCOME !', 0, 0,
T6963C_ROM_MODE_XOR) ;
T6963C_write_text(' EINSTEIN WOULD HAVE LIKED mC', 0, 15,
T6963C_ROM_MODE_XOR) ;
{*
* cursor
*}
T6963C_cursor_height(8); // 8 pixel height
T6963C_set_cursor(0, 0); // move cursor to top left
T6963C_cursor(0) ; // cursor off
{*
* draw rectangles
*}
T6963C_rectangle(0, 0, 239, 127, T6963C_WHITE) ;
T6963C_rectangle(20, 20, 219, 107, T6963C_WHITE) ;
T6963C_rectangle(40, 40, 199, 87, T6963C_WHITE) ;
T6963C_rectangle(60, 60, 179, 67, T6963C_WHITE) ;
{*
* draw a cross
*}
T6963C_line(0, 0, 239, 127, T6963C_WHITE) ;
T6963C_line(0, 127, 239, 0, T6963C_WHITE) ;
{*
* draw solid boxes
*}
T6963C_box(0, 0, 239, 8, T6963C_WHITE) ;
T6963C_box(0, 119, 239, 127, T6963C_WHITE) ;
//continued...
page
mikroElektronika: Development tools - Books - Compilers
205
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
{*
* draw circles
*}
T6963C_circle(120, 64, 10, T6963C_WHITE) ;
T6963C_circle(120, 64, 30, T6963C_WHITE) ;
T6963C_circle(120, 64, 50, T6963C_WHITE) ;
T6963C_circle(120, 64, 70, T6963C_WHITE) ;
T6963C_circle(120, 64, 90, T6963C_WHITE) ;
T6963C_circle(120, 64, 110, T6963C_WHITE) ;
T6963C_circle(120, 64, 130, T6963C_WHITE) ;
T6963C_image(mikroPascal_logo_glcd_bmp);
// fill the graphic screen with a picture
while true do
begin
{*
* if RC0 is pressed, toggle the display between positive
and negative mode
*}
if(PORTC.0 <> 0) then
begin
//PORTC.1 := PORTC.1 xor 1;
Delay_ms(300) ;
end
{*
* if RC1 is pressed, toggle the display between graphic
panel 0 and graphic 1
*}
else
if(PORTC.1 <> 0) then
begin
panel := panel + 1;
panel := panel and 1 ;
T6963C_displayGrPanel(panel) ;
Delay_ms(300) ;
end
page
206
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
{*
* if RC2 is pressed, display only graphic panel
*}
else
if(PORTC.2 <> 0) then
begin
T6963C_graphics(1) ;
T6963C_text(0) ;
Delay_ms(300) ;
end
{*
* if RC3 is pressed, display only text panel
*}
else
if(PORTC.3 <> 0) then
begin
T6963C_graphics(0) ;
T6963C_text(1) ;
Delay_ms(300) ;
end
{*
* if RC4 is pressed, display text and graphic panels
*}
else
if(PORTC.4 <> 0) then
begin
T6963C_graphics(1) ;
T6963C_text(1) ;
Delay_ms(300) ;
end
page
mikroElektronika: Development tools - Books - Compilers
207
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
{*
* if RC5 is pressed, change cursor
*}
else
if(PORTC.5 <> 0) then
begin
curs := curs + 1;
if(curs = 3) then
curs := 0 ;
case curs of
0:
T6963C_cursor(0) ;
1:
begin
T6963C_cursor(1) ;
T6963C_cursor_blink(1) ;
end;
2:
begin
T6963C_cursor(1) ;
T6963C_cursor_blink(0) ;
end;
end;
Delay_ms(300) ;
end;
{*
* move cursor, even if not visible
*}
cposx := cposx + 1;
if(cposx = T6963C_txtCols) then
begin
cposx := 0 ;
cposy := cposy + 1;
if(cposy = (T6963C_grHeight div T6963C_CHARACTER_HEIGHT)) then
cposy := 0 ;
end;
T6963C_set_cursor(cposx, cposy) ;
Delay_ms(100) ;
end;
end.
page
208
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Hardware Connection
PIC18F452
VCC
11 30 D7
VCC RD7
12 29 D6
GND RD6
13 28 D5
OSC1 RD5
14 27 D4
OSC2 RD4
8 Mhz RS 16
RC1
R/W 17 24 RST
RC2 RC5
E 18
RC3
D0 19 22 D3
RD0 RD3
D1 20 21 D2
RD1 RD2
Contrast
Adjustment
P1
10K
VCC
VCC
R1
50
1 20
VDD
LED+
VSS
RST
VEE
R/W
MD
CE
RS
D0
D5
D7
D1
D3
D2
D4
D6
FS
Vo
mikroE
EasyPIC3
Dev. tool
page
mikroElektronika: Development tools - Books - Compilers
209
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
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
Man_Synchro
page
210
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Man_Receive_Config
Description The procedure 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 procedure 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 procedure 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
mikroElektronika: Development tools - Books - Compilers
211
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
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.
Example Man_Send(msg);
page
212
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Man_Synchro
Description This function returns half of the manchester bit length. The length is given in multiples
of 10us. It is assumed that one bit lasts no more than 255*10us = 2550 us.
Requires To use this function, you must first prepare the PIC for sending. See
Man_Send_Config or Man_Send_Init.
Library Example
The following example transmits message in Manchester code. Message is delimited by markers
$0B and $0E.
program RF_TX;
var i : byte;
var msg : string[20];
begin
msg := 'mikroElektronika';
PORTB := 0; // Initialize port
TRISB := %00001110;
ClearBit(INTCON, GIE); // Disable interrupts
Man_Send_Init(PORTB); // Initialize Manchester sender
while TRUE do
begin
Man_Send($0B); // Send start marker
Delay_ms(100); // Wait for a while
for i := 1 to Strlen(msg) do
begin
Man_Send(msg[i]); // Send char
Delay_ms(90);
end;
Man_Send($0E); // Send end marker
Delay_ms(1000);
end;
end.
page
mikroElektronika: Development tools - Books - Compilers
213
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
The following code receives messages sent by the previous example, and prints it on LCD. Each
error in the received string will be indicated by a quotation mark.
program RRX;
var error, ErrorCount, temp : byte;
begin
ErrorCount := 0;
TRISB := 0;
CMCON := 7;
// VRCON = 0; // Uncomment the line for PIC16
Lcd_Init(PORTB); // Initialize LCD on PORTB
Lcd_Cmd(Lcd_CLEAR);
Man_Receive_Config(PORTA,3); // Configure and synchronize receiver
while true do
Lcd_Cmd(Lcd_FIRST_ROW);
repeat
begin
temp = Man_Receive(error); // Attempt byte receive
if error = true then
begin
Lcd_Chr_Cp(63); // ASCII for "?"
Inc(ErrorCount);
if ErrorCount > 20 then
begin
Man_Receive_Init(PORTA);
// alternative:
// temp := Man_Synchro;
ErrorCount := 0;
end;
else
if temp <> $0E then // Don't write the end marker on LCD
Lcd_Chr_Cp(temp);
Delay_ms(20);
end;
end;
until temp = $0E; // Wait for the end marker
end;
end.
page
214
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Hardware Connection
Transmitter RF
module
PIC18F452
VCC
Antenna
11
VCC VCC
12
GND
13
OSC1
14
OSC2
8 Mhz
VCC
19
A RT4 In RD0
GND
page
mikroElektronika: Development tools - Books - Compilers
215
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Receiver RF
module
Antenna
PIC18F452
VCC
11
VCC
12
GND
RR4 13
14
OSC1
OSC2
Receiver RF
8 Mhz
module
20
RD1
VCC
page
216
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
mikroPascal provides a library for accessing data on Multi Media Card via SPI
communication.
Note: Multi Media Card Library works only with PIC18 family.
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_Fat_Set_File_Date
Mmc_Fat_Get_File_Date
Mmc_Fat_Get_File_Size
Mmc_Fat_Get_Swap_File
page
mikroElektronika: Development tools - Books - Compilers
217
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Mmc_Init
Returns Returns 0 if MMC card is present and successfully initialized, otherwise returns 1.
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
MMC card is present and successfully initialized, otherwise returns 1. Mmc_Init needs
to be called before using other functions of this library.
Requires Spi_Init_Advanced(MASTER_OSC_DIV16, DATA_SAMPLE_MIDDLE,
CLK_IDLE_LOW, LOW_2_HIGH); must be called before initializing Mmc_Init.
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.
page
218
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
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.
Mmc_Read_Cid
Description Function reads CID register and returns 16 bytes of content into
data_for_registers.
page
mikroElektronika: Development tools - Books - Compilers
219
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Mmc_Read_Csd
Description Function reads CSD register and returns 16 bytes of content into
data_for_registers.
Mmc_Fat_Init
Returns Returns 0 if initialization is successful, 1 if boot sector was not found and 255 if card
was not detected.
Description Initializes hardware SPI communication; designated CS line for communication is given
by parameters mmcport and mmcpin. The function returns a non-zero value if MMC
card is present and successfully initialized, otherwise it returns 0.
This function needs to be called before using other functions of MMC FAT library.
page
220
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Mmc_Fat_Assign
Description This function designates (“assigns”) the file we’ll be working with. The function looks
for the file specified by the filename in the root directory. If the file is found, routine
will initialize it by getting its start sector, size, etc. If the file is not found, an empty file
will be created with the given name, if allowed.
Whether the new file will be created or not is controlled by the parameter
create_file - setting it to zero will prevent creation of new file, while giving it any
non-zero value will do the opposite.
page
mikroElektronika: Development tools - Books - Compilers
221
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Mmc_Fat_Reset
Description Procedure 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(size);
Mmc_Fat_Rewrite
Description Procedure resets the file pointer and clears the assigned file, so that new data can be
written into the file.
Example Mmc_Fat_Rewrite();
Mmc_Fat_Append
Description The procedure 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
222
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Mmc_Fat_Read
Description Procedure reads the byte at which the file pointer points to and stores data into parame-
ter data. The file pointer automatically increments with each call of Mmc_Fat_Read.
Requires The file must be assigned, see Mmc_Fat_Assign. Also, file pointer must be initialized;
see Mmc_Fat_Reset.
Example Mmc_Fat_Read(mydata);
Mmc_Fat_Write
Description Procedure writes a chunk of bytes (fdata) to the currently assigned file, at the position
of the file pointer.
Requires The file must be assigned, see Mmc_Fat_Assign. Also, file pointer must be initialized;
see Mmc_Fat_Append or Mmc_Fat_Rewrite.
Example Mmc_Fat_Write(txt);
Mmc_Fat_Write('Hello' + #13 + 'world');
Mmc_Fat_Set_File_Date
Description Writes system timestamp to a file. Use this routine before each writing to file; other-
wise, the file will be appended an unknown timestamp.
page
mikroElektronika: Development tools - Books - Compilers
223
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Mmc_Fat_Get_File_Date
Description Retrieves date and time for the currently selected file. Seconds are not being retrieved
since they are written in 2-sec increments.
Mmc_Fat_Get_File_Size
page
224
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Mmc_Fat_Get_File_Size
Returns No. of start sector for the newly created swap file, if swap file was created; otherwise,
the function returns zero.
Description This function is used to create a swap file on the MMC/SD media. It accepts as sec-
tors_cnt argument the number of consecutive sectors that user wants the swap file to
have. During its execution, the function searches for the available consecutive sectors,
their number being specified by the sectors_cnt argument. If there is such space on the
media, the swap file named MIKROSWP.SYS is created, and that space is designated
(in FAT tables) to it. The attributes of this file are: system, archive and hidden, in order
to distinct it from other files. If a file named MIKROSWP.SYS already exists on the
media, this function deletes it upon creating the new one.
The purpose of the swap file is to make reading and writing to MMC/SD media as fast
as possible, without potentially damaging the FAT system. Swap file can be considered
as a "window" on the media where user can freely write/read the data, in any way (s)he
wants to. Its main purpose in mikroPascal library is to be used for fast data acquisition;
when the time-critical acquisition has finished, the data can be re-written into a "nor-
mal" file, and formatted in the most suitable way.
page
mikroElektronika: Development tools - Books - Compilers
225
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
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.
program mmc_test;
var tmp : byte;
i : word;
data : array[512] of byte;
begin
Usart_Init(9600);
// Initialize SPI
Spi_Init_Advanced(MASTER_OSC_DIV16, DATA_SAMPLE_MIDDLE, CLK_IDLE_LOW,
LOW_2_HIGH);
// Initialize ports
tmp := Mmc_Init(PORTC, 2);
//** Verify: **
page
226
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Library Example
The next program tests MMC FAT routines. First, we create 5 different files in the root of MMC
card, and fill with some information. Then, we read the files and send them via USART for a
check.
program MMC_FAT_Test;
begin
Usart_Init(19200); // Set up USART for reading of files
// Initialize SPI
loop := 1;
// continues ..
page
mikroElektronika: Development tools - Books - Compilers
227
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
// .. continued
end.
page
228
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Hardware Connection
REG2
MC33269 VCC
VCC3 VCC DT-3.3
3
GND VIN
C20 C19
PIC18F452 100nF 100nF 1 2 VOUT
VCC3
E15
VCC 10uF
SPI-MISO
MMC-CS#
11 SPI-MOSI
VCC
12 SPI-SCK
GND
13 VCC3
OSC1 R13 R15 R17
14 2K2 2K2 2K2
8 Mhz OSC2
1
CS
2
Din
3
GND
4
17 24 +3.3V
RC2 RC5 5
18 23 6
SCK
GND MMC/SD
RC3 RC4
R14 R16 R18
7
Dout CARD
3K3 3K3 3K3
1 2 3 4 5 6 7
MMC
Back view
page
mikroElektronika: Development tools - Books - Compilers
229
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
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
230
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
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
mikroElektronika: Development tools - Books - Compilers
231
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Library Example
The example reads the temperature from DS1820 sensor connected to RA5. Temperature value is
continually displayed on LCD.
program onewire;
var i, j1, j2 : byte;
text : array[10] of char;
tmp_sign : byte;
begin
text := 'Temp:';
ADCON1 := 6; // configure PORTA as digital I/O
PORTA := 255; // initialize porte to 255
PORTD := 0; // initialize portb to 255
TRISA := 255; // designate porta as input
TRISD := 0; // designate portb as output
Lcd_Init(PORTD);
Lcd_Cmd(LCD_CURSOR_OFF);
Lcd_Out(1, 1, text);
Lcd_Chr(2, 12, 223); // 'degree' character
Lcd_Chr(2, 13, 'C');
repeat
Ow_Reset(PORTA, 5); // onewire reset signal
Ow_Write(PORTA, 5, $CC); // issue SKIP ROM command to DS1820
Ow_Write(PORTA, 5, $44); // issue CONVERT T command to DS1820
Delay_us(120);
i := Ow_Reset(PORTA, 5);
Ow_Write(PORTA,5, $CC); // issue SKIP ROM command to DS1820
Ow_Write(PORTA,5, $BE); // issue READ SCRATCHPAD command to DS1820
j1 := Ow_Read(PORTA, 5); // get result
j2 := Ow_Read(PORTA, 5); // get result
if j2 = $FF then
begin
tmp_sign := '-'; // temperature sign
j1 := j1 or $FF; // complement of two
j1 := j1 + $01;
end
else
tmp_sign := '+';
j2 := (j1 and $01)*5; // get decimal value
j1 := j1 shr 1; // get temp value
ByteToStr(j1, text); // whole number
Lcd_Chr(2, 7, tmp_sign);
Lcd_Chr(2, 8, text[1]);
Lcd_Chr(2, 9, text[2]);
Lcd_Chr(2, 10, '.');
ByteToStr(j2, text); // decimal
Lcd_Chr(2, 11, text[2]);
Delay_ms(500);
until false; // endless loop
end.
page
232
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Hardware Connection
125 C
PIC18F452
DS1820 -50 C VCC 7
RA5
VCC
R10
VCC
10K
VCC
11
VCC
DQ 12
GND
13
OSC1
14
OSC2
8 Mhz
page
mikroElektronika: Development tools - Books - Compilers
233
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
PS/2 Library
mikroPascal 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.
Please note:
Library Routines
Ps2_Init
Ps2_Key_Read
Ps2_Init
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 at the same pin. You need to call
Ps2_Init before using other routines of PS/2 library.
page
234
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
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. Procedure “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
mikroElektronika: Development tools - Books - Compilers
235
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Library Example
This simple example reads values of keys pressed on PS/2 keyboard and sends them via USART.
program ps2_test;
var keydata, special, down : byte;
begin
CMCON := $07; // Disable analog comparators (comment this for P18)
INTCON := 0; // Disable all interrupts
Ps2_Init(PORTA, 1, 0); // Init PS/2 Keyboard on PORTA
Delay_ms(100); // Wait for keyboard to finish
repeat
begin
if Ps2_Key_Read(keydata, special, down) = 1 then
begin
if (down = 1) and (keydata = 16) then // Backspace
// ...do something with a backspace...
else if (down = 1) and (keydata = 13) then // Enter
Usart_Write(13);
else if (down = 1) and (special = 0) and (keydata <> 0) then
Usart_Write(keydata);
end;
Delay_ms(10); // debounce
end;
until FALSE;
end.
page
236
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
PWM Library
CCP unit is available with a number of PICmicros. mikroPascal provides library
which simplifies using PWM HW Module.
Note: Certain PICmicros with two or more CCP modules, such as P18F8520,
require you to specify the module you want to use. Simply append the number 1
or 2 to a Pwm. For example, Pwm2_Start; Also, for the sake of backward com-
pabitility with previous compiler versions and easier code management, MCU's
with multiple PWM modules have PWM library which is identical to PWM1 (i.e.
you can use PWM_Init instead of PWM1_Init to initialize CCP1).
Library Routines
Pwm_Init
Pwm_Change_Duty
Pwm_Start
Pwm_Stop
Pwm_Init
Description Initializes the PWM unit with duty ratio 0. Parameter freq is a desired PWM frequency
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 in order to use this library. Check mikroC installation folder,
subfolder “Examples”, for alternate solutions.
page
mikroElektronika: Development tools - Books - Compilers
237
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
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 unit on PORTC to use this library. To use this function, unit needs to be
initalized – see Pwm_Init.
Pwm_Start
Requires You need a CCP unit on PORTC to use this library. To use this function, unit needs to be
initalized – see Pwm_Init.
Example Pwm_Start();
Pwm_Stop
Requires You need a CCP unit on PORTC to use this library. To use this function, unit needs to be
initalized – see Pwm_Init.
Example Pwm_Stop();
page
238
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Library Example
The example changes PWM duty ratio on port C continually. If LED is connected to RC2, you can
observe the gradual change of emitted light.
program Pwm_Test;
var i, j : byte;
begin
i := 0; j := 0;
PORTC := $FF; // Initialize PORTC
Pwm_Init(5000); // Initialize PWM unit, freq = 5kHz.
Pwm_Start; // Start PWM
while true do
begin
for i := 0 to 20 do Delay_us(500);
j := j + 1;
Pwm_Change_Duty(j); // Change duty ratio
end;
end.
page
mikroElektronika: Development tools - Books - Compilers
239
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Hardware Connection
PIC18F452
VCC
11
VCC
12
GND
13
OSC1
14
8 Mhz OSC2
17
RC2
300R
page
240
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal 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. mikroPascal provides a set of library routines to
provide you comfortable work with RS-485 system using Master/Slave architec-
ture. Master and Slave devices interchange packets of information, each of these
packets 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
mikroElektronika: Development tools - Books - Compilers
241
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
RS485Master_Init
RS485Master_Receive
Description Receives any message sent by Slaves. Messages are multi-byte, so this procedure 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.
Example RS485Master_Receive(msg);
page
242
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal 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
mikroElektronika: Development tools - Books - Compilers
243
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
RS485Slave_Receive
Description Receives message addressed to it. Messages are multi-byte, so this procedure 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.
Example RS485Slave_Read(msg);
RS485Slave_Send
Description Sends data from buffer to Master via RS-485; datalen is the 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
244
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal 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.
program rs485_test;
var dat : array[8] of byte; // Message buffer
i, j : byte;
procedure interrupt;
begin
if TestBit(RCSTA, OERR) = 1 then PORTD := $81;
RS485Slave_Read(dat);
end;
begin
TRISB := 0;
TRISD := 0;
USART_init(9600); // Initialize USART unit
RS485Slave_Init(PORTC, 2, 160);// Initialize MCU as Slave, address 160
SetBit(PIE1, RCIE); // Enable interrupt on byte received
SetBit(INTCON, PEIE); // via USART (RS485)
ClearBit(PIE2, TXIE);
SetBit(INTCON, GIE);
PORTB := 0;
PORTD := 0;
dat[4] := 0; // Clear "message received" flag
dat[5] := 0; // Clear error flag
while true do
begin
// If there is an error, set PORTD to $AA
if dat[5] = TRUE then PORTD := $AA;
// If message received:
if dat[4] = TRUE then
begin
dat[4] := 0; // Clear message received flag
j := dat[3]; // Number of data bytes received
for i := 1 to j do
PORTB := dat[i - 1]; // Output received data bytes
dat[0] := dat[0] + 1; // Increment received dat[0]
RS485Slave_Write(dat, 1); // Send it back to Master
end;
end;
end.
page
mikroElektronika: Development tools - Books - Compilers
245
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Hardware Connection
Shielded pair
no longer than 300m
PIC18F452
VCC
11
VCC
12
GND
VCC 13
OSC1
14
OSC2
26
RC7
1 8 25
R0 Vcc 8 Mhz RC6
17
2 7 RC2
RE B
3 6
DE A
4 5
DI GND
LTC485
VCC
620R
1 8
R0 Vcc
2 7
RE B
3 6
DE A
4 5
DI GND
620R
LTC485
4.7uF +
C1+ Vcc
MAX232
4.7uF
V+ GND
+
C1- T1 OUT
C2+ R1IN
+
PC
C2- R1out
V- T1in
4.7uF
T2out T2in
R2in R2out
RTS
+
4.7uF GND
TX
RX
page
246
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Library Routines
Soft_I2C_Config
Soft_I2C_Start
Soft_I2C_Read
Soft_I2C_Write
Soft_I2C_Stop
Soft_I2C_Config
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
mikroElektronika: Development tools - Books - Compilers
247
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
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
248
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Soft_I2C_Write
Requires START signal needs to be issued in order to use this function. See Soft_I2C_Start.
Example Soft_I2C_Write($A3);
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
mikroElektronika: Development tools - Books - Compilers
249
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Library Example
The example demonstrates use of Software I²C Library. 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 I²C from EEPROM and send its value to PORTC, to check if the cycle was successful.
Check the hardware connection scheme at hardware I2C Library.
program soft_i2c_test;
begin
Soft_I2C_Config(PORTD, 3, 4); // Initialize full master mode
TRISC := 0; // PORTC is output
PORTC := $FF; // Initialize PORTC
Soft_I2C_Start(); // Issue I2C start signal
Soft_I2C_Write($A2); // Send byte via I2C(command to 24cO2)
ee_adr := 2;
Soft_I2C_Write(ee_adr); // Send byte(address for EEPROM)
ee_data := $AA;
Soft_I2C_Write(ee_data); // Send data(data that will be written)
Soft_I2C_Stop(); // Issue I2C stop signal
page
250
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
The library configures 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.
Library Routines
Soft_Spi_Config
Soft_Spi_Read
Soft_Spi_Write
Soft_Spi_Config
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
mikroElektronika: Development tools - Books - Compilers
251
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
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
252
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Library Example
The example demonstrates using Software SPI library. Assumed HW configuration is: max7219
(chip select pin) is connected to RD1, and SDO, SDI, SCK pins are connected to corresponding
pins of max7219. Hardware connection is given on page 186.
program Soft_Spi_test;
uses m7219;
var i : byte;
begin
Soft_Spi_Config(PORTD, 4, 5, 3); // Standard configuration
TRISC := TRISC and $FD;
max7219_init; // Initialize max7219
SetBit(PORTD, 1); // Select max7219
Soft_Spi_Write(1); // Send address (1) to max7219
Soft_Spi_Write(7); // Send data (7) to max7219
ClearBit(PORTD, 1); // Deselect max7219
end.
page
mikroElektronika: Development tools - Books - Compilers
253
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
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.
Soft_Uart_Init needs to be called before using other functions from Soft UART
Library.
Example This will initialize software UART and establish the communication at 9600 bps:
page
254
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
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.
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.
Example Soft_Uart_Write($0A);
page
mikroElektronika: Development tools - Books - Compilers
255
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
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 mikroPascal terminal for RS232 communication, menu
choice Tools > Terminal.
program soft_uart_test;
begin
Soft_Uart_Init(PORTB, 1, 2, 2400, 0); // Initialize soft UART
er := 1;
while true do
begin
repeat
received_byte := Soft_Uart_Read(er); // Read received data
until er = 0;
Soft_Uart_Write(received_byte); // Send data via UART
end;
end.
page
256
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Sound Library
mikroPascal provides a Sound Library which allows you to use sound signaliza-
tion in your applications. You need a simple piezo speaker (or other hardware) on
designated 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
mikroElektronika: Development tools - Books - Compilers
257
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
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 fre-
quencies 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).
program Sound_test;
var adc_value : word;
begin
PORTB = 0; // Clear PORTB
TRISB = 0; // PORTB is output
INTCON = 0; // Disable all interrupts
ADCON1 = $82; // Configure VDD as Vref, and analog channels
TRISA = $FF; // PORTA is input
Sound_Init(PORTB, 2); // Initialize sound at RB2
while TRUE do
begin
adc_value = Adc_Read(2); // Get lower byte from ADC
Sound_Play(adc_value, 200); // Play the sound
end;
end.
page
258
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
SPI Library
SPI unit is available with a number of PIC MCU models. mikroPascal 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: Certain PICmicros with two SPI modules, such as P18F8722, require you to
specify the module you want to use. Simply append the number 1 or 2 to a Spi.
For example, Spi2_Write; Also, for the sake of backward compabitility with previ-
ous compiler versions and easier code management, MCU's with multiple SPI
modules have SPI library which is identical to SPI1 (i.e. you can use SPI_Init;
instead of SPI1_Init; for SPI operations).
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
mikroElektronika: Development tools - Books - Compilers
259
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
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
260
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
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
mikroElektronika: Development tools - Books - Compilers
261
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Library Example
The code demonstrates how to use SPI library procedures and functions. Assumed configuration
is: max7219 (chip select pin) connected to RC1, and SDO, SDI, SCK pins are connected to corre-
sponding pins of max7219.
program Spi_test;
uses m7219;
begin
Spi_Init; // Standard configuration
TRISC := TRISC and $FD;
max7219_init; // Initialize max7219
ClearBit(PORTC, 1); // Select max7219
Spi_Write(1); // Send address (1) to max7219
Spi_Write(7); // Send data (7) to max7219
SetBit(PORTC, 1); // Deselect max7219
end.
page
262
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
USART Library
USART hardware unit is available with a number of PICmicros. mikroPascal
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_Read_Text
Usart_Data_Ready Usart_Write_Text
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(9600); Also, for the sake of backward
compabitility with previous compiler versions and easier code management,
MCU's with multiple USART modules have USART library which is identical to
USART1 (i.e. you can use Usart_Init(9600); instead of Usart_Init1(9600); for
Usart operations).
Usart_Init
Description Initializes hardware USART unit 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
mikroElektronika: Development tools - Books - Compilers
263
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Usart_Data_Ready
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 unit must be initialized and communication established before using this
function. See Usart_Init.
Example // If data is ready, read it:
if Usart_Data_Ready() = 1 then receive := Usart_Read;
page
264
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Usart_Write
Requires USART HW unit must be initialized and communication established before using this
function. See Usart_Init.
Usart_Read_Text
Description Reads characters received via USART until the delimiter sequence is detected. The read
sequence is stored in the parameter output; delimiter sequence is stored in the parameter
delimiter.
This is a blocking call: the delimiter sequence is expected, otherwise the procedure exits
after 20 recieved characters.
Requires USART HW unit must be initialized and communication established before using this
function. See Usart_Init.
Example Read text until the sequence “OK” is received, and send back what’s been received:
Usart_Init(9600);
delim := 'OK';
while TRUE do
begin
if Usart_Data_Ready() = 1 then
begin
Usart_Read_Text(txt, delim);
Usart_Write_Text(txt);
end;
end;
page
mikroElektronika: Development tools - Books - Compilers
265
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Usart_Write_Text
Description Sends text (parameter uart_text) via USART. Text should be zero terminated.
Requires USART HW unit must be initialized and communication established before using this
function. See Usart_Init.
Example Read text until the sequence “OK” is received, and send back what’s been received:
Usart_Init(9600);
delim := 'OK';
while TRUE do
begin
if Usart_Data_Ready() = 1 then
begin
Usart_Read_Text(txt, delim);
Usart_Write_Text(txt);
end;
end;
page
266
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Library Example
The example demonstrates simple data exchange via USART. When PIC receives the data, it
immediately sends it back. If PIC is connected to the PC (see the figure below), you can test the
example from mikroPascal terminal for RS232 communication, menu choice Tools > Terminal.
program rs232_com_test;
var received_byte : byte;
begin
Usart_Init(2400); // Initialize USART unit
while true do
begin
if Usart_Data_Ready = 1 then // If data is received
begin
received_byte := Usart_Read; // Read received data
Usart_Write(received_byte); // Send data via USART
end;
end;
end.
page
mikroElektronika: Development tools - Books - Compilers
267
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Hardware Connection
PC
6 9
RS-232 CN3
CON SUB-D 9p
1 5
CONNECT Receive
MCU TO PC data (Rx)
SERIAL
CABLE
CONNECT
PC TO MCU Send
Data (Tx)
6 9
RS-232 CN3
SUB-D 9p
CON 1 5
1
2
7
3
8
9
6
5
4
VCC
C18
100nF
PIC18F452
VCC
U6 11
12
VCC
13 12 GND
R1 IN R1 OUT Rx 13
OSC1
MAX232
8 9 14
R2 IN R2 OUT OSC2
11 14 8 Mhz 26
T1 IN T1 OUT RC7
25
10 7 RC6
T2 IN T2 OUT
1 4
E9 C1+ C2+
3 5 E11
10uF C1- 10uF
C2-
6 2
E10 V- V+
15 16 E12
10uF 10uF
GND VCC
VCC Tx
page
268
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
mikroPascal 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 key-
board, mouse, graphics tablet, and the like.
Each project based on the USB HID library should include a descriptor source file
which contains vendor id and name, product id and name, report length, and other
relevant information. To create a descriptor file, use the integrated USB HID ter-
minal of mikroPascal (Tools > USB HID Terminal). The default name for descrip-
tor file is USBdsc.ppas, but you may rename it. The provided code in the
“Examples” folder works at 48MHz, and the flags should not be modified without
consulting the appropriate datasheet first.
Library Routines
Hid_Enable
Hid_Read
Hid_Write
Hid_Disable
Hid_Enable
Description Enables USB HID communication. Parameters readbuff and writebuff are the addresses
of Read Buffer and the Write Buffer, respectively, which are used for HID communica-
tion. You can pass buffer names with the @ operator.
This function needs to be called before using other routines of USB HID Library.
page
mikroElektronika: Development tools - Books - Compilers
269
mikroPASCAL
mikroPASCAL - Pascal 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 Write Buffer writebuff to host. Write Buffer is the address
of the parameter used in initialization; see Hid_Enable. You can pass a buffer name
with the @ operator. 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
Example Hid_Disable();
page
270
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Library Example
The following example continually sends sequence of numbers 0..255 to the PC via Universal
Serial Bus.
program hid_test;
var k : byte;
userRD_buffer : array[64] of byte;
userWR_buffer : array[64] of byte;
procedure interrupt;
begin
asm
CALL _Hid_InterruptProc
nop
end;
end;
procedure Init_Main;
begin
// Disable GIE, PEIE, TMR0IE, INT0IE, RBIE
INTCON := 0;
INTCON2 := $F5;
INTCON3 := $C0;
RCON.IPEN := 0;
PIE1 := 0;
PIE2 := 0;
PIR1 := 0;
PIR2 := 0;
TRISA := 0;
TRISB := 0;
TRISC := $FF;
TRISD := $FF;
TRISE := $07;
LATA := 0;
LATB := 0;
LATC := 0;
LATD := 0;
LATE := 0;
// continues ..
page
mikroElektronika: Development tools - Books - Compilers
271
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
// .. continued
// Timer 0
T0CON := $07;
TMR0H := (65536-156) shr 8;
TMR0L := (65536-156) and $FF;
INTCON.T0IE := 1; // Enable T0IE
T0CON.TMR0ON := 1;
end;
begin
Init_Main();
Hid_Enable(@userRD_buffer, @userWR_buffer);
repeat
begin
for k := 0 to 255 do
begin
// Prepare send buffer
userWR_buffer[0] := k;
Hid_Disable;
end.
page
272
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
HW Connection
MCLR RB7
RA0 RB6
RA1 RB5
RA2 RB4
RA3
PIC18F4550 RB3
RA4 RB2
RA5 RB1
RE0 RB0
RE1 VDD
VCC
RE2 VSS
11
VDD RD7
12
VSS RD6
13
OSC1 RD5
14 VCC
8 Mhz OSC2 RD4
RC0 RC7
RC1 RC6 VCC
RC2 RC5 D-
Vusb RC4 D+ USB
100nF 100nF
RD0 RD3 GND
RD1 RD2
page
mikroElektronika: Development tools - Books - Compilers
273
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Util Library
Util library contains miscellaneous routines useful for project development.
Button
Description Function eliminates the influence of contact flickering upon pressing a button (debounc-
ing).
Parameter port specifies the location of the button; parameter pin is the pin number on
designated port and goes from 0..7; parameter time is a debounce period in millisec-
onds; parameter active_state can be either 0 or 1, and it determines if the 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:
while true do
begin
if Button(PORTB, 0, 1, 1) then oldstate := 255;
if oldstate and Button(PORTB, 0, 1, 0) then
begin
PORTD := not(PORTD);
oldstate := 0;
end;
end;
page
274
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Conversions Library
mikroPascal 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
WordToStr
IntToStr
LongintToStr
WordToHex
FloatToStr
StrToInt
StrToWord
The following functions convert decimal values to BCD (Binary Coded Decimal)
and vice versa:
Bcd2Dec
Dec2Bcd
Bcd2Dec16
Dec2Bcd16
ByteToStr
Description Procedure creates an output string out of a small unsigned number (numerical value
less than $100). Output string has fixed width of 3 characters; remaining positions on
the left (if any) are filled with blanks.
page
mikroElektronika: Development tools - Books - Compilers
275
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
ShortToStr
Description Procedure creates an output string out of a small signed number (numerical value less
than $100). Output string has fixed width of 4 characters; remaining positions on the left
(if any) are filled with blanks.
WordToStr
Description Procedure creates an output string out of an unsigned number (numerical value of
word type). Output string has fixed width of 5 characters; remaining positions on the
left (if any) are filled with blanks.
WordToStrWithZeros
Description Procedure creates an output string out of an unsigned number (numerical value of
word type). Output string has fixed width of 5 characters; remaining positions on the
left (if any) are filled with zeros.
page
276
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
IntToStr
Description Procedure creates an output string out of a signed number (numerical value of
integer type). Output string has fixed width of 6 characters; remaining positions on
the left (if any) are filled with blanks.
LongintToStr
Description Procedure creates an output string out of a large signed number (numerical value of
longint type). Output string has fixed width of 11 characters; remaining positions on
the left (if any) are filled with blanks.
page
mikroElektronika: Development tools - Books - Compilers
277
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
FloatToStr
Description Procedure creates string out of the input parameter, which should be a floating point
number in the longint range (±2147483648). Parameter output accepts the created
string. The result is given in format "integer.fraction", left aligned.
Note: Procedure won’t return the correct result if input exceeds the longint range!
You’ll need to create a custom routine if you want to handle such large numbers.
The integer part has flexible width of up to 11 characters (10 digits + sign). If the
actual integer part is shorter than that, string will wrap to the integer’s length. The
fraction part is always 5 characters long. If the actual fraction is shorter than 5 digits,
remaining chars on the right will be filled with zeroes; if the fraction exceeds 5 digits,
the fraction part will be trimmed.
Requires If you want to use the FloatToStr for printing on LCD, ensure that your program
clears/refreshes the display with each printing of a string. Otherwise, LCD will display
the remnants (rightmost digits) of the previous string, if it was longer than the presently
displayed one.
Bcd2Dec
page
278
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Dec2Bcd
Bcd2Dec16
Dec2Bcd16
page
mikroElektronika: Development tools - Books - Compilers
279
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
StrToInt
Example
var ii: integer;
begin
ii:= StrToInt('-1234');
end.
StrToWord
Prototype function StrToWord(var input: string[5]): word;
Example
var ww: word;
begin
ww:= StrToword('65432');
end.
page
280
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Delays Library
mikroPascal provides a basic utility routines for creating software delay. You can
create more advanced and flexible versions based on this library.
Delay_us
Delay_ms
page
mikroElektronika: Development tools - Books - Compilers
281
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
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.
page
282
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Math Library
Math Library implements a number of common mathematical functions.
Library Routines
Acos
Asin
Atan
Atan2
Ceil
Cos
CosE3
Cosh
Exp
Fabs
Floor
Frexp
Fmod
Ldexp
Log
Log10
Modf
Pow
Sin
SinE3
Sinh
Sqrt
Tan
Tanh
page
mikroElektronika: Development tools - Books - Compilers
283
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
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).
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).
page
284
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Ceil
Description Function returns value of parameter x rounded up to the next whole number.
Cos
Description Function returns the cosine of x in radians. The return value is from -1 to 1.
CosE3
Description Function takes parameter x which represents angle in degrees, and returns its cosine
multiplied by 1000 and rounded up to the nearest integer:
result := round_up(cos(x)*1000)
Cosh
page
mikroElektronika: Development tools - Books - Compilers
285
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Exp
Description Function returns the value of e — the base of natural logarithms — raised to the power
of x (i.e. ex).
Fabs
Floor
Description Function returns value of parameter x rounded down to the nearest integer.
Fmod
Description Function computes the floating point remainder of x/y. Function returns the value
x - i * y for some integer i such that, if y is nonzero, the result has the same sign as
x and magnitude less then the magnitude of y. If v is zero, the fmod function returns
zero.
page
286
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
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 exponent is stored in
the object pointed to by n.
Ldexp
Description Function returns the result of multiplying the floating-point number num by 2 raised to
the power n (i.e. returns x * 2n).
Log
Log10
page
mikroElektronika: Development tools - Books - Compilers
287
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
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 longint.
Sin
Description Function returns the sine of x in radians. The return value is from -1 to 1.
SinE3
Description Function takes parameter x which represents angle in degrees, and returns its sine multi-
plied by 1000 and rounded up to the nearest integer:
result := round_up(sin(x)*1000)
page
288
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
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 mikroPascal.
Tanh
page
mikroElektronika: Development tools - Books - Compilers
289
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
String Library
The String Library provides a number of routines for string handling.
Library Routines
Memchr
Memcmp
Memcpy
Memmove
Memset
Strcat
Strchr
Strcmp
Strcpy
Strcspn
Strlen
Strncat
Strncmp
Strncpy
Strpbrk
Strrchr
Strspn
Strstr
strAppendSuf
strAppendPre
page
290
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Memchr
Description Function locates the first occurrence of byte ch in the initial n bytes of memory area
starting at the address p. Function returns the offset of this occurrence from the memory
address p or $FFFF if the character was not found.
For parameter p you can use either a numerical value (literal/variable/constant) indicat-
ing memory address or a dereferenced value of an object, for example @mystring or
@PORTB.
Memcmp
Description Function returns a positive, negative, or zero value indicating the relationship of first n
bytes of memory areas starting at addresses p1 and p2.
The Memcmp function compares two memory areas starting at addresses p1 and p2 for n
bytes and returns a value indicating their relationship as follows:
Value Meaning
<0 p1 "less than" p2
=0 p1 "equal to" p2
>0 p1 "greater than" p2
The value returned by function is determined by the difference between the values of the
first pair of bytes that differ in the strings being compared.
For parameters p1 and p2 you can use either a numerical value (literal/variable/con-
stant) indicating memory address or a dereferenced value of an object, for example
@mystring or @PORTB.
page
mikroElektronika: Development tools - Books - Compilers
291
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Memcpy
Description Function copies n bytes from the memory area starting at the address p2 to the memory
area starting at p1. If these memory buffers overlap, the memcpy function cannot guar-
antee that bytes are copied before being overwritten. If these buffers do overlap, use the
Memmove function.
For parameters p1 and p2 you can use either a numerical value (literal/variable/con-
stant) indicating memory address or a dereferenced value of an object, for example
@mystring or @PORTB.
Memmove
Description Function copies n bytes from the memory area starting at the address p2 to the memory
area starting at p1. If these memory buffers overlap, the Memmove function ensures that
bytes in p2 are copied to p1 before being overwritten.
For parameters p1 and p2 you can use either a numerical value (literal/variable/con-
stant) indicating memory address or a dereferenced value of an object, for example
@mystring or @PORTB.
Memset
Description Function fills the first n bytes in the memory area starting at the address p with the
value of byte ch.
For parameter p you can use either a numerical value (literal/variable/constant) indicat-
ing memory address or a dereferenced value of an object, for example @mystring or
@PORTB.
page
292
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Strcat
Description Function appends the value of string s2 to string s1 and terminates s1 with a null char-
acter.
Strchr
Description Function searches the string s for the first occurrence of the character ch. The null char-
acter terminating s is not included in the search.
Function returns the position (index) of the first character ch found in s; if no matching
character was found, function returns $FF.
Strcmp
Description Function lexicographically compares the contents of strings s1 and s2 and returns a
value indicating their relationship:
Value Meaning
<0 s1 "less than" s2
=0 s1 "equal to" s2
>0 s1 "greater than" s2
The value returned by function is determined by the difference between the values of the
first pair of bytes that differ in the strings being compared.
page
mikroElektronika: Development tools - Books - Compilers
293
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Strcpy
Description Function copies the value of string s2 to the string s1 and appends a null character to
the end of s1.
Strcspn
Description The strcspn function computes the length of the maximum initial segment of the string
pointed to by s1 which consists entirely of characters not from the string pointed to by
s2. Function returns the length of the segment.
Strlen
Description Function returns the length, in bytes, of the string s. The length does not include the null
terminating character.
page
294
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Strncat
Description Function appends at most n characters from the string s2 to the string s1 and terminates
s1 with a null character. If s2 is shorter than n characters, s2 is copied up to and
including the null terminating character.
Strncmp
Description Function lexicographically compares the first n bytes of the strings s1 and s2 and
returns a value indicating their relationship:
Value Meaning
<0 s1 "less than" s2
=0 s1 "equal to" s2
>0 s1 "greater than" s2
The value returned by function is determined by the difference between the values of the
first pair of bytes that differ in the strings being compared (within first n bytes).
Strncpy
Description Function copies at most n characters from the string s2 to the string s1. If s2 contains
fewer characters than n, s1 is padded out with null characters up to the total length of n
characters.
page
mikroElektronika: Development tools - Books - Compilers
295
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Strpbrk
Description Function searches s1 for the first occurrence of any character from the string s2. The
null terminator is not included in the search. Function returns an index of the matching
character in s1. If s1 contains no characters from s2, function returns $FF.
Strrchr
Description Function searches the string s for the last occurrence of character ch. The null character
terminating s is not included in the search. Function returns an index of the last
ch found in s; if no matching character was found, function returns $FF.
Strspn
Description The strspn function computes the length of the maximum initial segment of the string
pointed to by s1 which consists entirely of the characters from the string pointed to by
s2. Function returns the length of the segment.
page
296
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Strstr
Description Function locates the first occurrence of the string s2 in the string s1 (excluding the ter-
minating null character). Function returns a number indicating the position of the first
occurrence of s2 in s1; if no string was found, function returns $FF. If s2 is a null
string, the function returns 0.
strAppendSuf
strAppendPre
page
mikroElektronika: Development tools - Books - Compilers
297
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Library Routines
Expander_Init
PortExpanderSelect
PortExpanderUnSelect
Expander_Read_Byte
Expander_Write_Byte
Expander_Set_Mode
Expander_Read_Array
Expander_Write_Array
Expander_Read_PortA
Expander_Read_PortB
Expander_Read_ArrayPortA
Expander_Read_ArrayPortB
Expander_Write_PortA
Expander_Write_PortB
Expander_Set_DirectionPortA
Expander_Set_DirectionPortB
Expander_Set_PullUpsPortA
Expander_Set_PullUpsPortB
Expander_Init
Description Establishes SPI communication with the expander and initializes the expander. RstPort
and RstPin - Sets pin connected on reset pin of spi expander. CSPort and CSPin - Sets
pin connected on CS pin of spi expander. moduleaddress - address of spi expander
(hardware setting of A0, A1 and A2 pins (connected on VCC or GND) on spi expander).
Requires This procedure needs to be called before using other routines of PORT Expander library.
SPI_Init; must be called before initializing Port Expander.
page
298
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
PortExpanderSelect
Example PortExpanderSelect;
PortExpanderUnSelect
Example PortExpanderUnSelect;
Expander_Read_Byte
Example Expander_Read_Byte(0,1);
Expander_Write_Byte
Prototype procedure Expander_Write_Byte(ModuleAddress, RegAddress, Data :
byte);
Returns Nothing.
Description This routine writes data to port expander on ModuleAddress and port on
RegAddress.
page
mikroElektronika: Development tools - Books - Compilers
299
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Expander_Set_Mode
Prototype procedure Expander_Set_Mode(ModuleAddress, Mode : byte);
Returns Nothing.
Description Sets port expander mode on ModuleAddress.
Expander_Read_ArrayPortA
Prototype procedure Expander_Read_ArrayPortA(ModuleAddress, NoBytes : byte;
var DestArray : array[100] of byte);
Returns Nothing.
Description This routine reads array of bytes (DestArray) from port expander on ModuleAddress
and portA. NoBytes represents number of read bytes.
Expander_Read_Array
Prototype procedure Expander_Read_Array(ModuleAddress, StartAddress,
NoBytes : byte; var DestArray : array[100] of byte);
Returns Nothing.
Description This routine reads array of bytes (DestArray) from port expander on ModuleAddress
and StartAddress. NoBytes represents number of read bytes.
page
300
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Expander_Write_Array
Prototype procedure Expander_Write_Array(ModuleAddress, StartAddress,
NoBytes : byte; var SourceArray : array[100] of byte);
Returns Nothing.
Description This routine writes array of bytes (DestArray) to port expander on ModuleAddress
and StartAddress. NoBytes represents number of read bytes.
Requires PORT Expander must be initialized. See Expander_Init.
Example Expander_Write_Array(1,1,5,data);
Expander_Read_PortA
Prototype function Expander_Read_PortA(Address : byte) : byte;
Expander_Read_Array
Prototype procedure Expander_Read_Array(ModuleAddress, StartAddress,
NoBytes : byte; var DestArray : array[100] of byte);
page
mikroElektronika: Development tools - Books - Compilers
301
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Expander_Read_ArrayPortB
Prototype procedure Expander_Read_ArrayPortB(ModuleAddress, NoBytes : byte;
var DestArray : array[100] of byte);
Returns Nothing.
Description This routine reads array of bytes (DestArray) from port expander on ModuleAddress
and portB. NoBytes represents number of read bytes.
Expander_Write_PortA
Prototype procedure Expander_Write_PortA(ModuleAddress, Data : byte);
Returns Nothing.
Description This routine writes byte to port expander on ModuleAddress and portA.
Expander_Write_PortB
Prototype procedure Expander_Write_PortB(ModuleAddress, Data : byte);
Returns Nothing.
Description This routine writes byte to port expander on ModuleAddress and portB.
page
302
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Expander_Set_DirectionPortA
Prototype procedure Expander_Set_DirectionPortA(ModuleAddress, Data :
byte);
Expander_Set_DirectionPortB
Prototype procedure Expander_Set_DirectionPortB(ModuleAddress, Data :
byte);
Expander_Set_PullUpsPortA
Prototype procedure Expander_Set_PullUpsPortA(ModuleAddress, Data : byte);
Description This routine sets port expander PortA pin as pullup or pulldown.
Expander_Set_PullUpsPortB
Prototype procedure Expander_Set_PullUpsPortB(ModuleAddress, Data : byte);
Description This routine sets port expander PortB pin as pullup or pulldown.
page
mikroElektronika: Development tools - Books - Compilers
303
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Library Example
The example demonstrates how to communicate to port expander MCP23S17.
program PortExpander;
var i : byte;
begin
ADCON1 := ADCON1 or 0x0f;
TRISB := 0x00;
PORTB := 0xFF;
Delay_ms(200);
Expander_Set_DirectionPortA(0, 0);
Expander_Set_DirectionPortB(0,0xFF);
Expander_Set_PullUpsPortB(0,0xFF);
i := 0;
while 1 do
begin
Expander_Write_PortA(0, i);
i := i + 1;
PORTB := Expander_Read_PortB(0);
Delay_ms(20);
end;
end.
page
304
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Hardware Connection
MCP23S17
1 28
GPB0 GPA7
2 27
GPB1 GPA6
3 26
GPB2 GPA5
4 25
GPB3 GPA4
PIC18F452
5 24
GPB4 GPA3
6 23
GPB5 GPA2
7 22
GPB6 GPA1
8 21 VCC
GPB7 GPA0
VCC
9 20
VDD INTA 11
10 19 VCC
12
VSS INTB GND
RC1 11 18 RC0 13
CS RESET OSC1
RC3 12 17 14
SCK A2 OSC2
RC5 13 16 15
SI A1 RC0
8 Mhz 16
RC4 14 15 RC1
SO A0 24
RC5
18 23
RC3 RC4
1 2 1 2
3 4 3 4
5 6 5 6
7 8 7 8
9 10 9 10
PORTB PORTA
VCC VCC
page
mikroElektronika: Development tools - Books - Compilers
305
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Library Routines
Basic routines:
Spi_Glcd_Init
Spi_Glcd_Set_Side
Spi_Glcd_Set_Page
Spi_Glcd_Set_X
Spi_Glcd_Read_Data
Spi_Glcd_Write_Data
Advanced routines:
Spi_Glcd_Fill
Spi_Glcd_Dot
Spi_Glcd_Line
Spi_Glcd_V_Line
Spi_Glcd_H_Line
Spi_Glcd_Rectangle
Spi_Glcd_Box
Spi_Glcd_Circle
Spi_Glcd_Set_Font
Spi_Glcd_Write_Char
Spi_Glcd_Write_Text
Spi_Glcd_Image
page
306
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Spi_Glcd_Init
Description Initializes Graphic LCD 128x64 via SPI. RstPort and RstPin - Sets pin connected on
reset pin of spi expander. CSPort and CSPin - Sets pin connected on CS pin of spi
expander. device address - address of spi expander (hardware setting of A0, A1 and
A2 pins (connected on VCC or GND) on spi expander).
Requires This procedure needs to be called before using other routines of SPI GLCD library.
Spi_Init; must be called before initializing SPI GLCD.
Spi_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
Spi_Glcd_Set_Side, Spi_Glcd_Set_X, and Spi_Glcd_Set_Page to specify an
exact position on GLCD. Then, you can use Spi_Glcd_Write_Data or
Spi_Glcd_Read_Data on that location.
page
mikroElektronika: Development tools - Books - Compilers
307
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Spi_Glcd_Set_Page
Description Selects page of GLCD, technically a line on display; parameter page can be 0..7.
Example Spi_Glcd_Set_Page(5);
Spi_Glcd_Set_X
Description Positions to x dots from the left border of GLCD within the given page.
Example Spi_Glcd_Set_X(25);
Spi_Glcd_Read_Data
Description Reads data from from the current location of GLCD memory. Use the functions
Spi_Glcd_Set_Side, Spi_Glcd_Set_X, and Spi_Glcd_Set_Page to specify an
exact position on GLCD. Then, you can use Spi_Glcd_Write_Data or
Spi_Glcd_Read_Data on that location.
Requires Reads data from from the current location of GLCD memory.
page
308
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Spi_Glcd_Write_Data
Description Writes data to the current location in GLCD memory and moves to the next location.
Example Spi_Glcd_Write_Data(data);
Spi_Glcd_Fill
Description Fills the GLCD memory with byte pattern. To clear the GLCD screen, use
Spi_Glcd_Fill(0); to fill the screen completely, use Spi_Glcd_Fill($FF).
Spi_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 Spi_Glcd_Dot(0, 0, 2); // Invert the dot in the upper left corner
page
mikroElektronika: Development tools - Books - Compilers
309
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Spi_Glcd_Line
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).
Spi_Glcd_V_Line
Description Similar to GLcd_Line, draws a vertical line on the GLCD from (x, y1) to
(x, y2).
Spi_Glcd_H_Line
Description Similar to GLcd_Line, draws a horizontal line on the GLCD from (x1, y) to
(x2, y).
page
310
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Spi_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).
Spi_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).
Spi_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).
page
mikroElektronika: Development tools - Books - Compilers
311
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Spi_Glcd_Set_Font
Description Sets the font for text display routines, Spi_Glcd_Write_Char and
Spi_Glcd_Write_Text. Font needs to be formatted as an array of byte. Parameter
font_address specifies the address of the font; you can pass a font name with the @
operator. 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 should not
exceed 8 dots. Parameter font_offset determines the ASCII character from which the
supplied font starts. Demo fonts supplied with the library have an offset of 32, which
means that they start with space.
Example // Use the custom 5x7 font "myfont" which starts with space (32):
Spi_Glcd_Set_Font(@myfont, 5, 7, 32);
Spi_Glcd_Write_Char
Description Prints character at page (one of 8 GLCD lines, 0..7), x dots away from the left border of
display. Parameter color defines the “fill”: 0 writes a “white” letter (clear dots), 1 writes
a solid letter (put dots), and 2 writes a “smart” letter (invert each dot).
Use routine Spi_Glcd_Set_Font to specify font, or the default 5x7 font (included
with the library) will be used.
page
312
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Spi_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).
Use routine Spi_Glcd_Set_Font to specify font, or the default 5x7 font (included
with the library) will be used.
Spi_Glcd_Image
Description Displays bitmap image on the GLCD. Parameter image should be formatted as an array
of 1024 bytes. Use the mikroPascal’s integrated Bitmap-to-LCD editor (menu option
Tools > Graphic LCD Editor) to convert image to a constant array suitable for display
on GLCD.
Example Spi_Glcd_Image(my_image);
page
mikroElektronika: Development tools - Books - Compilers
313
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Library Example
The example demonstrates how to communicate to KS0108 GLCD via SPI module, using serial to
parallel convertor MCP23S17.
program SerialGLCD;
uses images;
var
ii: byte;
someText: string[20];
procedure delay2S;
begin
delay_ms(2000);
end;
begin
//delay2S;
Spi_Glcd_Fill(0x00);
for ii := 1 to 40 do
Spi_Glcd_Dot(ii, ii, 1);
delay2S;
Spi_Glcd_Fill(0x00);
Spi_Glcd_Line(120, 1, 5,60, 1);
delay2S;
Spi_Glcd_Line(12, 42, 5,60, 1);
delay2S;
//continues..
page
314
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
//continues..
for ii := 1 to 10 do
Spi_Glcd_Circle(63, 32, 3*ii, 1);
delay2S;
Spi_Glcd_Box(12, 20, 70, 57, 2);
delay2S;
Spi_Glcd_Fill(0x00);
Spi_Glcd_Set_Font(@System3x6, 3, 6, 32);
someText := 'SMALL FONT: 3X6';
Spi_Glcd_Write_Text(someText, 20, 5, 1);
Spi_Glcd_Set_Font(@FontSystem5x8, 5, 8, 32);
someText := 'Large Font 5x8';
Spi_Glcd_Write_Text(someText, 3, 4, 1);
delay2S;
end;
end.
page
mikroElektronika: Development tools - Books - Compilers
315
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
PIC18F452
D4 5 24 RW
GPB4 GPA3
D5 6 23 RS
GPB5 GPA2
D6 7 22 CS2
GPB6 GPA1
D7 8 21 CS1 VCC
GPB7 GPA0
VCC
9 20
VDD INTA 11
10 19 VCC
12
VSS INTB GND
RC1 11 18 RC0 13
CS RESET OSC1
RC3 12 17 14
SCK A2 OSC2
RC5 13 16 15
SI A1 RC0
8 Mhz 16
RC4 14 15 RC1
SO A0 24
RC5
18 23
RC3 RC4
Vee
Contrast
Adjustment
VCC VCC
P1 Vo
5K
1 20
LED+
GND
VCC
RS
RST
D6
D5
CS1
D0
D2
D7
R/W
D1
D3
D4
CS2
Vo
LED-
Vee
E
mikroElektronika
EasyPIC3
Development system
page
316
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Library Routines
Spi_Lcd_Config
Spi_Lcd_Init
Spi_Lcd_Out
Spi_Lcd_Out_Cp
Spi_Lcd_Chr
Spi_Lcd_Chr_Cp
Spi_Lcd_Cmd
Spi_Lcd_Config
Description Initializes LCD via SPI interface with pin settings (Reset pin and Chip Select pin) you
specify.
page
mikroElektronika: Development tools - Books - Compilers
317
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Spi_Lcd_Init
Description Initializes LCD at port with default pin settings (see the connection scheme at the end
of the chapter).
Example Spi_Lcd_Init;
Spi_Lcd_Out
Description Prints text on LCD at specified row and column (parameters row and col). Both string
variables and literals can be passed as text.
Spi_Lcd_Out_Cp
Description Prints text on LCD at current cursor position. Both string variables and literals can be
passed as text.
page
318
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Spi_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.
Spi_Lcd_Chr_Cp
Description Prints character on LCD at current cursor position. Both variables and literals can be
passed as character.
Spi_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 below.
page
mikroElektronika: Development tools - Books - Compilers
319
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
LCD Commands
LCD Command Purpose
begin
SPI_init(); // initialize SPI communication
Spi_Lcd_Init(); // initialize lcd via SPI interface
Spi_Lcd_Cmd(Lcd_CLEAR); // send command to LCD "clear display"
Spi_Lcd_Cmd(Lcd_CURSOR_OFF); // send command cursor off
Spi_Lcd_Out(2, 1, 'mikroElektronika'); // print txt to LCD, 2nd row, 1st column
Spi_Lcd_Out(1, 5, 'mikroE'); // print txt to LCD, 1st row, 5th column
Spi_Lcd_Out(3, 1, 'mikroE');
// print txt to LCD, 3rd row, 1st column, for lcd's with more than two rows
Spi_Lcd_Out(4, 10, 'mikroE');
// print txt to LCD, 4th row, 10th column, for lcd's with more than two rows
end.
page
320
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Hardware Connection
MCP23S17
1 28
GPB0 GPA7
2 27
GPB1 GPA6
RS 3 26
GPB2 GPA5
E 4 25
GPB3 GPA4
PIC18F452
D4 5 24
GPB4 GPA3
D5 6 23
GPB5 GPA2
D6 7 22
GPB6 GPA1
D7 8 21 VCC
GPB7 GPA0
VCC
9 20
VDD INTA 11
10 19 VCC
12
VSS INTB GND
RC1 11 18 RC0 13
CS RESET OSC1
RC3 12 17 14
SCK A2 OSC2
RC5 13 16 15
SI A1 RC0
8 Mhz 16
RC4 14 15 RC1
SO A0 24
RC5
18 23
RC3 RC4
VCC
Contrast
P4 Adjustment
5K
1 14
D1
GND
VCC
VEE
RS
E
D0
D2
D3
D7
D6
D5
D4
R/W
page
mikroElektronika: Development tools - Books - Compilers
321
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Library Routines
Spi_Lcd8_Config
Spi_Lcd8_Init
Spi_Lcd8_Out
Spi_Lcd8_Out_Cp
Spi_Lcd8_Chr
Spi_Lcd8_Chr_Cp
Spi_Lcd8_Cmd
Spi_Lcd8_Config
Description Initializes LCD via SPI interface with pin settings (Reset pin and Chip Select pin) you
specify.
page
322
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Spi_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).
Example Spi_Lcd8_Init;
Spi_Lcd8_Out
Description Prints text on LCD at specified row and column (parameters row and col). Both string
variables and literals can be passed as text.
Spi_Lcd8_Out_Cp
Description Prints text on LCD at current cursor position. Both string variables and literals can be
passed as text.
page
mikroElektronika: Development tools - Books - Compilers
323
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Spi_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.
Spi_Lcd8_Chr_Cp
Description Prints character on LCD at current cursor position. Both variables and literals can be
passed as character.
Spi_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 shown below.
page
324
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
LCD Commands
LCD Command Purpose
begin
SPI_init(); // initialize SPI communication
Spi_Lcd8_Init(); // initialize lcd via SPI interface
Spi_Lcd8_Cmd(LCD_CLEAR); // Clear display
Spi_Lcd8_Cmd(LCD_CURSOR_OFF); // Turn cursor OFF
Spi_Lcd8_Out(1, 5, 'mikroE'); // Write Txt to LCD
Spi_Lcd8_Out(2, 1, 'mikroElektronika'); // Write Txt to LCD
Spi_Lcd8_Out(3, 1, 'mikroE');
// Write Txt to LCD, for lcd's with more than two rows
Spi_Lcd8_Out(4, 10, 'mikroE');
// Write Txt to LCD, for lcd's with more than two rows
end.
page
mikroElektronika: Development tools - Books - Compilers
325
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Hardware Connection
MCP23S17
D0 1 28
GPB0 GPA7
D1 2 27
GPB1 GPA6
D2 3 26
GPB2 GPA5
D3 4 25 RS
GPB3 GPA4
PIC18F452
D4 5 24
GPB4 GPA3
D5 6 23 E
GPB5 GPA2
D6 7 22
GPB6 GPA1
D7 8 21 VCC
GPB7 GPA0
VCC
9 20
VDD INTA 11
10 19 VCC
12
VSS INTB GND
RC1 11 18 RC0 13
CS RESET OSC1
RC3 12 17 14
SCK A2 OSC2
RC5 13 16 15
SI A1 RC0
8 Mhz 16
RC4 14 15 RC1
SO A0 24
RC5
18 23
RC3 RC4
VCC
Contrast
P4 Adjustment
5K
1 14
D1
GND
VCC
VEE
RS
E
D0
D2
D3
D7
D6
D5
D4
R/W
page
326
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Library Routines
Spi_T6963C_Config
Spi_T6963C_writeData
Spi_T6963C_writeCommand
Spi_T6963C_setPtr
Spi_T6963C_waitReady
Spi_T6963C_fill
Spi_T6963C_dot
Spi_T6963C_write_char
Spi_T6963C_write_text
Spi_T6963C_line
Spi_T6963C_rectangle
Spi_T6963C_box
Spi_T6963C_circle
Spi_T6963C_image
Spi_T6963C_sprite
Spi_T6963C_set_cursor
Spi_T6963C_clearBit
Spi_T6963C_setBit
Spi_T6963C_negBit
Spi_T6963C_displayGrPanel
Spi_T6963C_displayTxtPanel
Spi_T6963C_setGrPanel
Spi_T6963C_setTxtPanel
Spi_T6963C_panelFill
Spi_T6963C_grFill
Spi_T6963C_txtFill
Spi_T6963C_cursor_height
Spi_T6963C_graphics
Spi_T6963C_text
Spi_T6963C_cursor
Spi_T6963C_cursor_blink
Spi_T6963C_Config_240x128
Spi_T6963C_Config_240x64
page
mikroElektronika: Development tools - Books - Compilers
327
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Spi_T6963C_Config
Prototype procedure Spi_T6963C_Config(width, height, fntW : word; var rst-
port : byte; rstpin : byte; var csport : byte; cspin : byte; wr,
rd, cd, rst : byte; DeviceAddress : byte);
Description Initalizes the Graphic Lcd controller. This function must be called before all Spi T6963C
Library Routines.
width - Number of horizontal (x) pixels in the display.
height - Number of vertical (y) pixels in the display.
fntW - Font width, number of pixels in a text character, must be set accordingly to the
hardware.
data - Address of the port on which the Data Bus is connected.
cntrl - Address of the port on which the Control Bus is connected.
wr - !WR line bit number in the *cntrl port.
rd - !RD line bit number in the *cntrl port.
cd - !CD line bit number in the *cntrl port.
rst - !RST line bit number in the *cntrl port.
DeviceAddress - Device Address.
Display RAM :
The library doesn't know the amount of available RAM.
The library cuts the RAM into panels : a complete panel is one graphics panel followed
by a text panel, The programer has to know his hardware to know how much panel he
has.
Requires Spi_Init; must be called before initializing SPI Toshiba T6963C Graphic LCD.
page
328
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Spi_T6963C_writeData
Prototype procedure Spi_T6963C_writeData(data : byte);
Example Spi_T6963C_writeData(AddrL);
Spi_T6963C_writeCommand
Prototype procedure Spi_T6963C_writeCommand(data : byte);
Example Spi_T6963C_writeCommand(T6963C_CURSOR_POINTER_SET);
Spi_T6963C_setPtr
Prototype procedure Spi_T6963C_setPtr(p : word; c : byte);
Spi_T6963C_waitReady
Prototype procedure Spi_T6963C_waitReady;
Description This routine pools the status byte, and loops until ready.
Example Spi_T6963C_waitReady;
page
mikroElektronika: Development tools - Books - Compilers
329
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Spi_T6963C_fill
Prototype procedure Spi_T6963C_fill(v : byte; start, len : word);
Description This routine fills length with bytes to controller memory from start address.
Example Spi_T6963C_fill(0x33,0x00FF,0x000F);
Spi_T6963C_dot
Prototype procedure Spi_T6963C_dot(x, y : integer; color : byte);
Description This routine sets current graphic work panel. It sets the pixel dot (x0, y0).
pcolor = T6963C_[WHITE[BLACK].
Spi_T6963C_write_char
Prototype procedure Spi_T6963C_write_char(c, x, y, mode : byte);
Spi_T6963C_write_text
Prototype procedure Spi_T6963C_write_text(var str : array[10] of byte; x,
y, mode : byte);
page
330
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Spi_T6963C_line
Prototype procedure Spi_T6963C_line(x0, y0, x1, y1 : integer; pcolor :
byte);
Spi_T6963C_rectangle
Prototype procedure T6963C_rectangle(x0, y0, x1, y1 : integer; pcolor :
byte);
Spi_T6963C_box
page
mikroElektronika: Development tools - Books - Compilers
331
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Spi_T6963C_circle
Prototype procedure Spi_T6963C_circle(x, y : integer; r : longint; pcolor :
word);
Spi_T6963C_image
Prototype procedure Spi_T6963C_image(const pic : ^byte);
Example Spi_T6963C_image(my_image);
Spi_T6963C_sprite
Prototype procedure Spi_T6963C_sprite(px, py : byte; const pic : ^byte; sx,
sy : byte);
page
332
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Spi_T6963C_set_cursor
Prototype procedure Spi_T6963C_set_cursor(x, y : byte);
Spi_T6963C_clearBit
Prototype procedure Spi_T6963C_clearBit(b : byte);
Example Spi_T6963C_clearBit(b);
Spi_T6963C_setBit
Prototype procedure Spi_T6963C_setBit(b : byte);
Example Spi_T6963C_setBit(b);
Spi_T6963C_negBit
Prototype procedure Spi_T6963C_negBit(b : byte);
Example Spi_T6963C_negBit(b);
page
mikroElektronika: Development tools - Books - Compilers
333
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Spi_T6963C_displayGrPanel
Prototype procedure Spi_T6963C_displayGrPanel(n : word);
Example Spi_T6963C_displayGrPanel(n);
Spi_T6963C_displayTxtPanel
Prototype procedure Spi_T6963C_displayTxtPanel(n : word);
Example Spi_T6963C_displayTxtPanel(n);
Spi_T6963C_setGrPanel
Prototype procedure Spi_T6963C_setGrPanel(n : word);
Example Spi_T6963C_setGrPanel(n);
Spi_T6963C_setTxtPanel
Prototype procedure Spi_T6963C_setTxtPanel(n : word);
Example Spi_T6963C_setTxtPanel(n);
page
334
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Spi_T6963C_panelFill
Prototype procedure Spi_T6963C_panelFill(v : word);
Example Spi_T6963C_panelFill(v);
Spi_T6963C_grFill
Prototype procedure Spi_T6963C_grFill(v: word);
Example Spi_T6963C_grFill(v);
Spi_T6963C_txtFill
Prototype procedure Spi_T6963C_txtFill(v : word);
Example Spi_T6963C_txtFill(v);
Spi_T6963C_cursor_height
Prototype procedure Spi_T6963C_cursor_height(n: word);
Example Spi_T6963C_cursor_height(n);
page
mikroElektronika: Development tools - Books - Compilers
335
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
Spi_T6963C_graphics
Prototype procedure Spi_T6963C_graphics(n : word);
Example Spi_T6963C_graphics(1);
Spi_T6963C_text
Prototype procedure Spi_T6963C_text(n : word);
Example Spi_T6963C_text(1);
Spi_T6963C_cursor
Prototype procedure Spi_T6963C_cursor(n : word);
Example Spi_T6963C_cursor(1);
Spi_T6963C_cursor_blink
Prototype procedure Spi_T6963C_cursor_blink(n : word);
Example Spi_T6963C_cursor_blink(0);
page
336
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
Spi_T6963C_Config_240x128
Prototype procedure Spi_T6963C_Config_240x128;
Description Initialize T6963C based GLCD (240x128 pixels) with default settings for mE GLCD's.
Requires Spi_Init; must be called before initializing SPI Toshiba T6963C Graphic LCD.
Example Spi_T6963C_Config_240x128;
Spi_T6963C_Config_240x64
Prototype procedure Spi_T6963C_Config_240x64;
Requires Initialize T6963C based GLCD (240x64 pixels) with default settings for mE GLCD's.
Example Spi_T6963C_Config_240x64;
Library Example
The following drawing demo tests advanced routines of SPI T6963C GLCD
library.
program Spi_T6963C_240x64;
//continues...
page
mikroElektronika: Development tools - Books - Compilers
337
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
//continues...
{
* init display for 240 pixel width and 128 pixel height
* 8 bits character width
* data bus on PORTD
* control bus on PORTC
* bit 0 is !WR
* bit 1 is !RD
* bit 3 is !CD
* bit 4 is RST
*
* chip enable, reverse on, 8x8 font internaly set in
library
}
Spi_Init();
Spi_T6963C_Config_240x64();
Spi_T6963C_graphics(1) ;
Spi_T6963C_text(1) ;
panel := 0 ;
i := 0 ;
curs := 0 ;
cposx := 0 ;
cposy := 0 ;
txtcols := 240 div 8;
// calculate number of text colomns
// (grafic display width divided by font width)
// text messages
// cursor
//continued...
page
338
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
//continues...
// draw rectangles
// draw a cross
// draw circles
Spi_T6963C_image(test240x64_bmp) ;
// fill the graphic screen with a picture
//continued...
page
mikroElektronika: Development tools - Books - Compilers
339
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
//continues...
while true do
begin
// if RB1 is pressed, toggle the display between graphic panel
// 0 and graphic 1
else
if(PORTB.2 <> 0) then
begin
Spi_T6963C_graphics(1) ;
Spi_T6963C_text(0) ;
Delay_ms(300) ;
end
else
if(PORTB.3 <> 0) then
begin
Spi_T6963C_graphics(0) ;
Spi_T6963C_text(1) ;
Delay_ms(300) ;
end
//continued...
page
340
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
//continues...
1:
begin
Spi_T6963C_cursor(1) ;
Spi_T6963C_cursor_blink(1) ;
end;
2:
begin
Spi_T6963C_cursor(1) ;
Spi_T6963C_cursor_blink(0) ;
end;
end;
Delay_ms(300) ;
end;
cposx := cposx + 1;
if(cposx = txtcols) then
begin
cposx := 0 ;
cposy := cposy + 1;
if(cposy = (128 div T6963C_CHARACTER_HEIGHT)) then
// if y end
cposy := 0 ;
// grafic height (128) div character height
end;
Spi_T6963C_set_cursor(cposx, cposy) ;
Delay_ms(100) ;
end;
end.
page
mikroElektronika: Development tools - Books - Compilers
341
mikroPASCAL
mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers making it simple...
PIC18F452
D4 5 24 CE
GPB4 GPA3
D5 6 23 E
GPB5 GPA2
D6 7 22 RW
GPB6 GPA1
D7 8 21 RS VCC
GPB7 GPA0
VCC
9 20
VDD INTA 11
10 19 VCC
12
VSS INTB GND
RC1 11 18 RC0 13
CS RESET OSC1
RC3 12 17 14
SCK A2 OSC2
RC5 13 16 15
SI A1 RC0
8 Mhz 16
RC4 14 15 RC1
SO A0 24
RC5
18 23
RC3 RC4
Contrast
Adjustment
P1
10K
VCC
VCC
R1
50
1 20
VDD
LED+
VSS
RST
VEE
R/W
MD
CE
RS
D0
D5
D7
D1
D3
D2
D4
D6
FS
Vo
mikroE
EasyPIC4
Dev. tool
page
342
mikroElektronika: Development tools - Books - Compilers
mikroPASCAL
making it simple... mikroPASCAL - Pascal Compiler for Microchip PIC microcontrollers
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 mikroPascal, please do not hesitate to
contact 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
mikroElektronika: Development tools - Books - Compilers
343