Pic C Ref Manual
Pic C Ref Manual
July 2005
Table Of Contents
Overview ................................................................................................................1
PCB, PCM and PCH Overview ..........................................................................1
Technical Support...............................................................................................1
Installation ..........................................................................................................2
Invoking the Command Line Compiler ...............................................................2
MPLAB Integration .............................................................................................4
Directories ..........................................................................................................4
File Formats........................................................................................................5
Direct Device Programming ...............................................................................5
Device Calibration Data......................................................................................5
Utility Programs ..................................................................................................6
PCW IDE ................................................................................................................7
File Menu............................................................................................................7
Project Menu ......................................................................................................8
Edit Menu ...........................................................................................................9
Options Menu ...................................................................................................10
Compile ............................................................................................................13
PCW Compile ...................................................................................................13
View Menu........................................................................................................13
Tools Menu.......................................................................................................15
Help Menu ........................................................................................................17
PCW Editor Keys..............................................................................................18
Project Wizard ..................................................................................................20
CCS Debugger.....................................................................................................21
Debugger - Overview........................................................................................21
Debugger - Menu..............................................................................................21
Debugger - Configure .......................................................................................21
Debugger - Control ...........................................................................................22
Debugger- Enable/Disable ...............................................................................22
Debugger - Watches.........................................................................................23
Debugger - Breaks ...........................................................................................23
Debugger - RAM...............................................................................................23
Debugger - ROM ..............................................................................................24
Debugger -Data EEPROM ...............................................................................24
Debugger - Stack..............................................................................................24
Debugger - Eval................................................................................................24
Debugger - Log.................................................................................................25
Debugger - Monitor...........................................................................................25
Debugger - Peripherals ....................................................................................25
Debugger - Snapshot .......................................................................................26
Pre-Processor ......................................................................................................27
PRE-PROCESSOR ..........................................................................................27
i
C Compiler Reference Manual
Pre-Processor Directives..................................................................................28
#ASM ................................................................................................................28
#ENDASM ........................................................................................................28
#BIT ..................................................................................................................32
#BUILD .............................................................................................................32
#BYTE ..............................................................................................................33
#CASE..............................................................................................................34
__DATE__ ........................................................................................................35
#DEFINE ..........................................................................................................35
#DEVICE ..........................................................................................................36
__DEVICE__ ....................................................................................................38
#ERROR...........................................................................................................38
__FILE__ ..........................................................................................................39
#FILL_ROM ......................................................................................................39
#FUSES............................................................................................................40
#HEXCOMMENT() ...........................................................................................41
#ID ....................................................................................................................41
#IF expr ............................................................................................................42
#ELSE ..............................................................................................................42
#ELIF ................................................................................................................42
#ENDIF.............................................................................................................42
#IGNORE_WARNINGS....................................................................................43
#IFDEF .............................................................................................................44
#IFNDEF...........................................................................................................44
#ELSE ..............................................................................................................44
#ELIF ................................................................................................................44
#ENDIF.............................................................................................................44
#INCLUDE........................................................................................................45
#INLINE ............................................................................................................46
#INT_xxxx.........................................................................................................46
#INT_DEFAULT ...............................................................................................48
#INT_GLOBAL .................................................................................................49
__LINE__..........................................................................................................49
#LIST ................................................................................................................50
#LOCATE .........................................................................................................50
#NOLIST...........................................................................................................51
#OPT ................................................................................................................51
#ORG................................................................................................................52
__PCB__ ..........................................................................................................53
__PCM__..........................................................................................................54
__PCH __ .........................................................................................................54
#PRAGMA ........................................................................................................55
#PRIORITY.......................................................................................................55
#RESERVE ......................................................................................................56
#ROM ...............................................................................................................56
ii
Table Of Contents
#SERIALIZE .....................................................................................................57
#SEPARATE ....................................................................................................59
__TIME __ ........................................................................................................60
#TYPE ..............................................................................................................60
#UNDEF ...........................................................................................................61
#USE DELAY ...................................................................................................62
#USE FAST_IO ................................................................................................62
#USE FIXED_IO...............................................................................................63
#USE I2C..........................................................................................................63
#USE RS232 ...................................................................................................64
#USE STANDARD_IO......................................................................................67
#ZERO_RAM....................................................................................................68
Data Definitions....................................................................................................69
Data Types .......................................................................................................69
Function Definition ...............................................................................................71
Function Definition............................................................................................71
Reference Parameters .....................................................................................72
C Statements And Expressions ...........................................................................73
Program Syntax................................................................................................73
Comment ..........................................................................................................73
STATEMENTS .................................................................................................74
Expressions ......................................................................................................75
Operators..........................................................................................................76
Operator Precedence .......................................................................................77
Trigraph Sequences .........................................................................................77
Built-In Functions .................................................................................................79
ABS() ................................................................................................................82
ACOS() .............................................................................................................82
ASIN() ...............................................................................................................82
ASSERT().........................................................................................................83
ATOF()..............................................................................................................83
ATOI() ...............................................................................................................84
ATOL() ..............................................................................................................84
ATOI32()...........................................................................................................84
BIT_CLEAR()....................................................................................................85
BIT_SET( )........................................................................................................86
BIT_TEST() ......................................................................................................86
BSEARCH()......................................................................................................87
CALLOC().........................................................................................................88
CEIL() ...............................................................................................................89
CLEAR_INTERRUPT().....................................................................................89
COS()................................................................................................................90
COSH().............................................................................................................90
DELAY_CYCLES() ...........................................................................................90
DELAY_MS() ....................................................................................................91
iii
C Compiler Reference Manual
DELAY_US() ....................................................................................................92
DISABLE_INTERRUPTS() ...............................................................................93
DIV() .................................................................................................................94
LDIV() ...............................................................................................................94
ENABLE_INTERRUPTS() ................................................................................95
ERASE_PROGRAM_EEPROM().....................................................................96
EXP() ................................................................................................................96
EXT_INT_EDGE() ............................................................................................97
FABS() ..............................................................................................................98
FLOOR()...........................................................................................................99
FMOD().............................................................................................................99
FREE()............................................................................................................100
FREXP() .........................................................................................................101
GET_TIMERx()...............................................................................................101
GETC() ...........................................................................................................102
CH() ................................................................................................................102
GETCHAR()....................................................................................................102
FGETC() .........................................................................................................102
GETENV() ......................................................................................................104
GETS() ...........................................................................................................106
FGETS() .........................................................................................................106
GOTO_ADDRESS() .......................................................................................107
I2C_POLL() ....................................................................................................108
I2C_READ()....................................................................................................108
I2C_START()..................................................................................................109
I2C_STOP()....................................................................................................110
I2C_WRITE() ..................................................................................................111
INPUT() ..........................................................................................................112
INPUT_STATE().............................................................................................113
INPUT_x().......................................................................................................114
ISALNUM(char) ..............................................................................................115
ISALPHA(char) ...............................................................................................115
ISDIGIT(char) .................................................................................................115
ISLOWER(char)..............................................................................................115
ISSPACE(char)...............................................................................................115
ISUPPER(char) ..............................................................................................115
ISXDIGIT(char)...............................................................................................115
ISCNTRL(x) ....................................................................................................115
ISGRAPH(x) ...................................................................................................115
ISPRINT(x) .....................................................................................................115
ISPUNCT(x)....................................................................................................115
ISAMOUNG()..................................................................................................116
ITOA() .............................................................................................................117
KBHIT()...........................................................................................................118
LABEL_ADDRESS().......................................................................................119
iv
Table Of Contents
LABS() ............................................................................................................119
LCD_LOAD() ..................................................................................................120
LCD_SYMBOL() .............................................................................................121
LDEXP() .........................................................................................................122
LOG()..............................................................................................................122
LOG10()..........................................................................................................123
LONGJMP()....................................................................................................124
MAKE8() .........................................................................................................125
MAKE16() .......................................................................................................125
MAKE32() .......................................................................................................126
MALLOC() ......................................................................................................127
MEMCPY() .....................................................................................................128
MEMMOVE() ..................................................................................................128
MEMSET()......................................................................................................129
MODF()...........................................................................................................129
OFFSETOF() ..................................................................................................130
OFFSETOFBIT() ............................................................................................130
OUTPUT_A() ..................................................................................................131
OUTPUT_B() ..................................................................................................131
OUTPUT_C()..................................................................................................131
OUTPUT_D()..................................................................................................131
OUTPUT_E() OUTPUT_F()............................................................................131
OUTPUT_G()..................................................................................................131
OUTPUT_H()..................................................................................................131
OUTPUT_J()...................................................................................................131
OUTPUT_K() ..................................................................................................131
OUTPUT_BIT()...............................................................................................132
OUTPUT_FLOAT().........................................................................................133
OUTPUT_HIGH() ...........................................................................................134
OUTPUT_LOW() ............................................................................................135
OUTPUT_TOGGLE() .....................................................................................135
PERROR()......................................................................................................136
PORT_A_PULLUPS.......................................................................................137
PORT_B_PULLUPS() ....................................................................................137
POW().............................................................................................................138
PWR() .............................................................................................................138
PRINTF() ........................................................................................................139
FPRINTF() ......................................................................................................139
PSP_OUTPUT_FULL() ..................................................................................141
PSP_INPUT_FULL() ......................................................................................141
PSP_OVERFLOW() .......................................................................................141
PUTC() ...........................................................................................................142
PUTCHAR( )...................................................................................................142
FPUTC() .........................................................................................................142
PUTS()............................................................................................................143
v
C Compiler Reference Manual
FPUTS() .........................................................................................................143
QSORT() ........................................................................................................144
RAND() ...........................................................................................................145
READ_ADC()..................................................................................................145
READ_BANK() ...............................................................................................146
READ_CALIBRATION() .................................................................................147
READ_EEPROM()..........................................................................................148
READ_PROGRAM_EEPROM ()....................................................................149
READ_PROGRAM_MEMORY () ...................................................................149
READ_EXTERNAL_MEMORY ()...................................................................149
REALLOC() ....................................................................................................150
RESET_CPU()................................................................................................151
RESTART_CAUSE() ......................................................................................152
RESTART_WDT() ..........................................................................................152
ROTATE_LEFT()............................................................................................154
ROTATE_RIGHT() .........................................................................................154
SET_ADC_CHANNEL() .................................................................................155
SET_PWM1_DUTY()......................................................................................156
SET_PWM2_DUTY()......................................................................................156
SET_PWM3_DUTY()......................................................................................156
SET_PWM4_DUTY()......................................................................................156
SET_PWM5_DUTY()......................................................................................156
SET_POWER_PWMX_DUTY() .....................................................................157
SET_POWER_PWM_OVERRIDE()...............................................................158
SET_RTCC() ..................................................................................................159
SET_TIMER0() ...............................................................................................159
SET_TIMER1() ...............................................................................................159
SET_TIMER2() ...............................................................................................159
SET_TIMER3() ...............................................................................................159
SET_TIMER4() ...............................................................................................159
SET_TIMER5() ...............................................................................................159
SET_TRIS_A()................................................................................................160
SET_TRIS_B()................................................................................................160
SET_TRIS_C() ...............................................................................................160
SET_TRIS_D() ...............................................................................................160
SET_TRIS_E()................................................................................................160
SET_TRIS_G() ...............................................................................................160
SET_TRIS_H() ...............................................................................................160
SET_TRIS_J() ................................................................................................160
SET_TRIS_K()................................................................................................160
SET_UART_SPEED() ....................................................................................161
SETJMP() .......................................................................................................162
SETUP_ADC(mode).......................................................................................163
SETUP_ADC_PORTS() .................................................................................164
SETUP_CCP1()..............................................................................................165
vi
Table Of Contents
SETUP_CCP2()..............................................................................................165
SETUP_CCP3()..............................................................................................165
SETUP_CCP4()..............................................................................................165
SETUP_CCP5()..............................................................................................165
SETUP_COMPARATOR() .............................................................................166
SETUP_COUNTERS() ...................................................................................167
SETUP_EXTERNAL_MEMORY()..................................................................168
SETUP_LCD() ................................................................................................168
SETUP_LOW_VOLT_DETECT() ...................................................................169
SETUP_OSCILLATOR() ................................................................................170
SETUP_POWER_PWM()...............................................................................171
SETUP_POWER_PWM_PINS() ....................................................................173
SETUP_PSP() ................................................................................................174
SETUP_SPI() .................................................................................................174
SETUP_SPI2() ...............................................................................................174
SETUP_TIMER_0 () .......................................................................................175
SETUP_TIMER_1() ........................................................................................176
SETUP_TIMER_2() ........................................................................................177
SETUP_TIMER_3() ........................................................................................178
SETUP_TIMER_4() ........................................................................................179
SETUP_TIMER_5() ........................................................................................180
SETUP_UART() .............................................................................................180
SETUP_VREF()..............................................................................................182
SETUP_WDT () ..............................................................................................183
SHIFT_LEFT() ................................................................................................184
SHIFT_RIGHT()..............................................................................................185
SIN () COS() ...................................................................................................186
TAN() ..............................................................................................................186
ASIN() .............................................................................................................186
ACOS() ...........................................................................................................186
ATAN()............................................................................................................186
SINH().............................................................................................................186
COSH()...........................................................................................................186
TANH() ...........................................................................................................186
ATAN2()..........................................................................................................186
SINH().............................................................................................................188
SLEEP()..........................................................................................................188
SPI_DATA_IS_IN().........................................................................................188
SPI_DATA_IS_IN2().......................................................................................188
SPI_READ() ...................................................................................................189
SPI_READ2() .................................................................................................189
SPI_WRITE()..................................................................................................190
SPI_WRITE2()................................................................................................190
SPRINTF()......................................................................................................191
SQRT() ...........................................................................................................191
vii
C Compiler Reference Manual
SRAND().........................................................................................................192
STANDARD STRING FUNCTIONS ...............................................................193
MEMCHR() .....................................................................................................193
MEMCMP().....................................................................................................193
STRCAT().......................................................................................................193
STRCHR() ......................................................................................................193
STRCMP() ......................................................................................................193
STRCOLL().....................................................................................................193
STRCSPN() ....................................................................................................193
STRICMP() .....................................................................................................193
STRLEN() .......................................................................................................193
STRLWR() ......................................................................................................193
STRNCAT() ....................................................................................................193
STRNCMP() ...................................................................................................193
STRNCPY() ....................................................................................................193
STRPBRK() ....................................................................................................193
STRRCHR()....................................................................................................193
STRSPN().......................................................................................................193
STRSTR().......................................................................................................193
STRXFRM()....................................................................................................193
STRCPY().......................................................................................................195
STRCOPY()....................................................................................................195
STRTOD() ......................................................................................................196
STRTOK().......................................................................................................197
STRTOL() .......................................................................................................198
STRTOUL() ....................................................................................................199
SWAP()...........................................................................................................200
TAN() ..............................................................................................................200
TANH() ...........................................................................................................200
TOLOWER() ...................................................................................................201
TOUPPER( )...................................................................................................201
WRITE_BANK()..............................................................................................201
WRITE_EEPROM() ........................................................................................202
WRITE_EXTERNAL_MEMORY( ) .................................................................203
WRITE_PROGRAM_EEPROM ( ) .................................................................204
WRITE_PROGRAM_MEMORY( )..................................................................205
Standard C Definitions .......................................................................................207
errno.h ............................................................................................................207
float.h ..............................................................................................................207
limits.h ............................................................................................................209
locale.h ...........................................................................................................209
setjmp.h ..........................................................................................................209
stddef.h...........................................................................................................210
stdio.h .............................................................................................................210
stdlib.h ............................................................................................................210
viii
Table Of Contents
ix
Overview
PCB, PCM and PCH Overview
The PCB, PCM and PCH are separate compilers. PCB is for 12 bit opcodes,
PCM is for 14 bit opcodes and PCH is for the 16 and 18 bit PICmicro® MCU.
Since much is in common among the compilers, all three are covered in this
reference manual. Features and limitations that apply to only specific controllers
are indicated within. These compilers are specially designed to meet the unique
needs of the PICmicro® MCU controllers. These tools allow developers to
quickly design application software for these controllers in a highly readable,
high-level language.
Technical Support
http://www.ccsinfo.com/download.shtml
for 30 days after the initial purchase. For one year’s worth of updates, you can
purchase a Maintenance Plan directly from CCS. Also found on our web page
are known bugs, the latest version of the software, and other news about the
compiler.
We strive to ensure that each upgrade provides greater ease of use along with
minimal, if any, problems. However, this is not always possible. To ensure that
all problems that you encounter are corrected in a diligent manner, we suggest
that you email us at [email protected] outlining your specific problem along
with an attachment of your file. This will ensure that solutions can be suggested
to correct any problem(s) that may arise. We try to respond in a timely manner
and take pride in our technical support.
1
C Compiler Reference Manual
Secondly, if we are unable to solve your problem by email, feel free to telephone
us at (262) 522-6500 x 32. Please have all your supporting documentation on-
hand so that your questions can be answered in an efficient manner. Again, we
will make every attempt to solve any problem(s) that you may have. Suggestions
for improving our software are always welcome and appreciated.
Installation
PCW INSTALLATION:
Insert CD ROM, select each of the programs you wish to install and follow the
on-screen instructions.
Valid options:
+FB Select PCB (12 bit) -D Do not create debug file
+FM Select PCM (14 bit) +DS Standard .COD format debug file
+FH Select PCH +DM .MAP format debug file
(PIC18XXX)
+FS Select SXC (SX) +DC Expanded .COD format debug file
+ES Standard error file +EO Old error file format
+T Create call tree (.TRE) -T Do not generate a tree file
+A Create stats file (.STA) -A Do not create stats file (.STA)
+EW Show warning -EW Suppress warnings (use with +EA)
messages
+EA Show all error messages -E Only show first error
and all warnings
+Yx Optimization level x (0-9) +DF Enables the output of a
COFF debug file.
The xxx in the following are optional. If included it sets the file extension:
2
Overview
+LNxxx Normal list file +O8xxx 8 bit Intel HEX output file
+LSxxx MPASM format list +OWxxx 16 bit Intel HEX output file
file
+LOxxx Old MPASM list file +OBxxx Binary output file
+LYxxx Symbolic list file -O Do not create object file
-L Do not create list file
+STDOUT Outputs errors to STDOUT (for use with third party editors)
+SETUP Install CCSC into MPLAB (no compile is done)
+V Show compiler version (no compile is done)
+Q Show all valid devices in database (no compile is done)
3
C Compiler Reference Manual
If @filename appears on the CCSC command line, command line options will be
read from the specified file. Parameters may appear on multiple lines in the file.
If the file CCSC.INI exists in the same directory as CCSC.EXE, then command
line parameters are read from that file before they are processed on the
command line.
Examples:
CCSC +FM C:\PICSTUFF\TEST.C
CCSC +FM +P +T TEST.C
MPLAB Integration
MPLAB 5:
If MPLAB is installed before the compiler, then integration with MPLAB is
automatic. Otherwise use the following command:
CCSC +SETUP
MPLAB 6:
A plug-in program must be executed on the computer with MPLAB 6 before
MPLAB 6 can use the CCS C compiler. If this plug-in did not come with your
version of MPLAB you should download it from the download page of the CCS
web site.
The specific instructions for compiling and running from MPLAB will vary
depending on the version. In general when creating a project be sure to select
the CCS C Compiler as the tool suite, then follow the normal MPLAB instructions.
Directories
The compiler will search the following directories for Include files.
• Directories listed on the command line
• Directories specified in the .PJT file
• The same directory as the source file
By default, the compiler files are put in C:\Program Files\PICC and the example
programs and all Include files are in C:\Program Files\PICC\EXAMPLES.
4
Overview
The compiler itself is a DLL file. The DLL files are in a DLL directory by default in
C:\Program Files\PICC\DLL. Old compiler versions may be kept by renaming
this directory.
File Formats
The compiler can output 8 bit hex, 16 bit hex, and binary files. Two listing formats
are available. Standard format resembles the Microchip tools and may be
required by some third-party tools. The simple format is easier to read. The
debug file may either be a Microchip .COD file or Advanced Transdata .MAP file.
All file formats and extensions are selected via the Options|File Formats menu
option in the Windows IDE.
The IDE has a program option in the main menu bar. When invoked, the IDE will
issue a command to start the user's device programmer. The commands are
specified in the Options|Debugger/Programer window. The %H is replaced
with the HEX filename and %D is replaced with the device number. Put a ! at the
end of the command line if you would like a pause before returning to IDE. Only
programs that can be invoked by a command will work with this option.
Some devices from Microchip have calibration data programmed into the
program area when shipped from the factory. Each part has its own unique data.
This poses some special problems during development. When an UV erasable
(windowed) part is erased, the calibration data is erased as well. Calibration data
can be forced into the chip during programming by using a #ROM directive with
the appropriate data.
The PCW package includes a utility program to help streamline this process.
When a new chip is purchased, the chip should be read into a hex file. Execute
the Tools|Extract Cal Data Utility and select a name (.C) for this part. The
utility will create an Include File with specified name that will have the correct
#ROM directives for the part. During prototype development add a #Include
directive and change the name before each build to the part # that is about to be
programmed. For production (OTP parts) simply comment out the #Include.
5
C Compiler Reference Manual
Utility Programs
DEVEDIT DEVEDIT is a Windows utility (PCW only) that will edit the
device database. The compiler uses the device database to
determine specific device characteristics at compile time.
This utility will allow devices to be added, modified or
removed. To add a device, highlight the closest equivalent
chip and click on COPY. To edit or delete, highlight the
device and click on the appropriate button.
CCSC +FM +V This will show the current compiler version. Replace +FM
with +FB or +FH for the other compilers.
6
PCW IDE
File Menu
Open Opens a file into the editor. If there are no other files open then
the project name is set to this files name. Ctrl-O is the shortcut.
Reopen Lists all the recently used files and allows the user to open
them by selecting the appropriate file.
Save Saves the file currently selected for editing. Ctrl-S is the
shortcut.
7
C Compiler Reference Manual
Close Closes the file currently open for editing. Note that while a file is
open in PCW for editing no other program may access the file.
Shift F11 is the shortcut.
Printer Setup Allows the selection of a printer and the printer settings.
Project Menu
Open A .PJT file is specified and the main source file is loaded.
8
PCW IDE
Open A .PJT file is specified and all files used in the project are opened.
All Files In order for this function to work the program must have been
compiled in order for the include files to become known.
Reopen Lists all the recently used project files and allows the user to open
them by selecting the appropriate file.
Find Text In Searches all files in a project for a given text string.
Project
Print All Files All files in the project are printed. For this function to work the
program must have been compiled in order for the include files to
become known.
Include Dirs Allows the specification of each directory to be used to search for
include files for just this project. This information is saved in the
.PJT file.
Close Project Closes all files associated with the current project.
Edit Menu
Cut Moves the selected text from the file to the clipboard.
Find Highlights the matching { or ). The editor will start counting the
matching open and closed braces and highlight the closing or opening
9
C Compiler Reference Manual
braces item when they match. Simply place the cursor on one of the
items and the matching one will be highlighted.
Next Selects the next open file as the current file for editing.
Window
Previous Selects the previous open file as the current file for editing.
Window
Options Menu
Recall When selected PCW will always start with the same files open as
Open Files were open when it last shut down. When not selected PCW
always starts with no files open.
Editor Options:
Syntax Highlighting
10
PCW IDE
Auto Indent
When selected and the ENTER is pressed the cursor moves to
the next line under the first character in the previous line. When
not selected the ENTER always moves to the beginning of the
next line.
WordStar keys
When selected the editing keys are WordStar style. WordStar
commands will enable additional keystrokes recognized by the
editors. See EDITOR for more information.
TABS:
Tab size
Determines the number of characters between tab positions.
Tabs allow you to set the number of spaces equated by a tab and
whether or not the tabs are converted to spaces or left as tabs.
Keep Tabs
When selected the editor inserts a tab character (ASCII 9) when
the TAB key is pressed.
Insert Spaces
When selected and the TAB key is pressed, spaces are inserted
up to the next tab position.
Display Margin
Tab: Visible left Margin
When selected the left margin of the editor becomes visible.
11
C Compiler Reference Manual
ERROR FILE OPTIONS
Editor Font
Selects the font of the editor.
Font Size:
Size of the editor font.
Font Style
Style of the editor font (Italic/Bold/Underline).
Color Tab: This tab allows the user to select the color for syntax highlighting.
Customize This option gives a list of icons that can be added to the tool bar
for speedy access of functionalities of the debugger.
OBJECT FILE OPTIONS
File ALLOWS SELECTION OF THE OUTPUT FILE FORMATS.
Formats DEBUG FILE OPTIONS
Microchip COD Standard PICmicro® MCU
RICE16 MAP Used only be older RICE16 S/W
To Extended COD COD file with advanced debug info
12
PCW IDE
Compile
PCW Compile
Compiles the current project (name is in lower right) using the current compiler
(name is on the toolbar).
View Menu
C/ASM Opens the listing file in read only mode. The file must have
been compiled to view the list file. If open, this file will be
updated after each compile. The listing file shows each C
source line and the associated assembly code generated for
the line.
For Example:
……………delay_ms(3);
0F2: MOVLW 05
0F3: MOVWF 08
0F4: DESCZ 08,F
0F5: GOTO 0F4
…………….while input(pin_0));
0F6: BSF 0B,3
13
C Compiler Reference Manual
Symbol Map Opens the symbol file in read only mode. The file must have
been compiled to view the symbol file. If open, this file will
be updated after each compile. The symbol map shows each
register location and what program variables are saved in
each location.
FOR EXAMPLE:
08 @SCRATCH
09 @SCRATCH
0A TRIS_A
0B TRIS_B
0C MAIN.SCALE
0D MAIN.TIME
0E GET_SCALE.SCALE
0E PUTHEX.N
0E MAIN.@SCRATCH
Call Tree Opens the tree file in read only mode. The file must have
been compiled to view the tree file. If open, this file will be
updated after each compile. The call tree shows each
function and what functions it calls along with the ROM and
RAM usage for each.
FOR EXAMPLE:
Main 0/30
INIT 0/6
WAIT_FOR_HOST 0/23 (Inline)
DELAY_US 0/12
SEND_DATA 0/65
14
PCW IDE
Statistics Opens the stats file in read only mode. The file must have
been compiled to view the stats file. If open, this file will be
updated after each compile. The statistics file shows each
function, the ROM and RAM usage by file, segment and
name.
Data Sheet This tool will bring up Acrobat Reader with the manufacture
data sheet for the selected part. If data sheets were not
copied to disk, then the CCS CD ROM or a manufacture CD
ROM must be inserted.
Binary file Opens a binary file in read only mode. The file is shown in
HEX and ASCII.
COD Debug file Opens a debug file in read only mode. The file is shown in
an interpreted form.
Valid Fuses Shows a list of all valid keywords for the #fuses directive for
this device.
Valid Interrupts Shows a list of all valid keywords for the #int_xxxx directive
and enable/disable _interrupts for this device.
Tools Menu
Device Editor This tool allows the essential characteristics for each
supported processor to be specified. This tool edits a
database used by the compiler to control the compilation.
CCS maintains this database (Devices.dat) however users
may want to add new devices or change the entries for a
device for a special application. Be aware if the database is
changed and then the software is updated, the changes will
be lost. Save your DEVICES.DAT file during an update to
prevent this.
Device Selector This tool uses the device database to allow a parametric
selection of devices. By selecting key characteristics the tool
displays all eligible devices.
15
C Compiler Reference Manual
File Compare Compares two files. When source or text file is selected,
then a normal line by line compare is done. When list file is
selected the compare may be set to ignore RAM and/or ROM
addresses to make the comparison more meaningful. For
example if an asm line was added at the beginning of the
program a normal compare would flag every line as different.
By ignoring ROM addresses then only the extra line is
flagged as changed. Two output formats are available. One
for display and one for files or printing.
Disassembler This tool will take as input a HEX file and will output ASM.
The ASM may be in a form that can be used as inline ASM.
Extract This tool will take as input a HEX file and will extract the
Cal Data calibration data to a C include file. This may be used to
maintain calibration data for a UV erasable part. By including
the include file in a program the calibration data will be
restored after re-burning the part.
Program Chip This simply invokes device programmer software with the
output file as specified in the Compile\Options window. This
command will invoke the device programmer software of your
choice. Use the compile options to establish the command
line.
16
PCW IDE
Internet These options invoke your WWW browser with the requested
CCS Internet page:
Help Menu
About Shows the version of the IDE and each installed compiler.
Keyword at cursor Does an index search for the keyword at the cursor location.
Press F1 to use this feature.
17
C Compiler Reference Manual
CURSOR MOVEMENT
Left Arrow Move cursor one character to the left
Right Arrow Move cursor one character to the right
Up Arrow Move cursor one line up
Down Arrow Move cursor one line down
Ctrl Left Arrow Move cursor one word to the left
Ctrl Right Arrow Move cursor one word to the right
Home Move cursor to start of line
End Move cursor to end of line
Ctrl PgUp Move cursor to top of window
Ctrl PgDn Move cursor to bottom of window
PgUp Move cursor to previous page
PgDn Move cursor to next page
Ctrl Home Move cursor to beginning of file
Ctrl End Move cursor to end of file
Ctrl S Move cursor one character to the left
Ctrl D Move cursor one character to the right
Ctrl E Move cursor one line up
Ctrl X ** Move cursor one line down
Ctrl A Move cursor one word to the left
Ctrl F Move cursor one word to the right
Ctrl Q S Move cursor to top of window
Ctrl Q D Move cursor to bottom of window
Ctrl R Move cursor to beginning of file
Ctrl C * Move cursor to end of file
Shift ~ Where ~ is any of the above: Extend selected
area as cursor moves
18
PCW IDE
EDITING COMMANDS
F4 Select next text with matching () or {}
Ctrl # Goto bookmark # 0-9
Shift Ctrl # Set bookmark # 0-9
Ctrl Q # Goto bookmark # 0-9
Ctrl K # Set bookmark # 0-9
Ctrl W Scroll up
Ctrl Z * Scroll down
Del Delete the following character
BkSp Delete the previous character
Shift BkSp Delete the previous character
Ins Toggle Insert/Overwrite mode
Ctrl Z ** Undo last operation
Shift Ctrl Z Redo last undo
Alt BkSp Restore to original contents
Ctrl Enter Insert new line
Shift Del Cut selected text from file
Ctrl Ins Copy selected text
Shift Ins Paste
Tab Insert tab or spaces
Ctrl Tab Insert tab or spaces
Ctrl P ~ Insert control character ~ in text
Ctrl G Delete the following character
Ctrl T Delete next word
Ctrl H Delete the previous character
Ctrl Y Delete line
Ctrl Q Y Delete to end of line
Ctrl Q L Restore to original contents
Ctrl X ** Cut selected text from file
Ctrl C ** Copy selected text
Ctrl V Paste
Ctrl K R Read file at cursor location
Ctrl K W Write selected text to file
Ctrl-F ** Find text
Ctrl-R ** Replace text
F3 Repeat last find/replace
19
C Compiler Reference Manual
Project Wizard
After starting the Wizard you are prompted for the name for your new main c file.
This file will be created along with a corresponding .h file.
The tabbed notebook that is displayed allows the selection of various project
parameters. For example:
• General Tab -> Select the device and clock speed
• Communications tab --> Select RS232 ports
• I/O Pins tab --> Select you own names for the various pins
When any tab is selected you may click on the blue square in the lower right and
the wizard will show you what code is generated as a result of your selections in
that screen.
After clicking OK all the code is generated and the files are opened in the PCW
editor
This command will bring up a number of fill-in-the-blank forms about your new
project. RS232 I/O and 12C characteristics, timer options, interrupts used, A/D
options, drivers needed and pin names all may be specified in the forms. When
drivers are selected, the tool will select required pins and pins that can be
combined will be. The user may edit the final pins selections. After all selections
are made an initial .c and .h files are created with #defines, #includes and
initialization commands require for your project. This is a fast way to start a new
project. Once the files are created you cannot return to the menus to make
further changes.
20
CCS Debugger
Debugger - Overview
The PCW IDE comes with a built in debugger. The debugger is started via the
Debug|Enable menu selection. This section contains the following topics:
• Debug Menu
• Configure
• Control
• Watches
• Breaks
• RAM
• ROM
• Data EEPROM
• Stack
• Eval
• Log
• Monitor
• Peripherals
• Snapshot
• Enable/Disable
Debugger - Menu
This menu contains all the debugger options if the ICD is connected to the PC
and the prototype board for debugging the C program.
Debugger - Configure
The configure tab allows a selection of what hardware the debugger connects to.
Other configuration options vary depending on the hardware debugger in use.
The configure tab also allows manually reloading the target with your code.
If the debugger window is open and the “Reload target after every compile” box
is selected every time the program is compiled the program is downloaded into
the target.
21
C Compiler Reference Manual
A debugger profile contains all the selections in all the debugger tabs such as the
variables being watched, the debugger window position and size and the
breakpoints set. Profiles may be saved into files and loaded from the configure
tab. The last profile file saved or loaded is also saved in the projects .PJT file for
use the next time the debugger is started for that project.
Debugger - Control
The reset button puts the target into a reset condition. Note that in the source file
windows, Listing window and ROM window the current program counter line is
highlighted in yellow. This is the next line to execute.
The Go button starts the program running. While running none of the debugger
windows are updated with current information. The program stops when a break
condition is reached or the STOP button is clicked.
The STEP button will execute one C line if the source file is the active editor tab
and one assembly line if the list file is the active editor tab. STEP OVER works
like STEP except if the line is a call to another function then the whole function is
executed with one STEP OVER.
THE GO TO button will execute until the line the editor cursor is on is reached.
Debugger- Enable/Disable
This option enables/disables the debugger if it is not already in that state. The
menu option automatically changes to the other one. Shows or hides the PCW
debugger IDE as required.
22
CCS Debugger
Debugger - Watches
Click the + icon when the watch tab is selected to enter a new expression to
watch. The helper window that pops up will allow you to find identifiers in your
program to watch. Normal C expressions may be watched like:
X
X+Y
BUFFER[X]
BUUFER[X].NAME
Note that where the editor cursor is in the source file at the time you enter the watch
will affect how the expression is evaluated. For example consider you have two
functions F1 and F2 and you simply enter I as a watch expression. The I that you get
will depend on what function the cursor is in. You can proceed any variable with a
function name and period to exactly specify the variable (like: F1.I).
Debugger - Breaks
To set a breakpoint move the editor cursor to a source or list file line. Then
select the break tab in the debugger and click the + icon.
Note that the breaks work differently for different hardware units. For example on
a PIC16 using an ICD, you can only have one breakpoint and the processor
executes the line (assembly line) the break is set on before stopping.
Debugger - RAM
The debugger RAM tab shows the target RAM. Red numbers indicate locations
that changed since the last time the program stopped. Some locations are
blacked out that either do not represent a physical register or are not available
during debugging. To change a RAM location double click the value to change.
All numbers are in hex.
23
C Compiler Reference Manual
Debugger - ROM
The ROM tab shows the contents of the target program memory both in hex and
disassembled. This data is initially from the HEX file and is not refreshed from
the target unless the user requests it. To reload from the target right click in the
window.
The debugger Data EEPROM tab shows the target Data EEPROM. Red
numbers indicate locations that changed since the last time the program
stopped. To change a Data EEPROM location double click the value to change.
All numbers are in hex.
Debugger - Stack
This tab shows the current stack. The last function called and all its parameters
are shown at the top of the list.
Note that the PIC16 ICD cannot read the stack. To view the stack, a #DEVICE
CCSICD=TRUE line must appear in your source file. The compiler then
generates extra code to allow the stack to be seen by the debugger.
Debugger - Eval
The evaluation also allows calling a C function in the target. In this case you
must provide all the parameters. The result of the function is shown in the result
window. This capability is not available on all debugger platforms.
24
CCS Debugger
Debugger - Log
The log capability is a combination of the break, watch and snapshot. You
specify a break number and an expression to evaluate each time the break is
reached. The program is restarted after the expression is evaluated and the
result is logged in the log window. Multiple expressions may be specified by
separating them with semi-colons. The log window may be saved to a file. Each
expression result in the file is separated with a tab making it suitable for importing
into a spreadsheet program.
Debugger - Monitor
The monitor window shows data from the target and allows entry of data to be
sent to the target. This is done on the target like this:
#use RS232(DEBUGGER)
...
printf(“Test to run? “);
test=getc();
For the PIC16 ICD the B3 pin is used on the target to implement this capability.
The normal ICD cable is already set up correctly for this.
Debugger - Peripherals
This tab shows the state of the targets special function registers. This data is
organized by function. Select a function from the drop down list and the registers
associated with that function are shown. Below the registers is a listing of each
field in the registers with an interpretation of what the bit pattern means.
25
C Compiler Reference Manual
Debugger - Snapshot
Click on the camera icon to bring up the snapshot window. The snapshot
function allows the recording of the contents of part or all of the various debugger
windows. On the right hand side you may select what items you need to record.
The top right is a selection of where to record the data. The options are:
• Printer
• A new file
• Append to an existing file
Furthermore you can click on the APPEND COMMENT button to add a comment
to be inserted into the file.
26
Pre-Processor
PRE-PROCESSOR
27
C Compiler Reference Manual
Pre-Processor Directives
#ASM
#ENDASM
Syntax: #asm
or
#asm ASIS
code
#endasm
Purpose: The lines between the #ASM and #ENDASM are treated as
assembly code to be inserted. These may be used
anywhere an expression is allowed. The syntax is
described on the following page. The predefined variable
_RETURN_ may be used to assign a return value to a
function from the assembly code. Be aware that any C
code after the #ENDASM and before the end of the function
may corrupt the value.
If the second form is used with ASIS then the compiler will
not do any automatic bank switching for variables that cannot
be accessed from the current bank. The assembly code is
28
Pre-Processor
int count;
#asm
movlw 0x8
movwf count
movlw 0
loop:
xorwf data,w
rrf data,f
decfsz count,f
goto loop
movlw 1
awdwf count,f
movwf _return_
#endasm
}
29
C Compiler Reference Manual
30
Pre-Processor
PIC 18
ADDWF f,d ADDWFC f,d ANDWF f,d
CLRF f COMF f,d CPFSEQ f
CPFSGT f CPFSLT f DECF f,d
DECFSZ f,d DCFSNZ f,d INCF f,d
INFSNZ f,d IORWF f,d MOVF f,d
MOVFF fs,d MOVWF f MULWF f
NEGF f RLCF f,d RLNCF f,d
RRCF f,d RRNCF f,d SETF f
SUBFWB f,d SUBWF f,d SUBWFB f,d
SWAPF f,d TSTFSZ f XORWF f,d
BCF f,b BSF f,b BTFSC f,b
BTFSS f,b BTG f,d BC n
BN n BNC n BNN n
BNOV n BNZ n BOV n
BRA n BZ n CALL n,s
CLRWDT - DAW - GOTO n
31
C Compiler Reference Manual
#BIT
int result;
#bit result_odd = result.0
...
if (result_odd)
#BUILD
32
Pre-Processor
Examples: #build(memory=0x20000:0x2FFFF)
//Assigns memory space
#build(reset=0x200,interrupt=0x208)
//Assigns start location of
//reset and interrupt vectors
#build(reset=0x200:0x207,
interrupt=0x208:0x2ff)
//Assign limited space for
//reset and interrupt vectors.
#BYTE
Syntax: #byte id = x
33
C Compiler Reference Manual
struct {
short int r_w;
short int c_d;
int unused : 2;
int data : 4; } a_port;
#byte a_port = 5
...
a_port.c_d = 1;
#CASE
Syntax: #case
Elements: None
Examples: #case
int STATUS;
void func() {
int status;
...
STATUS = status; // Copy local status to
//global
}
34
Pre-Processor
__DATE__
Syntax: __date__
Elements: None
#DEFINE
35
C Compiler Reference Manual
If the text contains a string of the form #idx then the result
upon evaluation will be the parameter id concatenated with
the string x.
#DEVICE
36
Pre-Processor
37
C Compiler Reference Manual
__DEVICE__
Syntax: __device __
Elements: None
#ERROR
38
Pre-Processor
__FILE__
Syntax: __file__
Elements: None
Examples: if(index>MAX_ENTRIES)
printf("Too many entries, source file: "
__FILE__ " at line " __LINE__ "\r\n");
#FILL_ROM
39
C Compiler Reference Manual
#FUSES
Purpose: This directive defines what fuses should be set in the part
when it is programmed. This directive does not affect the
compilation; however, the information is put in the output
files. If the fuses need to be in Parallax format, add a PAR
option. SWAP has the special function of swapping (from
the Microchip standard) the high and low BYTES of non-
program data in the Hex file. This is required for some
device programmers.
40
Pre-Processor
#HEXCOMMENT()
Syntax: #HEXCOMMENT
Elements: None
Purpose: Puts a comment in the hex file Puts a comment in the hex file
#ID
The first syntax will take a 16-bit number and put one nibble
in each of the four ID words in the traditional manner. The
second syntax specifies the exact value to be used in each
of the four ID words.
41
C Compiler Reference Manual
#IF expr
#ELSE
#ELIF
#ENDIF
42
Pre-Processor
#IGNORE_WARNINGS
43
C Compiler Reference Manual
#IFDEF
#IFNDEF
#ELSE
#ELIF
#ENDIF
Syntax: #ifdef id
code
#elif
code
#else
code
#endif
#ifndef id
code
#elif
code
#else
code
#endif
Purpose: This directive acts much like the #IF except that the
preprocessor simply checks to see if the specified ID is
known to the preprocessor (created with a #DEFINE).
#IFDEF checks to see if defined and #IFNDEF checks to see
if it is not defined.
...
#ifdef DEBUG
printf("debug point a");
#endif
44
Pre-Processor
#INCLUDE
Purpose: Text from the specified file is used at this point of the
compilation. If a full path is not specified the compiler will use
the list of directories specified for the project to search for the
file. If the filename is in "" then the directory with the main
source file is searched first. If the filename is in <> then the
directory with the main source file is searched last.
#include<C:\INCLUDES\COMLIB\MYRS232.C>
45
C Compiler Reference Manual
#INLINE
Syntax: #inline
Elements: None
Purpose: Tells the compiler that the function immediately following the
directive is to be implemented INLINE. This will cause a
duplicate copy of the code to be placed everywhere the
function is called. This is useful to save stack space and to
increase speed. Without this directive the compiler will
decide when it is best to make procedures INLINE.
Examples: #inline
swapbyte(int &a, int &b) {
int t;
t=a;
a=b;
b=t;
}
#INT_xxxx
46
Pre-Processor
47
C Compiler Reference Manual
Examples: #int_ad
adc_handler() {
adc_active=FALSE;
}
#int_rtcc noclear
isr() {
...
}
Example Files: See ex_sisr.c and ex_stwt.c for full example programs.
#INT_DEFAULT
Syntax: #int_default
Elements: None
Examples: #int_default
default_isr() {
printf("Unexplained interrupt\r\n");
}
48
Pre-Processor
#INT_GLOBAL
Syntax: #int_global
Elements: None
Examples: #int_global
isr() { // Will be located at location 4
#asm
bsf isr_flag
retfie
#endasm
}
__LINE__
Syntax: __line__
Elements: None
Examples: if(index>MAX_ENTRIES)
printf("Too many entries, source file: "
__FILE__" at line " __LINE__ "\r\n");
49
C Compiler Reference Manual
#LIST
Syntax: #list
Elements: None
#LOCATE
Elements: id is a C variable,
x is a constant memory address
50
Pre-Processor
#NOLIST
Syntax: #nolist
Elements: None
Purpose: Stops inserting source lines into the .LST file (until a #LIST)
#OPT
Syntax: #OPT n
Purpose: The optimization level is set with this directive. This setting
applies to the entire program and may appear anywhere in
the file. Optimization level 5 will set the level to be the same
as the PCB, PCM, and PCH standalone compilers. The PCW
default is 9 for full optimization. PIC18XXX devices may
utilize levels 10 and 11 for extended optimization. Level 9
may be used to set a PCW compile to look exactly like a
PCM compile for example. It may also be used if an
optimization error is suspected to reduce optimization.
51
C Compiler Reference Manual
Examples: #opt 5
#ORG
Elements: start is the first ROM location (word address) to use, end is
the last ROM location, segment is the start ROM location
from a previous #org
Purpose: This directive will fix the following function or constant
declaration into a specific ROM area. End may be omitted if
a segment was previously defined if you only want to add
another function to the segment.
52
Pre-Processor
#ORG 0x1E00
Anotherfunc(){
// This will be somewhere 1E00-1F00
}
__PCB__
Syntax: __pcb __
Elements: None
53
C Compiler Reference Manual
__PCM__
Syntax: __pcm __
Elements: None
__PCH __
Syntax: __pch __
Elements: None
54
Pre-Processor
#PRAGMA
#PRIORITY
Purpose: The priority directive may be used to set the interrupt priority.
The highest priority items are first in the list. If an interrupt is
active it is never interrupted. If two interrupts occur at
around the same time then the higher one in this list will be
serviced first.
55
C Compiler Reference Manual
#RESERVE
#ROM
56
Pre-Processor
Purpose: Allows the insertion of data into the .HEX file. In particular,
this may be used to program the '84 data EEPROM, as
shown in the following example.
#SERIALIZE
57
C Compiler Reference Manual
58
Pre-Processor
#SEPARATE
Syntax: #separate
Elements: None
Examples: #separate
swapbyte (int *a, int *b) {
int t;
t=*a;
*a=*b;
*b=t;
}
59
C Compiler Reference Manual
__TIME __
Syntax: __time__
Elements: None
#TYPE
60
Pre-Processor
#UNDEF
Syntax: #undef id
61
C Compiler Reference Manual
#USE DELAY
Purpose: Tells the compiler the speed of the processor and enables
the use of the built-in functions: delay_ms() and delay_us().
Speed is in cycles per second. An optional restart_WDT
may be used to cause the compiler to restart the WDT while
delaying.
#USE FAST_IO
Purpose: Affects how the compiler will generate code for input and
output instructions that follow. This directive takes effect
until another #use xxxx_IO directive is encountered. The
fast method of doing I/O will cause the compiler to perform
I/O without programming of the direction register. The user
must ensure the direction register is set correctly via
set_tris_X().
62
Pre-Processor
#USE FIXED_IO
Elements: port is A-G, pin is one of the pin constants defined in the
devices .h file.
Purpose: This directive affects how the compiler will generate code for
input and output instructions that follow. This directive takes
effect until another #use xxx_IO directive is encountered.
The fixed method of doing I/O will cause the compiler to
generate code to make an I/O pin either input or output every
time it is used. The pins are programmed according to the
information in this directive (not the operations actually
performed). This saves a byte of RAM used in standard I/O.
#USE I2C
63
C Compiler Reference Manual
#use I2C(slave,sda=PIN_C4,scl=PIN_C3
address=0xa0,FORCE_HW)
#USE RS232
64
Pre-Processor
65
C Compiler Reference Manual
66
Pre-Processor
Purpose: This directive tells the compiler the baud rate and pins used for
serial I/O. This directive takes effect until another RS232
directive is encountered. The #USE DELAY directive must
appear before this directive can be used. This directive enables
use of built-in functions such as GETC, PUTC, and PRINTF.
When using parts with built-in SCI and the SCI pins are
specified, the SCI will be used. If a baud rate cannot be
achieved within 3% of the desired value using the current clock
rate, an error will be generated. The definition of the
RS232_ERRORS is as follows:
No UART:
• Bit 7 is 9th bit for 9 bit data mode (get and put).
• Bit 6 set to one indicates a put failed in float high mode.
With a UART:
• Used only by get:
• Copy of RCSTA register except:
• Bit 0 is used to indicate a parity error.
#USE STANDARD_IO
67
C Compiler Reference Manual
Purpose: This directive affects how the compiler will generate code for
input and output instructions that follow. This directive takes
effect until another #use xxx_io directive is encountered.
The standard method of doing I/O will cause the compiler to
generate code to make an I/O pin either input or output every
time it is used. On the 5X processors this requires one byte
of RAM for every port set to standard I/O.
#ZERO_RAM
Syntax: #zero_ram
Elements: None
Purpose: This directive zero's out all of the internal registers that may
be used to hold variables before program execution begins.
Examples: #zero_ram
void main() {
68
Data Definitions
Data Types
The following tables show the syntax for data definitions. If the keyword
TYPEDEF is used before the definition then the identifier does not allocate space
but rather may be used as a type specifier in other data definitions. If the
keyword CONST is used before the identifier, the identifier is treated as a
constant. Constants must have an initializer and may not be changed at run-
time. Pointers to constants are not permitted.
SHORT is a special type used to generate very efficient code for bit operations
and I/O. Arrays of SHORT and pointers to SHORT are not permitted. Note: [ ]
in the following tables indicates an optional item.
DATA DECLARATIONS
[type-qualifier] [type-specifier] [declarator];
enum [id] { [ id [ = cexpr]] }
TYPE QUALIFIER
static Variable is globally active and initialized to 0
auto Variable exists only while the procedure is active
This is the default and AUTO need not be used.
double Is a reserved word but is not a supported data type.
extern Is allowed as a qualifier however, has no effect.
register Is allowed as a qualifier however, has no effect.
69
C Compiler Reference Manual
TYPE-SPECIFIER
int1 Defines a 1 bit number
int8 Defines an 8 bit number
int16 Defines a 16 bit number
int32 Defines a 32 bit number
char Defines a 8 bit character
float Defines a 32 bit floating point number
short By default the same as int1
Int By default the same as int8
long By default the same as int16
void Indicates no specific type
The id after ENUM is created as a type large enough to the largest constant in the
list. The ids in the list are each created as a constant. By default the first id is set to
zero and they increment by one. If a =cexpr follows an id that id will have the value of
the constant expression and the following list will increment by one.
The :cexpr after an id specifies in a struct or union the number of bits to use for
the id. This number may be 1-8. Multiple [] may be used for multiple dimension
arrays. Structures and unions may be nested. The id after STRUCT may be
used in another STRUCT and the {} is not used to reuse the same structure form
again.
Examples:
int a,b,c,d;
typedef int byte;
typedef short bit;
bit e,f;
byte g[3][2];
char *h;
enum boolean {false, true};
boolean j;
byte k = 5;
byte const WEEKS = 52;
byte const FACTORS [4] =
{8, 16, 64, 128};
struct data_record {
byte a [2];
byte b : 2; /*2 bits */
byte c : 3; /*3 bits*/
int d;
}
70
Function Definition
Function Definition
When one of the above are used and the function has a prototype (forward
declaration of the function before it is defined) you must include the qualifier on
both the prototype and function definition.
A (non-standard) feature has been added to the compiler to help get around the
problems created by the fact that pointers cannot be created to constant strings.
A function that has one CHAR parameter will accept a constant string where it is
called. The compiler will generate a loop that will call the function once for each
character in the string.
Example:
void lcd_putc(char c ) {
...
}
71
C Compiler Reference Manual
Reference Parameters
The compiler has limited support for reference parameters. This increases the
readability of code and the efficiency of some inline procedures. The following
two procedures are the same. The one with reference parameters will be
implemented with greater efficiency when it is inline.
funct_a(int*x,int*y){
/*Traditional*/
if(*x!=5)
*y=*x+3;
}
funct_a(&a,&b);
funct_b(int&x,int&y){
/*Reference params*/
if(x!=5)
y=x+3;
}
funct_b(a,b);
72
C Statements And Expressions
Program Syntax
A program is made up of the following four elements in a file. These are covered
in more detail in the following paragraphs.
• Comment
• Pre-Processor Directive
• Data Definition
• Function Definition
Comment
A comment may appear anywhere within a file except within a quoted string.
Characters between the /* and */ are ignored. Characters after a // up to the end
of a line are also ignored.
73
C Compiler Reference Manual
STATEMENTS
STATEMENT EXAMPLE
if (expr) stmt; [else stmt;] if (x==25)
x=1;
else
x=x+1;
while (expr) stmt; while (get_rtcc()!=0)
putc(‘n’);
do stmt while (expr); do {
putc(c=getc());
} while (c!=0);
for (expr1;expr2;expr3) stmt; for (i=1;i<=10;++i)
printf(“%u\r\n”,i);
switch (expr) { switch (cmd) {
case cexpr: stmt; //one or case 0: printf(“cmd 0”);
more case [default:stmt] break;
... } case 1: printf(“cmd 1”);
break;
default:printf(“bad cmd”);
break; }
return [expr]; return (5);
goto label; goto loop;
label: stmt; loop: I++;
break; break;
continue; continue;
expr; i=1;
; ;
{[stmt]} {a=1;
b=1;}
zero or more
Note: Items in [ ] are optional
74
C Statements And Expressions
Expressions
CONSTANTS:
123 Decimal
0123 Octal
0x123 Hex
0b010010 Binary
'x' Character
'\010' Octal Character
'\xA5’ Hex Character
'\c' Special Character. Where c is one of:
\n Line Feed- Same as \x0a
\r Return Feed - Same as \x0d
\t TAB- Same as \x09
\b Backspace- Same as \x08
\f Form Feed- Same as x0c
\a Bell- Same as \x07
\v Vertical Space- Same as \x0b
\? Question Mark- Same as \x3f
\’ Single Quote- Same as \x60
\” Double Quote- Same as \x22
\\ A Single Backslash- Same as \x5c
"abcdef" String (null is added to the end)
IDENTIFIERS:
ABCDE Up to 32 characters beginning with a non-numeric. Valid
characters are A-Z, 0-9 and _ (underscore).
ID[X] Single Subscript
ID[X][X] Multiple Subscripts
ID.ID Structure or union reference
ID->ID Structure or union reference
75
C Compiler Reference Manual
Operators
+ ADDITION OPERATOR
+= Addition assignment operator, x+=y, is the same as x=x+y
&= Bitwise and assignment operator, x&=y, is the same as x=x&y
& Address operator
& Bitwise and operator
^= Bitwise exclusive or assignment operator, x^=y, is the same as
x=x^y
^ Bitwise exclusive or operator
l= Bitwise inclusive or assignment operator, xl=y, is the same as x=xly
l Bitwise inclusive or operator
?: Conditional Expression operator
-- Decrement
/= Division assignment operator, x\=y, is the same as x=x/y
/ Division operator
== Equality
> Greater than operator
>= Greater than or equal to operator
++ Increment
* Indirection operator
!= Inequality
<<= Left shift assignment operator, x<<=y, is the same as x=x<<y
< Less than operator
<< Left Shift operator
<= Less than or equal to operator
&& Logical AND operator
! Logical negation operator
ll Logical OR operator
%= Modules assignment operator x%=y, is the same as x=x%y
% Modules operator
*= Multiplication assignment operator, x*=y, is the same as x=x*y
* Multiplication operator
~ One's complement operator
>>= Right shift assignment, x>>=y, is the same as x=x>>y
>> Right shift operator
-> Structure Pointer operation
-= Subtraction assignment operator
- Subtraction operator
sizeof Determines size in bytes of operand
76
C Statements And Expressions
Operator Precedence
IN DESCENDING PRECEDENCE
(expr)
!expr ~expr ++expr expr++ - -expr expr-
-
(type)expr *expr &value sizeof(type)
expr*expr expr/expr expr%expr
expr+expr expr-expr
expr<<expr expr>>expr
expr<expr expr<=expr expr>expr expr>=expr
expr==expr expr!=expr
expr&expr
expr^expr
expr | expr
expr&& expr
expr || expr
value ? expr: expr
value = expr value+=expr value-=expr
value*=expr value/=expr value%=expr
value>>=expr value<<=expr value&=expr
value^=expr value|=expr expr, expr
Trigraph Sequences
77
Built-In Functions
79
C Compiler Reference Manual
80
Built-In Functions
81
C Compiler Reference Manual
ABS()
ACOS()
See: SIN()
ASIN()
See: SIN()
82
Built-In Functions
ASSERT()
Returns: Nothing
Function: This function tests the condition and if FALSE will generate
an error message on STDERR (by default the first USE
RS232 in the program). The error message will include the
file and line of the assert(). No code is generated for the
assert() if you #define NODEBUG. In this way you may
include asserts in your code for testing and quickly eliminate
them from the final program..
ATOF()
83
C Compiler Reference Manual
ATOI()
ATOL()
ATOI32()
84
Built-In Functions
strcpy(string,"123");
x = atoi(string);
// x is now 123
BIT_CLEAR()
Returns: undefined
Function: Simply clears the specified bit (0-7, 0-15 or 0-31) in the
given variable. The least significant bit is 0. This function is
the same as: var &= ~(1<<bit);
Requires None
Examples: int x;
x=5;
bit_clear(x,2);
// x is now 1
85
C Compiler Reference Manual
BIT_SET( )
Returns: Undefined
Function: Sets the specified bit (0-7, 0-15 or 0-31) in the given variable.
The least significant bit is 0. This function is the same as:
var |= (1<<bit);
Requires Nothing
Examples: int x;
x=5;
bit_set(x,3);
// x is now 13
BIT_TEST()
Returns: 0 or 1
86
Built-In Functions
Requires Nothing
if(data!=0)
for(i=31;!bit_test(data, i);i--) ;
// i now has the most significant bit in data
// that is set to a 1
BSEARCH()
87
C Compiler Reference Manual
void main() {
int *ip, key;
key = 3;
ip = bsearch(&key, nums, 5, sizeof(int), compar);
}
CALLOC()
88
Built-In Functions
CEIL()
Returns: A float
CLEAR_INTERRUPT()
Syntax: clear_interrupt(level)
Returns: undefined
89
C Compiler Reference Manual
Function: Clears the interrupt flag for the given level. This function
is designed for use with a specific interrupt, thus
eliminating the GLOBAL level as a possible parameter.
Requires Nothing
Examples: clear_interrupt(int_timer1);
COS()
See: SIN()
COSH()
See: SIN()
DELAY_CYCLES()
Returns: undefined
90
Built-In Functions
Requires Nothing
DELAY_MS()
Returns: undefined
91
C Compiler Reference Manual
delay_ms( 2 );
void delay_seconds(int n) {
for (;n!=0; n- -)
delay_ms( 1000 );
}
DELAY_US()
Returns: undefined
92
Built-In Functions
do {
output_high(PIN_B0);
delay_us(duty);
output_low(PIN_B0);
delay_us(period-duty);
} while(TRUE);
DISABLE_INTERRUPTS()
Returns: undefined
Function: Disables the interrupt at the given level. The GLOBAL level
will not disable any of the specific interrupts but will prevent
any of the specific interrupts, previously enabled to be
active. Valid specific levels are the same as are used in
#INT_xxx and are listed in the devices .h file. GLOBAL will
also disable the peripheral interrupts on devices that have it.
Note that it is not necessary to disable interrupts inside an
interrupt service routine since interrupts are automatically
disabled.
93
C Compiler Reference Manual
enable_interrupts(ADC_DONE);
enable_interrupts(RB_CHANGE);
// these enable the interrupts
// but since the GLOBAL is disabled they
// are not activated until the following
// statement:
enable_interrupts(GLOBAL);
DIV()
LDIV()
Function: The div and ldiv function computes the quotient and
remainder of the division of the numerator by the
denominator. If the division is inexact, the resulting quotient
is the integer or long of lesser magnitude that is the nearest
to the algebraic quotient. If the result cannot be represented,
the behavior is undefined; otherwise
quot*denom(ldenom)+rem shall equal num(lnum).
94
Built-In Functions
lidiv=ldiv(300,250);
//lidiv will contain quot=1 and rem=50
ENABLE_INTERRUPTS()
Returns: undefined
Examples: enable_interrupts(GLOBAL);
enable_interrupts(INT_TIMER0);
enable_interrupts(INT_TIMER1);
95
C Compiler Reference Manual
ERASE_PROGRAM_EEPROM()
Returns: undefined
Requires Nothing
Examples: for(i=0x1000;i<=0x1fff;i+=getenv("FLASH_ERASE_SIZE"))
erase_program_memory(i);
EXP()
Returns: A float
96
Built-In Functions
EXT_INT_EDGE()
Returns: undefined
97
C Compiler Reference Manual
FABS()
98
Built-In Functions
FLOOR()
Function: Computes the greatest integral value not greater than the
argument. Floor (12.67) is 12.00.
FMOD()
99
C Compiler Reference Manual
FREE()
Syntax: free(ptr)
Returns: No value
Function: The free function causes the space pointed to by the ptr to
be deallocated, that is made available for further allocation. If
ptr is a null pointer, no action occurs. If the ptr does not
match a pointer earlier returned by the calloc, malloc or
realloc, or if the space has been deallocated by a call to free
or realloc function, the behavior is undefined.
100
Built-In Functions
FREXP()
GET_TIMERx()
Parameters: None
101
C Compiler Reference Manual
Requires Nothing
Examples: set_timer0(0);
while ( get_timer0() < 200 ) ;
GETC()
CH()
GETCHAR()
FGETC()
102
Built-In Functions
Function: This function waits for a character to come in over the RS232
RCV pin and returns the character. If you do not want to
hang forever waiting for an incoming character use kbhit() to
test for a character available. If a built-in USART is used the
hardware can buffer 3 characters otherwise GETC must be
active while the character is being received by the PIC®.
#use rs232(baud=9600,xmit=pin_c6,
rcv=pin_c7,stream=HOSTPC)
#use rs232(baud=1200,xmit=pin_b1,
rcv=pin_b0,stream=GPS)
#use rs232(baud=9600,xmit=pin_b3,
stream=DEBUG)
...
while(TRUE) {
c=fgetc(GPS);
fputc(c,HOSTPC);
if(c==13)
fprintf(DEBUG,"Got a CR\r\n");
}
103
C Compiler Reference Manual
GETENV()
104
Built-In Functions
105
C Compiler Reference Manual
Requires Nothing
for(i=0;i<getenv("DATA_EEPROM");i++)
write_eeprom(i,0);
#IF getenv("FUSE_VALID:BROWNOUT")
#FUSE BROWNOUT
#ENDIF
GETS()
FGETS()
Returns: undefined
106
Built-In Functions
printf("Password: ");
gets(string);
if(strcmp(string, password))
printf("OK");
GOTO_ADDRESS()
Syntax: goto_address(location);
Returns: Nothing
Requires Nothing
if(input(LOAD_REQUEST))
goto_address(LOADER);
107
C Compiler Reference Manual
I2C_POLL()
Syntax: i2c_poll()
Parameters: None
Function: The I2C_POLL() function should only be used when the built-
in SSP is used. This function returns TRUE if the hardware
has a received byte in the buffer. When a TRUE is returned,
a call to I2C_READ() will immediately return the byte that
was received.
Availability: Devices with built in I2C
I2C_READ()
108
Built-In Functions
Function: Reads a byte over the I2C interface. In master mode this
function will generate the clock and in slave mode it will wait
for the clock. There is no timeout for the slave, use
I2C_POLL to prevent a lockup. Use RESTART_WDT in the
#USE I2C to strobe the watch-dog timer in the slave mode
while waiting.
Examples: i2c_start();
i2c_write(0xa1);
data1 = i2c_read();
data2 = i2c_read();
i2c_stop();
I2C_START()
Syntax: i2c_start()
Parameters: None
Returns: undefined
Function: Issues a start condition when in the I2C master mode. After
the start condition the clock is held low until I2C_WRITE() is
called. If another I2C_start is called in the same function
before an i2c_stop is called then a special restart condition is
issued. Note that specific I2C protocol depends on the slave
device.
109
C Compiler Reference Manual
Examples: i2c_start();
i2c_write(0xa0); // Device address
i2c_write(address); // Data to device
i2c_start(); // Restart
i2c_write(0xa1); // to change data direction
data=i2c_read(0); // Now read from slave
i2c_stop();
I2C_STOP()
Syntax: i2c_stop()
Parameters: None
Returns: undefined
110
Built-In Functions
I2C_WRITE()
Function: Sends a single byte over the I2C interface. In master mode
this function will generate a clock with the data and in slave
mode it will wait for the clock from the master. No automatic
timeout is provided in this function. This function returns the
ACK bit. The LSB of the first write after a start determines the
direction of data transfer (0 is master to slave). Note that specific
I2C protocol depends on the slave device.
Availability: All devices.
111
C Compiler Reference Manual
INPUT()
Parameters: Pin to read. Pins are defined in the devices .h file. The
actual value is a bit address. For example, port a (byte 5) bit
3 would have a value of 5*8+3 or 43. This is defined as
follows: #define PIN_A3 43
Function: This function returns the state of the indicated pin. The
method of I/O is dependent on the last USE *_IO directive.
By default with standard I/O before the input is done the data
direction is set to input.
if( input(PIN_A0) )
printf("A0 is now high\r\n");
112
Built-In Functions
INPUT_STATE()
Parameters: pin to read. Pins are defined in the devices .h file. The
actual value is a bit address. For example, port A (byte
5) bit 3 would have a value of 5*8+3 or 43. This is
defined as follows: #define PIN_A3 43.
Requires Nothing
113
C Compiler Reference Manual
INPUT_x()
Parameters: None
Requires Nothing
114
Built-In Functions
ISALNUM(char)
ISALPHA(char)
ISDIGIT(char)
ISLOWER(char)
ISSPACE(char)
ISUPPER(char)
ISXDIGIT(char)
ISCNTRL(x)
ISGRAPH(x)
ISPRINT(x)
ISPUNCT(x)
Returns: 0 (or FALSE) if datac dose not match the criteria, 1 (or
TRUE) if datac does match the criteria.
115
C Compiler Reference Manual
Requires ctype.h
ISAMOUNG()
Requires Nothing
Examples: char x;
...
if( isamoung( x,
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ") )
printf("The character is valid");
116
Built-In Functions
ITOA()
Requires #inlcude<stdlib.h>
string=itoa(x,10);
// string is now “1234”
117
C Compiler Reference Manual
KBHIT()
long timeout;
timeout_error=FALSE;
timeout=0;
while(!kbhit()&&(++timeout<50000)) // 1/2
// second
delay_us(10);
if(kbhit())
return(getc());
else {
timeout_error=TRUE;
return(0);
}
}
118
Built-In Functions
LABEL_ADDRESS()
Requires Nothing
Examples: start:
a = (b+c)<<2;
end:
printf("It takes %lu ROM locations.\r\n",
label_address(end)-label_address(start));
LABS()
119
C Compiler Reference Manual
LCD_LOAD()
Returns: undefined
Function: Will load length bytes from buffer_pointer into the 923/924
LCD segment data area beginning at offset (0-15).
lcd_symbol provides an easier way to write data to the
segment memory.
120
Built-In Functions
LCD_SYMBOL()
Returns: undefined
Function: Loads 8 bits into the segment data area for the LCD with
each bit address specified. If bit 7 in symbol is set the
segment at B7_addr is set, otherwise it is cleared. The
same is true of all other bits in symbol. The B7_addr is a bit
address into the LCD RAM.
#define DIGIT_1_CONFIG
COM0+2,COM0+4,COM05,COM2+4,COM2+1,
COM1+4,COM1+5
121
C Compiler Reference Manual
LDEXP()
Returns: result is a float with value result times 2 raised to power exp.
LOG()
Returns: A float
122
Built-In Functions
LOG10()
Returns: A float
123
C Compiler Reference Manual
LONGJMP()
Parameters: nve: The data object that will be restored by this function
val: The value that the function setjmp will return. If val is 0
then the function setjmp will return 1 instead.
124
Built-In Functions
MAKE8()
Function: Extracts the byte at offset from var. Same as: i8 = (((var >>
(offset*8)) & 0xff) except it is done with a single byte move.
Requires Nothing
Examples: int32 x;
int y;
MAKE16()
125
C Compiler Reference Manual
Requires Nothing
Examples: long x;
int hi,lo;
x = make16(hi,lo);
MAKE32()
Requires Nothing
Examples: int32 x;
int y;
long z;
x = make32(1,2,3,4); // x is 0x01020304
y=0x12;
z=0x4321;
x = make32(y,z); // x is 0x00124321
x = make32(y,y,z); // x is 0x12124321
126
Built-In Functions
MALLOC()
Syntax: ptr=malloc(size)
Function: The malloc function allocates space for an object whose size
is specified by size and whose value is indeterminate.
127
C Compiler Reference Manual
MEMCPY()
MEMMOVE()
Returns: undefined
Requires Nothing
char a[20]="hello";
memmove(a,a+2,5);
// a is now "llo"MEMMOVE()
128
Built-In Functions
MEMSET()
Returns: undefined
Requires Nothing
MODF()
129
C Compiler Reference Manual
Function: The modf function breaks the argument value into integral
and fractional parts, each of which has the same sign as the
argument. It stores the integral part as a float in the object
integral.
OFFSETOF()
OFFSETOFBIT()
Requires stddef.h
130
Built-In Functions
x = offsetof(time_structure, sec);
// x will be 2
x = offsetofbit(time_structure, sec);
// x will be 16
x = offsetof (time_structure,
daylight_savings);
// x will be 3
x = offsetofbit(time_structure,
daylight_savings);
// x will be 28
OUTPUT_A()
OUTPUT_B()
OUTPUT_C()
OUTPUT_D()
OUTPUT_E()
OUTPUT_F()
OUTPUT_G()
OUTPUT_H()
OUTPUT_J()
OUTPUT_K()
131
C Compiler Reference Manual
Returns: undefined
Function: Output an entire byte to a port. The direction register is
changed in accordance with the last specified #USE *_IO
directive.
Availability: All devices, however not all devices have all ports (A-E)
Requires Nothing
Examples: OUTPUT_B(0xf0);
OUTPUT_BIT()
Parameters: Pins are defined in the devices .h file. The actual number is
a bit address. For example, port a (byte 5) bit 3 would have
a value of 5*8+3 or 43. This is defined as follows: #define
PIN_A3 43. Value is a 1 or a 0.
Returns: undefined
132
Built-In Functions
output_bit( PIN_B0,
shift_left(&data,1,input(PIN_B1)));
// Output the MSB of data to
// B0 and at the same time
// shift B1 into the LSB of data
OUTPUT_FLOAT()
Parameters: Pins are defined in the devices .h file. The actual value is a
bit address. For example, port a (byte 5) bit 3 would have a
value of 5*8+3 or 43. This is defined as follows: #define
PIN_A3 43
Returns: undefined
Function: Sets the specified pin to the input mode. This will allow the
pin to float high to represent a high on an open collector type
of connection.
133
C Compiler Reference Manual
OUTPUT_HIGH()
Parameters: Pin to read. Pins are defined in the devices .h file. The
actual value is a bit address. For example, port a (byte 5) bit
3 would have a value of 5*8+3 or 43. This is defined as
follows: #define PIN_A3 43
Returns: undefined
Function: Sets a given pin to the high state. The method of I/O used is
dependent on the last USE *_IO directive.
Examples: output_high(PIN_A0);
134
Built-In Functions
OUTPUT_LOW()
Parameters: Pins are defined in the devices .h file. The actual value is a
bit address. For example, port a (byte 5) bit 3 would have a
value of 5*8+3 or 43. This is defined as follows: #define
PIN_A3 43
Returns: undefined
Function: Sets a given pin to the ground state. The method of I/O used
is dependent on the last USE *_IO directive.
Examples: output_low(PIN_A0);
OUTPUT_TOGGLE()
Syntax: output_toggle(pin)
Parameters: Pins are defined in the devices .h file. The actual value
is a bit address. For example, port a (byte 5) bit 3 would
have a value of 5*8+3 or 43. This is a defined as
follows: #define PIN_A3 43.
Returns: undefined
135
C Compiler Reference Manual
Examples: output_toggle(PIN_B4);
PERROR()
Syntax: perror(string);
Returns: Nothing
Function: This function prints out to STDERR the supplied string and a
description of the last system error (usually a math error).
if(errno!=0)
perror("Problem in find_area");
136
Built-In Functions
PORT_A_PULLUPS
Returns: undefined
Function: Sets the port A input pullups. TRUE will activate, and a
FALSE will deactivate.
Availability: Only 14 and 16 bit devices (PCM and PCH). (Note: use
SETUP_COUNTERS on PCB parts).
Requires Nothing
Examples: port_a_pullups(FALSE);
PORT_B_PULLUPS()
Returns: undefined
Function: Sets the port B input pullups. TRUE will activate, and a
FALSE will deactivate.
Availability: Only 14 and 16 bit devices (PCM and PCH). (Note: use
SETUP_COUNTERS on PCB parts).
137
C Compiler Reference Manual
Requires Nothing
Examples: port_b_pullups(FALSE);
POW()
PWR()
Returns: A float
138
Built-In Functions
PRINTF()
FPRINTF()
Returns: undefined
Format:
The format takes the generic form %wt where w is optional
and may be 1-9 to specify how many characters are to be
outputted, or 01-09 to indicate leading zeros or 1.1 to 9.9 for
floating point. t is the type and may be one of the following:
C Character
S String or character
U Unsigned int
x Hex int (lower case output)
X Hex int (upper case output)
D Signed int
139
C Compiler Reference Manual
Example formats:
Specifier Value=0x12 Value=0xfe
%03u 018 254
%u 18 254
%2u 18 *
%5 18 254
%d 18 -2
%x 12 fe
%X 12 FE
%4X 0012 00FE
* Result is undefined - Assume garbage.
140
Built-In Functions
PSP_OUTPUT_FULL()
PSP_INPUT_FULL()
PSP_OVERFLOW()
Parameters: None
Function: These functions check the Parallel Slave Port (PSP) for the
indicated conditions and return TRUE or FALSE.
Requires Nothing
141
C Compiler Reference Manual
PUTC()
PUTCHAR( )
FPUTC()
Returns: undefined
Function: This function sends a character over the RS232 XMIT pin. A
#USE RS232 must appear before this call to determine the
baud rate and pin used. The #USE RS232 remains in effect
until another is encountered in the file.
Examples: putc('*');
for(i=0; i<10; i++)
putc(buffer[i]);
putc(13);
142
Built-In Functions
PUTS()
FPUTS()
Returns: undefined
Function: Sends each character in the string out the RS232 pin using
PUTC(). After the string is sent a RETURN (13) and LINE-
FEED (10) are sent. In general printf() is more useful than
puts().
143
C Compiler Reference Manual
QSORT()
Returns: None
void main() {
qsort ( nums, 5, sizeof(int), compar);
}
144
Built-In Functions
RAND()
Syntax: re=rand()
Parameters: None
Examples: int I;
I=rand();
READ_ADC()
Function: This function will read the digital value from the analog to
digital converter. Calls to setup_adc(), setup_adc_ports() and
set_adc_channel() should be made sometime before this
function is called. The range of the return value depends on
number of bits in the chips A/D converter and the setting in
the #DEVICE ADC= directive as follows:
145
C Compiler Reference Manual
read_adc(ADC_START_ONLY);
sleep();
value=read_adc(ADC_READ_ONLY);
READ_BANK()
146
Built-In Functions
Function: Read a data byte from the user RAM area of the specified
memory bank. This function may be used on some devices
where full RAM access by auto variables is not efficient. For
example on the PIC16C57 chip setting the pointer size to 5
bits will generate the most efficient ROM code however auto
variables can not be above 1Fh. Instead of going to 8 bit
pointers you can save ROM by using this function to write to
the hard to reach banks. In this case the bank may be 1-3
and the offset may be 0-15.
Availability: All devices but only useful on PCB parts with memory over
1Fh and PCM parts with memory over FFh.
Requires Nothing
READ_CALIBRATION()
147
C Compiler Reference Manual
Requires Nothing
READ_EEPROM()
Requires Nothing
148
Built-In Functions
READ_PROGRAM_EEPROM ()
Returns: 16 bits
Requires Nothing
Examples: checksum = 0;
for(i=0;i<8196;i++)
checksum^=read_program_eeprom(i);
printf("Checksum is %2X\r\n",checksum);
READ_PROGRAM_MEMORY ()
READ_EXTERNAL_MEMORY ()
Returns: undefined
149
C Compiler Reference Manual
Requires Nothing
REALLOC()
Function: The realloc function changes the size of the object pointed to
by the ptr to the size specified by the size. The contents of
the object shall be unchanged up to the lesser of new and
old sizes. If the new size is larger the value of the newly
allocated space is indeterminate. If ptr is a null pointer, the
realloc function behaves like malloc function for the specified
size. If the ptr does not match a pointer earlier returned by
the calloc, malloc or realloc, or if the space has been
deallocated by a call to free or realloc function, the behavior
is undefined. If the space cannot be allocated, the object
pointed to by ptr is unchanged. If size is zero and the ptr is
not a null pointer, the object is to be freed.
150
Built-In Functions
RESET_CPU()
Syntax: reset_cpu()
Parameters: None
Requires Nothing
Examples: if(checksum!=0)
reset_cpu();
151
C Compiler Reference Manual
RESTART_CAUSE()
Parameters: None
Returns: A value indicating the cause of the last processor reset. The
actual values are device dependent. See the device .h file
for specific values for a specific device. Some example
values are: WDT_FROM_SLEEP, WDT_TIMEOUT,
MCLR_FROM_SLEEP and NORMAL_POWER_UP.
RESTART_WDT()
Syntax: restart_wdt()
Parameters: None
Returns: undefined
152
Built-In Functions
Requires #fuses
153
C Compiler Reference Manual
ROTATE_LEFT()
Returns: undefined
Requires Nothing
Examples: x = 0x86;
rotate_left( &x, 1);
// x is now 0x0d
ROTATE_RIGHT()
Returns: undefined
154
Built-In Functions
Requires Nothing
Examples: struct {
int cell_1 : 4;
int cell_2 : 4;
int cell_3 : 4;
int cell_4 : 4; } cells;
rotate_right( &cells, 2);
rotate_right( &cells, 2);
rotate_right( &cells, 2);
rotate_right( &cells, 2);
// cell_1->4, 2->1, 3->2 and 4-> 3
SET_ADC_CHANNEL()
Returns: undefined
Function: Specifies the channel to use for the next READ_ADC call.
Be aware that you must wait a short time after changing the
channel before you can get a valid read. The time varies
depending on the impedance of the input source. In general
10us is good for most applications. You need not change
the channel before every read if the channel does not
change.
Requires Nothing
Examples: set_adc_channel(2);
delay_us(10);
value = read_adc();
155
C Compiler Reference Manual
SET_PWM1_DUTY()
SET_PWM2_DUTY()
SET_PWM3_DUTY()
SET_PWM4_DUTY()
SET_PWM5_DUTY()
Returns: undefined
Function: Writes the 10-bit value to the PWM to set the duty. An 8-bit
value may be used if the least significant bits are not
required. If value is an 8 bit item it is shifted up with two zero
bits in the lsb positions to get 10 bits. The 10 bit value is
then used to determine the amount of time the PWM signal is
high during each cycle as follows:
• value*(1/clock)*t2div
Requires Nothing
156
Built-In Functions
long duty;
SET_POWER_PWMX_DUTY()
Syntax: set_power_pwmX_duty(duty)
Parameters: X is 0, 2, 4, or 6
Duty is an integer between 0 and 16383.
Returns: undefined
Requires None
Examples: set_power_pwm0_duty(4000);
157
C Compiler Reference Manual
SET_POWER_PWM_OVERRIDE()
Returns: undefined
Requires None
158
Built-In Functions
SET_RTCC()
SET_TIMER0()
SET_TIMER1()
SET_TIMER2()
SET_TIMER3()
SET_TIMER4()
SET_TIMER5()
Returns: undefined
Function: Sets the count value of a real time clock/counter. RTCC and
Timer0 are the same. All timers count up. When a timer
reaches the maximum value it will flip over to 0 and continue
counting (254, 255, 0, 1, 2...)
Requires Nothing
159
C Compiler Reference Manual
set_timer0(81); // 256-(.000035/(4/20000000))
SET_TRIS_A()
SET_TRIS_B()
SET_TRIS_C()
SET_TRIS_D()
SET_TRIS_E()
SET_TRIS_G()
SET_TRIS_H()
SET_TRIS_J()
SET_TRIS_K()
Parameters: value is an 8 bit int with each bit representing a bit of the I/O
port.
Returns: undefined
160
Built-In Functions
Availability: All devices (however not all devices have all I/O ports)
Requires Nothing
SET_UART_SPEED()
Returns: undefined
Function: Changes the baud rate of the built-in hardware RS232 serial
port at run-time.
161
C Compiler Reference Manual
SETJMP()
Parameters: env: The data object that will receive the current
environment
162
Built-In Functions
SETUP_ADC(mode)
Returns: undefined
163
C Compiler Reference Manual
SETUP_ADC_PORTS()
Returns: undefined
Function: Sets up the ADC pins to be analog, digital or a combination.
The allowed combinations vary depending on the chip. The
constants used are different for each chip as well. Check the
device include file for a complete list. The constants
ALL_ANALOG and NO_ANALOGS are valid for all chips.
Some other example constants:
ANALOG_RA3_REF- All analog and RA3 is the reference
RA0_RA1_RA3_ANALOG- Just RA0, RA1 and RA3 are
analog
setup_adc_ports( ALL_ANALOG );
164
Built-In Functions
SETUP_CCP1()
SETUP_CCP2()
SETUP_CCP3()
SETUP_CCP4()
SETUP_CCP5()
165
C Compiler Reference Manual
Examples: setup_ccp1(CCP_CAPTURE_RE);
SETUP_COMPARATOR()
Returns: undefined
166
Built-In Functions
SETUP_COUNTERS()
Returns: undefined
167
C Compiler Reference Manual
SETUP_EXTERNAL_MEMORY()
Parameters: mode is one or more constants from the device header file
OR'ed together.
Returns: undefined
Examples: setup_external_memory(EXTMEM_WORD_WRITE
|EXTMEM_WAIT_0 );
setup_external_memory(EXTMEM_DISABLE);
SETUP_LCD()
Parameters: Mode may be one of these constants from the devices .h file:
LCD_DISABLED, LCD_STATIC,
LCD_MUX12,LCD_MUX13, LCD_MUX14
168
Built-In Functions
Returns: undefined
Examples: setup_lcd(LCD_MUX14|STOP_ON_SLEEP,2);
SETUP_LOW_VOLT_DETECT()
Syntax: setup_low_volt_detect(mode)
LVD_TRIGGER_BELOW, LVD_TRIGGER_ABOVE.
169
C Compiler Reference Manual
Returns: undefined
Availability: This function is only available with devices that have the
high/low voltage detect module.
SETUP_OSCILLATOR()
170
Built-In Functions
SETUP_POWER_PWM()
171
C Compiler Reference Manual
PWM_OVERRIDE_SYNC
PWM_UP_TRIGGER, PWM_DOWN_TRIGGER
PWM_UPDATE_DISABLE, PWM_UPDATE_ENABLE
PWM_DEAD_CLOCK_DIV_2,
PWM_DEAD_CLOCK_DIV_4,
PWM_DEAD_CLOCK_DIV_8,
PWM_DEAD_CLOCK_DIV_16
Returns: undefined
Requires None
172
Built-In Functions
SETUP_POWER_PWM_PINS()
Syntax: setup_power_pwm_pins(module0,module1,module2,mo
dule3)
Returns: undefined
Requires None
173
C Compiler Reference Manual
SETUP_PSP()
Returns: undefined
Examples: setup_psp(PSP_ENABLED);
SETUP_SPI()
SETUP_SPI2()
174
Built-In Functions
Returns: undefined
Function: Initializes the Serial Port Interface (SPI). This is used for 2
or 3 wire serial devices that follow a common clock/data
protocol.
SETUP_TIMER_0 ()
Returns: undefined
175
C Compiler Reference Manual
SETUP_TIMER_1()
Returns: undefined
Function: Initializes timer 1. The timer value may be read and written
to using SET_TIMER1() and GET_TIMER1()Timer 1 is a 16
bit timer.
176
Built-In Functions
SETUP_TIMER_2()
Returns: undefined
Function: Initializes timer 2. The mode specifies the clock divisor (from
the oscillator clock). The timer value may be read and written
to using GET_TIMER2() and SET_TIMER2(). Timer 2 is a 8 bit
counter/timer.
177
C Compiler Reference Manual
SETUP_TIMER_3()
Returns: undefined
178
Built-In Functions
SETUP_TIMER_4()
Returns: undefined
179
C Compiler Reference Manual
SETUP_TIMER_5()
T5_ONE_SHOT, T5_DISABLE_SE_RESET, or
T5_ENABLE_DURING_SLEEP
Returns: undefined
SETUP_UART()
180
Built-In Functions
UART_AUTODETECT_NOWAIT Same
as above function, except returns before 0x55 is
received. KBHIT() will be true when the match is made.
A call to GETC() will clear the character.
Returns: undefined
Examples: setup_uart(9600);
setup_uart(9600, rsOut);
181
C Compiler Reference Manual
SETUP_VREF()
Returns: undefined
182
Built-In Functions
SETUP_WDT ()
Returns: undefined
183
C Compiler Reference Manual
SHIFT_LEFT()
Requires Nothing
184
Built-In Functions
SHIFT_RIGHT()
Requires Nothing
185
C Compiler Reference Manual
SIN ()
COS()
TAN()
ASIN()
ACOS()
ATAN()
SINH()
COSH()
TANH()
ATAN2()
186
Built-In Functions
187
C Compiler Reference Manual
SINH()
See: SIN()
SLEEP()
Syntax: sleep()
Parameters: None
Returns: Undefined
Requires Nothing
Examples: SLEEP();
SPI_DATA_IS_IN()
SPI_DATA_IS_IN2()
Parameters: None
188
Built-In Functions
Function: Returns TRUE if data has been received over the SPI.
Availability: This function is only available on devices with SPI hardware.
Requires Nothing
SPI_READ()
SPI_READ2()
Requires Nothing
189
C Compiler Reference Manual
SPI_WRITE()
SPI_WRITE2()
Returns: Nothing
Function: Sends a byte out the SPI interface. This will cause 8 clocks
to be generated. This function will write the value out to the
SPI.
Requires Nothing
190
Built-In Functions
SPRINTF()
Returns: Nothing
Function: This function operates like printf except that the output is
placed into the specified string. The output string will be
terminated with a null. No checking is done to ensure the
string is large enough for the data. See printf() for details on
formatting.
Requires Nothing
mylong=1234;
sprintf(mystring,"<%lu>",mylong);
// mystring now has:
// < 1 2 3 4 > \0
SQRT()
Returns: A float
191
C Compiler Reference Manual
SRAND()
Syntax: srand(n)
Returns: No value.
Function: The srand function uses the argument as a seed for a new
sequence of pseudo-random numbers to be returned by
subsequent calls to rand. If srand is then called with same
seed value, the sequence of random numbers shall be
repeated. If rand is called before any call to srand have been
made, the same sequence shall be generated as when srand
is first called with a seed value of 1.
192
Built-In Functions
Examples: srand(10);
I=rand();
193
C Compiler Reference Manual
c is a 8 bit character
194
Built-In Functions
strcpy(string1,"hi ");
strcpy(string2,"there");
strcat(string1,string2);
STRCPY()
STRCOPY()
Returns: undefined
Requires Nothing
195
C Compiler Reference Manual
strcpy(string2,string);
STRTOD()
Function: The strtod function converts the initial portion of the string
pointed to by nptr to a float representation. The part of the
string after conversion is stored in the object pointed to
endptr, provided that endptr is not a null pointer. If nptr is
empty or does not have the expected form, no conversion is
performed and the value of nptr is stored in the object
pointed to by endptr, provided endptr is not a null pointer.
196
Built-In Functions
STRTOK()
197
C Compiler Reference Manual
strcpy(string,"one,two,three;");
strcpy(term,",;");
STRTOL()
Function: The strtol function converts the initial portion of the string
pointed to by nptr to a signed long int representation in some
radix determined by the value of base. The part of the string
after conversion is stored in the object pointed to endptr,
provided that endptr is not a null pointer. If nptr is empty or
does not have the expected form, no conversion is
performed and the value of nptr is stored in the object
pointed to by endptr, provided endptr is not a null pointer.
198
Built-In Functions
STRTOUL()
Function: The strtoul function converts the initial portion of the string
pointed to by nptr to a long int representation in some radix
determined by the value of base. The part of the string after
conversion is stored in the object pointed to endptr, provided
that endptr is not a null pointer. If nptr is empty or does not
have the expected form, no conversion is performed and the
value of nptr is stored in the object pointed to by endptr,
provided endptr is not a null pointer.
199
C Compiler Reference Manual
SWAP()
Requires Nothing
Examples: x=0x45;
swap(x);
//x now is 0x54
TAN()
See: SIN()
TANH()
See: SIN()
200
Built-In Functions
TOLOWER()
TOUPPER( )
Requires Nothing
WRITE_BANK()
Returns: undefined
201
C Compiler Reference Manual
Function: Write a data byte to the user RAM area of the specified
memory bank. This function may be used on some devices
where full RAM access by auto variables is not efficient. For
example on the PIC16C57 chip setting the pointer size to 5
bits will generate the most efficient ROM code however auto
variables can not be above 1Fh. Instead of going to 8 bit
pointers you can save ROM by using this function to write to
the hard to reach banks. In this case the bank may be 1-3
and the offset may be 0-15.
Availability: All devices but only useful on PCB parts with memory over
1Fh and PCM parts with memory over FFh.
Requires Nothing
Also See: See the "Common Questions and Answers" section for more
information.
WRITE_EEPROM()
Returns: undefined
202
Built-In Functions
Requires Nothing
volume++;
write_eeprom(LAST_VOLUME,volume);
WRITE_EXTERNAL_MEMORY( )
Returns: undefined
203
C Compiler Reference Manual
Requires Nothing
Examples: for(i=0x1000;i<=0x1fff;i++) {
value=read_adc();
write_external_memory(i, value, 2);
delay_ms(1000);
}
WRITE_PROGRAM_EEPROM ( )
Returns: undefined
Requires Nothing
204
Built-In Functions
WRITE_PROGRAM_MEMORY( )
Returns: undefined
Requires Nothing
Examples: for(i=0x1000;i<=0x1fff;i++) {
value=read_adc();
write_program_memory(i, value, 2); delay_ms(1000);
}
205
C Compiler Reference Manual
206
Standard C Definitions
errno.h
errno.h
EDOM Domain error value
ERANGE Range error value
errno error value
float.h
float.h
FLT_RADIX: Radix of the exponent representation
FLT_MANT_DIG: Number of base digits in the floating point significant
FLT_DIG: Number of decimal digits, q, such that any floating point
number with q decimal digits can be rounded into a
floating point number with p radix b digits and back again
without change to the q decimal digits.
FLT_MIN_EXP: Minimum negative integer such that FLT_RADIX raised to
that power minus 1 is a normalized floating-point number.
FLT_MIN_10_EXP: Minimum negative integer such that 10 raised to that
power is in the range of normalized floating-point
numbers.
FLT_MAX_EXP: Maximum negative integer such that FLT_RADIX raised to
that power minus 1 is a representable finite floating-point
number.
FLT_MAX_10_EXP: Maximum negative integer such that 10 raised to that
power is in the range representable finite floating-point
numbers.
FLT_MAX: Maximum representable finite floating point number.
FLT_EPSILON: The difference between 1 and the least value greater than
1 that is representable in the given floating point type.
FLT_MIN: Minimum normalized positive floating point number.
DBL_MANT_DIG: Number of base digits in the floating point significant
DBL_DIG: Number of decimal digits, q, such that any floating point
number with q decimal digits can be rounded into a
floating point number with p radix b digits and back again
without change to the q decimal digits.
207
C Compiler Reference Manual
208
Compiler Error Messages
limits.h
limits.h
CHAR_BIT: Number of bits for the smallest object that is not a bit_field.
SCHAR_MIN: Minimum value for an object of type signed char
SCHAR_MAX: Maximum value for an object of type signed char
UCHAR_MAX: Maximum value for an object of type unsigned char
CHAR_MIN: Minimum value for an object of type char(unsigned)
CHAR_MAX: Maximum value for an object of type char(unsigned)
MB_LEN_MAX: Maximum number of bytes in a multibyte character.
SHRT_MIN: Minimum value for an object of type short int
SHRT_MAX: Maximum value for an object of type short int
USHRT_MAX: Maximum value for an object of type unsigned short int
INT_MIN: Minimum value for an object of type signed int
INT_MAX: Maximum value for an object of type signed int
UINT_MAX: Maximum value for an object of type unsigned int
LONG_MIN: Minimum value for an object of type signed long int
LONG_MAX: Maximum value for an object of type signed long int
ULONG_MAX: Maximum value for an object of type unsigned long int
locale.h
locale.h
locale.h (Localization not supported)
lconv localization structure
SETLOCALE() returns null
LOCALCONV() returns clocale
setjmp.h
setjmp.h
jmp_buf: An array used by the following functions
setjmp: Marks a return point for the next longjmp
longjmp: Jumps to the last marked point
209
C Compiler Reference Manual
stddef.h
stddef.h
ptrdiff_t: The basic type of a pointer
size_t: The type of the sizeof operator (int)
wchar_t The type of the largest character set supported (char) (8 bits)
NULL A null pointer (0)
stdio.h
stdio.h
stderr The standard error stream (USE RS232 specified as stream or the first
USE RS232)
stdout The standard output stream (USE RS232 specified as stream last USE
RS232)
stdin The standard input stream (USE RS232 specified as stream last USE
RS232)
stdlib.h
stdlib.h
div_t structure type that contains two signed integers(quot and rem).
ldiv_t structure type that contains two signed longs(quot and rem
EXIT_FAILURE returns 1
EXIT_SUCCESS returns 0
RAND_MAX-
MBCUR_MAX- 1
SYSTEM() Returns 0( not supported)
Multibyte Multibyte characters not supported
character and
string functions:
MBLEN() Returns the length of the string.
MBTOWC() Returns 1.
WCTOMB() Returns 1.
MBSTOWCS() Returns length of string.
WBSTOMBS() Returns length of string.
210
Compiler Error Messages
#ERROR
211
C Compiler Reference Manual
Divide by zero
An attempt was made to divide by zero at compile time using constants.
212
Compiler Error Messages
Duplicate #define
The identifier in the #define has already been used in a previous #define. To
redefine an identifier use #UNDEF first. To prevent defines that may be included
from multiple source do something like:
· #ifndef ID
· #define ID text
· #endif
Duplicate function
A function has already been defined with this name. Remember that the
compiler is not case sensitive unless a #CASE is used.
Duplicate USE
Some USE libraries may only be invoked once since they apply to the entire
program such as #USE DELAY. These may not be changed throughout the
program.
Expect ;
Expect }
Expect comma
Expect WHILE
Expecting :
Expecting =
213
C Compiler Reference Manual
Expecting a (
Expecting a , or )
Expecting a , or }
Expecting a .
Expecting a ; or ,
Expecting a ; or {
Expecting a close paren
Expecting a declaration
Expecting a structure/union
Expecting a variable
Expecting a ]
Expecting a {
Expecting an =
Expecting an array
Expecting an identifier
Expecting function name
Expecting an opcode mnemonic
This must be a Microchip mnemonic such as MOVLW or BTFSC.
Too many assembly lines are being generated for a single C statement. Contact
CCS to increase the internal limits.
214
Compiler Error Messages
215
C Compiler Reference Manual
In the meantime if the error was on a particular line, look for another way to
perform the same operation. The error was probably caused by the syntax of the
identified statement. If the error was the last line of the code, the problem was in
linking. Look at the call tree for something out of the ordinary.
216
Compiler Error Messages
LVALUE required
This error will occur when a constant is used where a variable should be. For
example 4=5; will give this error.
Missing #ENDIF
A #IF was found without a corresponding #ENDIF.
217
C Compiler Reference Manual
No errors
The program has successfully compiled and all requested output files have been
created.
For example, a function A may perform a series of operations and have 20 local
variables declared. Upon analysis, it may be determined that there are two main
parts to the calculations and many variables are not shared between the parts. A
function B may be defined with 7 local variables and a function C may be defined
with 7 local variables. Function A now calls B and C and combines the results
and now may only need 6 variables. The savings are accomplished because B
and C are not executing at the same time and the same real memory locations
will be used for their 6 variables (just not at the same time). The compiler will
allocate only 13 locations for the group of functions A, B, C where 20 were
required before to perform the same operation.
218
Compiler Error Messages
219
C Compiler Reference Manual
220
Compiler Error Messages
Undefined identifier
The specified identifier is being used but has never been defined. Check the
spelling.
221
C Compiler Reference Manual
Unknown type
The specified type is used but not defined in the program. Check the spelling.
222
Compiler Error Messages
223
C Compiler Reference Manual
Unreachable code
Code included in the program is never executed. For example:
if(n==5)
goto do5;
goto exit;
if(n==20) // No way to get to this line
return;
224
Common Questions And Answers
How does one map a variable to an I/O port?
set_tris_b(ALL_OUT);
PORTB = 0;// Set all pins low
for(i=0;i<=127;++i) // Quickly count from 0
to 127
PORTB=i; // on the I/O port pin
set_tris_b(ALL_IN);
i = PORTB; // i now contains the portb value.
}
Remember when using the #BYTE, the created variable is treated like memory.
You must maintain the tri-state control registers yourself via the SET_TRIS_X
function. Following is an example of placing a structure on an I/O port:
struct port_b_layout
{int data : 4;
int rw : 1;
int cd : 1;
int enable : 1;
int reset : 1; };
struct port_b_layout port_b;
#byte port_b = 6
struct port_b_layout const INIT_1 = {0, 1,1,1,1};
struct port_b_layout const INIT_2 = {3, 1,1,1,0};
struct port_b_layout const INIT_3 = {0, 0,0,0,0};
struct port_b_layout const FOR_SEND = {0,0,0,0,0};
// All outputs
struct port_b_layout const FOR_READ =
{15,0,0,0,0};
// Data is an input
main() {
int x;
225
C Compiler Reference Manual
set_tris_b((int)FOR_READ);
port_b.rw=0;
// Here the individual
port_b.cd=1; // fields are accessed
port_b.enable=0; // independently.
x = port_b.data;
port_b.enable=0
}
226
Common Questions And Answers
A. Check the clock on the target for accuracy. Crystals are usually not a
problem but RC oscillators can cause trouble with RS-232. Make sure the
#USE DELAY matches the actual clock frequency.
B. Make sure the PC (or other host) has the correct baud and parity setting.
D. Remember that PUTC(6) will send an ASCII 6 to the PC and this may not
be a visible character. PUTC('A') will output a visible character A.
A. Make sure that the tri-state registers are correct. The mode (standard,
fast, fixed) used will be whatever the mode is when the #USE RS232 is
encountered. Staying with the default STANDARD mode is safest.
main() {
while(TRUE)
putc('U');
}
Check the XMIT pin for activity with a logic probe, scope or whatever you
can. If you can look at it with a scope, check the bit time (it should be
1/BAUD). Check again after the level converter.
First be sure the PIC® can send data. Use the following main() for testing:
main() {
227
C Compiler Reference Manual
printf("start");
while(TRUE)
putc( getc()+1 );
}
5. The PIC® is always receiving data via RS-232 even when none is being sent.
A. Check that the INVERT option in the USE RS232 is right for your level
converter. If the RCV pin is HIGH when no data is being sent, you should
NOT use INVERT. If the pin is low when no data is being sent, you need to
use INVERT.
B. Check that the pin is stable at HIGH or LOW in accordance with A above
when no data is being sent.
A. When using a software RS232 (no built-in UART), the clock cannot be
really slow when fast baud rates are used and cannot be really fast with slow
baud rates. Experiment with the clock/baud rate values to find your limits.
B. When using the built-in UART, the requested baud rate must be within
3% of a rate that can be achieved for no error to occur. Some parts have
internal bugs with BRGH set to 1 and the compiler will not use this unless
you specify BRGH1OK in the #USE RS232 directive.
228
Common Questions And Answers
The #USE RS232 is not an executable line. It works much like a #DEFINE.
The following is an example program to read from one RS-232 port (A) and echo
the data to both the first RS-232 port (A) and a second RS-232 port (B).
The following will do the same thing but is more readable and is the recommended
method:
main() {
char c;
fprintf(COM_A,"Online\n\r");
fprintf(COM_B,"Online\n\r");
while(TRUE) {
229
C Compiler Reference Manual
c = fgetc(COM_A);
fputc(c, COM_A);
fputc(c, COM_B);
}
}
230
Common Questions And Answers
The compiler makes every effort to optimize usage of RAM. Understanding the
RAM allocation can be a help in designing the program structure. The best re-
use of RAM is accomplished when local variables are used with lots of functions.
RAM is re-used between functions not active at the same time. See the NOT
ENOUGH RAM error message in this manual for a more detailed example.
RAM is also used for expression evaluation when the expression is complex.
The more complex the expression, the more scratch RAM locations the compiler
will need to allocate to that expression. The RAM allocated is reserved during
the execution of the entire function but may be re-used between expressions
within the function. The total RAM required for a function is the sum of the
parameters, the local variables and the largest number of scratch locations
required for any expression within the function. The RAM required for a function
is shown in the call tree after the RAM=. The RAM stays used when the function
calls another function and new RAM is allocated for the new function. However
when a function RETURNS the RAM may be re-used by another function called
by the parent. Sequential calls to functions each with their own local variables is
very efficient use of RAM as opposed to a large function with local variables
declared for the entire process at once.
Be sure to use SHORT INT (1 bit) variables whenever possible for flags and
other boolean variables. The compiler can pack eight such variables into one
byte location. The compiler does this automatically whenever you use SHORT
INT. The code size and ROM size will be smaller.
Finally, consider an external memory device to hold data not required frequently.
An external 8 pin EEPROM or SRAM can be connected to the PIC® with just 2
wires and provide a great deal of additional storage capability. The compiler
package includes example drivers for these devices. The primary drawback is a
slower access time to read and write the data. The SRAM will have fast read
and write with memory being lost when power fails. The EEPROM will have a
very long write cycle, but can retain the data when power is lost.
231
C Compiler Reference Manual
1. Stray code near the top of the program is sometimes under what looks like a
non-executable source line.
Some of the code generated by the compiler does not correspond to any
particular source line. The compiler will put this code either near the top of the
program or sometimes under a #USE that caused subroutines to be generated.
The compiler will create the .LST file in the order of the C source code. The
linker has re-arranged the code to properly fit the functions into the best code
pages and the best half of a code page. The resulting code is not in source
order. Whenever the compiler has a discontinuity in the .LST file, it will put a *
line in the file. This is most often seen between functions and in places where
INLINE functions are called. In the case of an INLINE function, the addresses
will continue in order up where the source for the INLINE function is located.
3. The compiler has gone insane and generated the same instruction over and
over.
For example:
...........A=0;
03F: CLRF 15
*
46:CLRF 15
*
051: CLRF 15
*
113: CLRF 15
This effect is seen when the function is an INLINE function and is called from
more than one place. In the above case, the A=0 line is in an INLINE function
called in four places. Each place it is called from gets a new copy of the code.
Each instance of the code is shown along with the original source line, and the
result may look unusual until the addresses and the * are noticed.
232
Common Questions And Answers
For example:
For example:
bytevar = (x>y)*4;
if( x>y )
bytevar=4;
else
bytevar=0;
SHORT INTs (bit variables) are treated the same as relational expressions.
They evaluate to 0 or 1.
For example:
bytevar = 54;
bitvar = bytevar; //bitvar will be 1 (bytevar ! =
O)
233
C Compiler Reference Manual
CCS makes every attempt to add new devices and device revisions as the data
and errata sheets become available.
PCW users can edit the device database. If the use of TRIS is a concern, simply
change the database entry for your part and the compiler will not use it.
234
Common Questions And Answers
The call 0 is actually 800H since Bit 11 of the address (Bit 3 of PCLATH, Reg 0A)
has been set.
235
C Compiler Reference Manual
BSF 3,5
MOVFW 20
Note that the BSF may not be immediately before the access since the compiler
optimizes out the redundant bank switches.
236
Common Questions And Answers
The compiler has a large set of built-in functions that will allow one to perform the
most common tasks with C function calls. When possible, it is best to use the
built-in functions rather than directly write to registers. Register locations change
between chips and some register operations require a specific algorithm to be
performed when a register value is changed. The compiler also takes into
account known chip errata in the implementation of the built-in functions. For
example, it is better to do set_tris_A(0); rather than *0x85=0;
237
C Compiler Reference Manual
BUT NOT
ptr = &TABLE [i];
Similar constructs using CONST may be used with any data type including
structures, longs and floats.
Note that in the implementation of the above table, a function call is made when
a table is accessed with a subscript that cannot be evaluated at compile time.
238
Common Questions And Answers
The delay=ms (100) is a quick and dirty debounce. In general, you will not want
to sit in an ISR for 100 MS to allow the switch to debounce. A more elegant
solution is to set a timer on the first interrupt and wait until the timer overflows.
Don’t process further changes on the pin.
239
C Compiler Reference Manual
Example Number
0 00 00 00 00
1 7F 00 00 00
-1 7F 80 00 00
10 82 20 00 00
100 85 48 00 00
123.45 85 76 E6 66
123.45E20 C8 27 4E 53
123.45 E-20 43 36 2E 17
240
Common Questions And Answers
Why does the compiler show less RAM than there really is?
Some devices make part of the RAM much more ineffective to access than the
standard RAM. In particular, the 509, 57, 66, 67,76 and 77 devices have this
problem.
By default, the compiler will not automatically allocate variables to the problem
RAM and, therefore, the RAM available will show a number smaller than
expected.
Example:
#BYTE counter=0x30
2. Use Read_Bank and Write_Bank to access the RAM like an array. This works
well if you need to allocate an array in this RAM.
Example:
For(i=0;i<15;i++)
Write_Bank(1,i,getc());
For(i=0;i<=15;i++)
PUTC(Read_Bank(1,i));
3. You can switch to larger pointers for full RAM access (this takes more ROM).
In PCB add *=8 to the #device and in PCM/PCH add *=16 to the #device.
Example:
#DEVICE PIC16C77 *=16
or
#include <16C77.h>
#device *=16
241
C Compiler Reference Manual
242
Common Questions And Answers
return(data);
}
243
C Compiler Reference Manual
The following is an example of how to time out of waiting for an RS232 character.
Note that without a hardware UART the delay_us should be less than a tenth of a
bit time (10 us at 9600 baud). With hardware you can make it up to 10 times the
bit time. (1000 us at 9600 baud). Use two counters if you need a timeout value
larger than 65535.
short timeout_error;
char timed_getc() {
long timeout;
timeout_error=FALSE;
timeout=0;
while(!kbhit&&(++timeout<50000)) // 1/2 second
delay_us(10);
if(kbhit())
return(getc());
else {
timeout_error=TRUE;
return(0);
}
}
244
Common Questions And Answers
If your application needs to use a few different pins not known at compile time
consider:
switch(pin_to_use) {
case PIN_B3 : output_high(PIN_B3); break;
case PIN_B4 : output_high(PIN_B4); break;
case PIN_B5 : output_high(PIN_B5); break;
case PIN_A1 : output_high(PIN_A1); break;
}
#byte portb = 6
#byte portb_tris = 0x86 // **
*(pin_to_use/8) |= (1<<(pin_to_use&7));
** These lines are only required if you need to change the direction register
(TRIS).
245
C Compiler Reference Manual
For example:
#INCLUDE <16F877.h>
#DEVICE ICD=TRUE
246
Common Questions And Answers
run_task(tasks task_to_run) {
switch(task_to_run) {
case taskA : taskA_main(); break;
case taskB : taskB_main(); break;
case taskC : taskC_main(); break;
}
247
C Compiler Reference Manual
Unsigned 8 bit operations are quite fast and floating point is very slow. If
possible consider fixed point instead of floating point. For example instead of
"float cost_in_dollars;" do "long cost_in_cents;". For trig formulas consider a
lookup table instead of real time calculations (see EX_SINE.C for an example).
The following are some rough times on a 20 mhz, 14 bit PIC®. Note times will
vary depending on memory banks used.
20 mhz PIC16
int8 [us] int16 [us] int32 [us] float [us]
+ 0.6 1.4 3 111.3
- 0.6 1.4 3 113.9
* 11.1 47.2 132 178.3
/ 23.2 70.8 239.2 330.9
exp() * * * 1697.3
ln() * * * 2017.7
sin() * * * 2184.5
40 mhz PIC18
int8 [us] int16 [us] int32 [us] float [us]
+ 0.3 0.4 0.6 51.3
- 0.3 0.4 0.6 52.3
* 0.4 3.2 22.2 35.8
/ 11.3 32 106.6 144.9
exp() * * * 510.4
ln() * * * 644.8
sin() * * * 698.7
248
Common Questions And Answers
Assigning a smaller signed expression to a larger signed variable will result in the
sign being maintained. For example, a signed 8 bit int that is -1 when assigned
to a 16 bit signed variable is still -1.
Signed numbers that are negative when assigned to a unsigned number will
cause the 2's complement value to be assigned. For example, assigning -1 to a
int8 will result in the int8 being 255. In this case the sign bit is not extended
(conversion to unsigned is done before conversion to more bits). This means the
-1 assigned to a 16 bit unsigned is still 255.
When a binary operator has operands of differing types then the lower order
operand is converted (using the above rules) to the higher. The order is as
follows:
• Float
• Signed 32 bit
• Unsigned 32 bit
• Signed 16 bit
• Unsigned 16 bit
• Signed 8 bit
• Unsigned 8 bit
• 1 bit
The result is then the same as the operands. Each operator in an expression is
evaluated independently. For example:
249
C Compiler Reference Manual
The + operator is 8 bit, the result is converted to 16 bit after the addition and the -
is 16 bit, that result is converted to 32 bit and the assignment is done. Note that
if i8 is 200 and i16 is 400 then the result in i32 is 256. (200 plus 200 is 144 with a
8 bit +)
Explicit conversion may be done at any point with (type) inserted before the
expression to be converted. For example in the above the perhaps desired effect
may be achieved by doing:
In this case the first i8 is converted to 16 bit, then the add is a 16 bit add and the
second i8 is forced to 16 bit.
i16 = i8 * 100;
Remember that with unsigned ints (the default for this compiler) the values are
never negative. For example 2-4 is 254 (in 8 bit). This means the following is an
endless loop since i is never less than 0:
int i;
for( i=100; i>=0; i--)
250
Example Programs
EXAMPLE PROGRAMS
A large number of example programs are included with the software. The
following is a list of many of the programs and some of the key programs are re-
printed on the following pages. Most programs will work with any chip by just
changing the #INCLUDE line that includes the device information. All of the
following programs have wiring instructions at the beginning of the code in a
comment header. The SIOW.EXE program included in the program directory
may be used to demonstrate the example programs. This program will use a PC
COM port to communicate with the target.
Generic header files are included for the standard PIC® parts. These files are in
the DEVICES directory. The pins of the chip are defined in these files in the form
PIN_B2. It is recommended that for a given project, the file is copied to a project
header file and the PIN_xx defines be changed to match the actual hardware.
For example; LCDRW (matching the mnemonic on the schematic). Use the
generic include files by placing the following in your main .C file:
#include <16C74.H>
EX_14KAD.C
An analog to digital program with calibration for the PIC14000
EX_1920.C
Uses a Dallas DS1920 button to read temperature
EX_8PIN.C
Demonstrates the use of 8 pin PICs with their special I/O requirements
EX_92LCD.C
Uses a PIC16C92x chip to directly drive LCD glass
EX_AD12.C
Shows how to use an external 12 bit A/D converter
EX_ADMM.C
A/D Conversion example showing min and max analog readings
EX_CCP1S.C
Generates a precision pulse using the PIC CCP module
251
C Compiler Reference Manual
EX_CCPMP.C
Uses the PIC CCP module to measure a pulse width
EX_COMP.C
Uses the analog comparator and voltage reference available on some PICs
EX_CRC.C
Calculates CRC on a message showing the fast and powerful bit operations
EX_CUST.C
Change the nature of the compiler using special preprocessor directives
EX_FIXED.C
Shows fixed point numbers
EX_DNSLOOKUP.C
Example to perform a DNS lookup on the internet
EX_DPOT.C
Controls an external digital POT
EX_DTMF.C
Generates DTMF tones
EX_EMAIL.C
Program will send e-mail
EX_ENCOD.C
Interfaces to an optical encoder to determine direction and speed
EX_EXPIO.C
Uses simple logic chips to add I/O ports to the PIC
EX_EXSIO.C
Shows how to use a multi-port external UART chip
EX_EXTEE.C
Reads and writes to an external EEPROM
EX_FLOAT.C
Shows how to use basic floating point
252
Example Programs
EX_FREQC.C
A 50 mhz frequency counter
EX_GLINT.C
Shows how to define a custom global interrupt handler for fast interrupts
EX_ICD.C
Shows a simple program for use with Microchips ICD debugger
EX_INTEE.C
Reads and writes to the PIC internal EEPROM
EX_LCDKB.C
Displays data to an LCD module and reads data for keypad
EX_LCDTH.C
Shows current, min and max temperature on an LCD
EX_LED.C
Drives a two digit 7 segment LED
EX_LOAD.C
Serial boot loader program for chips like the 16F877
EX_LOGGER.C
A simple temperature data logger, uses the flash program memory for saving
data
EX_MACRO.C
Shows how powerful advanced macros can be in C
EX_MOUSE.C
Shows how to implement a standard PC mouse on a PIC
EX_MXRAM.C
Shows how to use all the RAM on parts will problem memory allocation
EX_PATG.C
Generates 8 square waves of different frequencies
EX_PBUSM.C
Generic PIC to PIC message transfer program over one wire
253
C Compiler Reference Manual
EX_PBUSR.C
Implements a PIC to PIC shared RAM over one wire
EX_PBUTT.C
Shows how to use the B port change interrupt to detect pushbuttons
EX_PGEN.C
Generates pulses with period and duty switch selectable
EX_PLL.C
Interfaces to an external frequency synthesizer to tune a radio
EX_PSP.C
Uses the PIC PSP to implement a printer parallel to serial converter
EX_PULSE.C
Measures a pulse width using timer0
EX_PWM.C
Uses the PIC CCP module to generate a pulse stream
EX_REACT.C
Times the reaction time of a relay closing using the CCP module
EX_RMSDB.C
Calculates the RMS voltage and dB level of an AC signal
EX_RTC.C
Sets and reads an external Real Time Clock using RS232
EX_RTCLK.C
Sets and reads an external Real Time Clock using an LCD and keypad
EX_SINE.C
Generates a sine wave using a D/A converter
EX_SISR.C
Shows how to do RS232 serial interrupts
EX_STISR.C
Shows how to do RS232 transmit buffering with interrupts
254
Example Programs
EX_SLAVE.C
Simulates an I2C serial EEPROM showing the PIC slave mode
EX_SPEED.C
Calculates the speed of an external object like a model car
EX_SPI.C
Communicates with a serial EEPROM using the H/W SPI module
EX_SQW.C
Simple Square wave generator
EX_SRAM.C
Reads and writes to an external serial RAM
EX_STEP.C
Drives a stepper motor via RS232 commands and an analog input
EX_STR.C
Shows how to use basic C string handling functions
EX_STWT.C
A stop Watch program that shows how to user a timer interrupt
EX_TANK.C
Uses trig functions to calculate the liquid in a odd shaped tank
EX_TEMP.C
Displays (via RS232) the temperature from a digital sensor
EX_TGETC.C
Demonstrates how to timeout of waiting for RS232 data
EX_TONES.C
Shows how to generate tones by playing "Happy Birthday"
EX_TOUCH.C
Reads the serial number from a Dallas touch device
EX_USB_HID.C
Implements a USB HID device on the PIC16C765 or an external USB chip
255
C Compiler Reference Manual
EX_USB_SCOPE.C
Implements a USB bulk mode transfer for a simple oscilloscope on an ext USB
chip
EX_VOICE.C
Self learning text to voice program
EX_WAKUP.C
Shows how to put a chip into sleep mode and wake it up
EX_WDT.C
Shows how to use the PIC watch dog timer
EX_WDT18.C
Shows how to use the PIC18 watch dog timer
EX_WEBSV.C
Shows how to implement a simple web server
EX_X10.C
Communicates with a TW523 unit to read and send power line X10 codes
14KCAL.C
Calibration functions for the PIC14000 A/D converter
2401.C
Serial EEPROM functions
2402.C
Serial EEPROM functions
2404.C
Serial EEPROM functions
2408.C
Serial EEPROM functions
24128.C
Serial EEPROM functions
256
Example Programs
2416.C
Serial EEPROM functions
24256.C
Serial EEPROM functions
2432.C
Serial EEPROM functions
2465.C
Serial EEPROM functions
25160.C
Serial EEPROM functions
25320.C
Serial EEPROM functions
25640.C
Serial EEPROM functions
25C080.C
Serial EEPROM functions
68HC68R1
C Serial RAM functions
68HC68R2.C
Serial RAM functions
74165.C
Expanded input functions
74595.C
Expanded output functions
9346.C
Serial EEPROM functions
9356.C
Serial EEPROM functions
257
C Compiler Reference Manual
9356SPI.C
Serial EEPROM functions (uses H/W SPI)
9366.C
Serial EEPROM functions
AD7705.C
A/D Converter functions
AD7715.C
A/D Converter functions
AD8400.C
Digital POT functions
ADS8320.C
A/D Converter functions
ASSERT.H
Standard C error reporting
AT25256.C
Serial EEPROM functions
AT29C1024.C
Flash drivers for an external memory chip
CRC.C
CRC calculation functions
CE51X.C
Functions to access the 12CE51x EEPROM
CE62X.C
Functions to access the 12CE62x EEPROM
CE67X.C
Functions to access the 12CE67x EEPROM
CTYPE.H
Definitions for various character handling functions
258
Example Programs
DNS.C
Functions used to perform a DNS lookup on the internet
DS1302.C
Real time clock functions
DS1621.C
Temperature functions
DS1621M.C
Temperature functions for multiple DS1621 devices on the same bus
DS1631.C
Temperature functions
DS1624.C
Temperature functions
DS1868.C
Digital POT functions
ERRNO.H
Standard C error handling for math errors
FLOAT.H
Standard C float constants
FLOATEE.C
Functions to read/write floats to an EEPROM
INPUT.C
Functions to read strings and numbers via RS232
ISD4003.C
Functions for the ISD4003 voice record/playback chip
KBD.C
Functions to read a keypad
LCD.C
LCD module functions
259
C Compiler Reference Manual
LIMITS.H
Standard C definitions for numeric limits
LMX2326.C
PLL functions
LOADER.C
A simple RS232 program loader
LOCALE.H
Standard C functions for local language support
LTC1298.C
12 Bit A/D converter functions
MATH.H
Various standard trig functions
MAX517.C
D/A converter functions
MCP3208.C
A/D converter functions
NJU6355.C
Real time clock functions
PCF8570.C
Serial RAM functions
PIC_USB.H
Hardware layer for built-in PIC USB
RS485.C
DRIVER FOR A RS485 PROTOCOL IMPLEMENTATION
S7600.H
Driver for Seiko S7600 TCP/IP chip
SC28L19X.C
Driver for the Phillips external UART (4 or 8 port)
260
Example Programs
SETJMP.H
Standard C functions for doing jumps outside functions
SMTP.H
e-mail functions
STDDEF.H
Standard C definitions
STDIO.H
Not much here - Provided for standard C compatibility
STDLIB.H
String to number functions
STDLIBM.H
Standard C memory management functions
STRING.H
Various standard string functions
TONES.C
Functions to generate tones
TOUCH.C
Functions to read/write to Dallas touch devices
USB.H
Standard USB request and token handler code
USBN960X.C
Functions to interface to Nationals USBN960x USB chips
USB.C
USB token and request handler code, also includes usb_desc.h and usb.h
X10.C
Functions to read/write X10 codes
261
C Compiler Reference Manual
/////////////////////////////////////////////////////////////////
/// EX_SQW.C ///
///This program displays a message over the RS-232 and ///
/// waits for any keypress to continue. The program ///
///will then begin a 1khz square wave over I/O pin B0. ///
/// Change both delay_us to delay_ms to make the ///
/// frequency 1 hz. This will be more visible on ///
/// a LED. Configure the CCS prototype card as ///
/// follows: insert jumpers from 11 to 17, 12 to 18, ///
/// and 42 to 47. ///
/////////////////////////////////////////////////////////////////
#ifdef __PCB__
#include <16C56.H>
#else
#include <16C84.H>
#endif
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_A3, rcv=PIN_A2)
main() {
printf("Press any key to begin\n\r");
getc();
printf("1 khz signal activated\n\r");
while (TRUE) {
output_high (PIN_B0);
delay_us(500);
output_low(PIN_B0);
delay_us(500);
}
}
262
Example Programs
///////////////////////////////////////////////////////////////
/// EX_STWT.C ///
/// This program uses the RTCC (timer0) and ///
/// interrupts to keep a real time seconds counter. ///
/// A simple stop watch function is then implemented. ///
///Configure the CCS prototype card as follows, insert ///
/// jumpers from: 11 to 17 and 12 to 18. ///
///////////////////////////////////////////////////////////////
#include <16C84.H>
#use delay (clock=20000000)
#use rs232(baud=9600, xmit=PIN_A3, rcv=PIN_A2_
#define INTS_PER_SECOND 76 //(20000000/(4*256*256))
byte seconds; //Number of interrupts left
//before a second has elapsed
if(--int_count==0) {
++seconds;
int_count=INTS_PER_SECOND;
}
}
main() {
byte start;
int_count=INTS_PER_SECOND;
set_rtcc(0);
setup_counters (RTCC_INTERNAL, RTCC_DIV_256);
enable_interrupts (INT_RTCC);
enable_interrupts(GLOBAL)
do {
printf ("Press any key to begin. \n\r");
getc();
start=seconds;
printf("Press any key to stop. \n\r");
getc();
printf ("%u seconds. \n\r", seconds-start);
} while (TRUE);
}
263
C Compiler Reference Manual
////////////////////////////////////////////////////////
/// EX_INTEE.C ///
///This program will read and write to the ’83 or ’84 ///
/// internal EEPROM. Configure the CCS prototype ///
///card as follows: insert jumpers from 11 to 17 and ///
/// 12 to 18. ///
////////////////////////////////////////////////////////
#include <16C84.H>
#use delay(clock-100000000)
#use rs232 (baud=9600, xmit=PIN_A3, rv+PIN_A2)
#include <HEX.C>
main() {
byte i,j,address, value;
do {
printf("\r\n\nEEPROM: \r\n") //Displays contents
for(i=0; i<3; ++i) { //entire EEPROM
for (j=0; j<=15; ++j) { //in hex
printf("%2x", read_eeprom(i+16+j));
}
printf("\n\r");
}
printf ("\r\nlocation to change: ");
address= gethex();
printf ("\r\nNew value: ");
value=gethex();
264
Example Programs
///////////////////////////////////////////////////////////////
///Library for a Microchip 93C56 configured for a x8 ///
/// ///
/// org init_ext_eeprom(); Call before the other ///
/// functions are used ///
/// ///
/// write_ext_eeprom(a,d); Write the byte d to ///
/// the address a ///
/// ///
/// d=read_ext_eeprom (a); Read the byte d from ///
/// the address a. ///
/// The main program may define eeprom_select, ///
/// eeprom_di, eeprom_do and eeprom_clk to override ///
/// the defaults below. ///
///////////////////////////////////////////////////////////////
#ifndef EEPROM_SELECT
#endif
void init_ext_eeprom() {
byte cmd[2];
byte i;
output_low(EEPROM_DI);
output_low(EEPROM_CLK);
output_low(EEPROM_SELECT);
cmd[0]=0x80;
cmd[1]=0x9;
265
C Compiler Reference Manual
cmd[0]=data;
cmd[1]=address;
cmd[2]=0xa;
for(i=1;i<=4;++i)
shift_left(cmd,3,0);
output_high(EEPROM_SELECT);
for(i=1;i<=20;++i) {
output_bit (EEPROM_DI, shift_left (cmd,3,0));
output_high (EEPROM_CLK);
output_low(EEPROM_CLK);
}
output_low (EEPROM_DI);
output_low (EEPROM_SELECT);
delay_ms(11);
}
cmd[0]=0;
cmd[1]=address;
cmd[2]=0xc;
for(i=1;i<=4;++i)
shift_left(cmd,3,0);
output_high(EEPROM_SELECT);
for(i=1;i<=20;++i) {
output_bit (EEPROM_DI, shift_left (cmd,3,0));
output_high (EEPROM_CLK);
output_low(EEPROM_CLK);
if (i>12)
shift_left (&data, 1, input (EEPROM_DO));
}
output_low (EEPROM_SELECT);
return(data);
}
266
SOFTWARE LICENSE AGREEMENT
By opening the software diskette package, you agree to abide by the following
provisions. If you choose not to agree with these provisions promptly return the
unopened package for a refund.
1. License- Custom Computer Services ("CCS, Inc") grants you a license to use
the software program ("Licensed Materials") on a single-user computer. Use of
the Licensed Materials on a network requires payment of additional fees.
3. Warranty- CCS warrants the media to be free from defects in material and
workmanship and that the software will substantially conform to the related
documentation for a period of thirty (30) days after the date of your purchase.
CCS does not warrant that the Licensed Materials will be free from error or will
meet your specific requirements.
Neither CCS nor any applicable licensor will be liable for an incidental or
consequential damages, including but not limited to lost profits.
267