CCS C Compiler Example Programs
Full List of Example Files
The CCS C compiler includes a library of example programs for many common applications. Each example program contains a header with instructions on how to run the example, and if necessary, the wiring instructions for interfacing external devices.
Below are example programs included with our compiler, as well as a list file generated by the compiler, which shows the assembly generated to correspond with the C code.
Click here for a full list of example files and source code drivers included with the CCS C compiler.
PCM (supports most PIC12 and PIC16 devices):
PCD (supports PIC24/dsPIC® DSC families):
Many more example programs and libraries
These are some of the additional libraries and examples included:
- FAT - Access/read/write files on a SD/MMC card that has a FAT file system. Run a long term log on your PIC® MCU, saving each entry by appending to a file. Then read the results on your PC by opening the file.
- SIM/SMART Card - Access the contact and phone number information on a SIM/SMART card, commonly found on GSM/GPRS cell phones.
- Frequency Generator - Generate tones, frequencies and DTMF using only one user define general purpose I/O pin. This is done by implementing a software PWM on one pin.
- XTEA Cipher Library - Transmit encrypted data between two PIC® MCUs using XTEA Encryption.
Stepper Motor Controller
///////////////////////////////////////////////////////////////////////// //// EX_STEP.C //// //// //// //// This program interfaces to a stepper motor. The program will //// //// use the RS-232 interface to either control the motor with a //// //// analog input, a switch input or by RS-232 command. //// //// //// //// Configure the CCS prototype card as follows: //// //// Connect stepper motor to pins 47-50 (B0-B3) //// //// Conenct 40 to 54 (pushbutton) //// //// Connect 9 to 15 (pot) //// //// See additional connections below. //// ///////////////////////////////////////////////////////////////////////// //// (C) Copyright 1996,2001 Custom Computer Services //// //// This source code may only be used by licensed users of the CCS //// //// C compiler. This source code may only be distributed to other //// //// licensed users of the CCS C compiler. No other use, //// //// reproduction or distribution is permitted without written //// //// permission. Derivative programs created using this software //// //// in object code form are not restricted in any way. //// ///////////////////////////////////////////////////////////////////////// #include <16c74.h> #fuses HS,NOWDT,NOPROTECT #use delay(clock=20000000) #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) // Jumpers: 8 to 11, 7 to 12 #include <input.c> #byte port_b = 6 #define FOUR_PHASE TRUE #ifdef FOUR_PHASE byte const POSITIONS[4] = {0b0101, 0b1001, 0b1010, 0b0110}; #else byte const POSITIONS[8] = {0b0101, 0b0001, 0b1001, 0b1000, 0b1010, 0b0010, 0b0110, 0b0100}; #endif drive_stepper(BYTE speed, char dir, BYTE steps) { static BYTE stepper_state = 0; BYTE i; for(i=0; i<steps; ++i) { delay_ms(speed); set_tris_b(0xf0); port_b = POSITIONS[ stepper_state ]; if(dir!='R') stepper_state=(stepper_state+1)&(sizeof(POSITIONS)-1); else stepper_state=(stepper_state-1)&(sizeof(POSITIONS)-1); } } use_pot() { BYTE value; setup_adc(adc_clock_internal); set_adc_channel( 1 ); printf("rn"); while( TRUE ) { value=read_adc(); printf("%2Xr",value); if(value<0x80) drive_stepper(value,'R',8); else if(value>0x80) drive_stepper(128-(value-128),'F',8); } } use_switch(BYTE speed, char dir) { BYTE steps; printf("nrSteps per press: "); steps = gethex(); while(true) { while(input(PIN_B7)) ; drive_stepper(speed,dir,steps); while(!input(PIN_B7)) ; delay_ms(100); } } main() { byte speed,steps; char dir; setup_port_a(RA0_RA1_ANALOG); while (TRUE) { printf("nrSpeed (hex): "); speed = gethex(); if(speed==0) use_pot(); printf("nrDirection (F,R): "); dir=getc()|0x20; putc(dir); printf("nrSteps (hex): "); steps = gethex(); if(steps==0) use_switch(speed,dir); drive_stepper(speed,dir,steps); } }
Seconds Timer
/////////////////////////////////////////////////////////////////////// //// 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 <16f877a.h> #fuses HS,NOLVP,NOWDT,PUT #use delay(clock=20000000) #use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7) #define high_start 76 byte seconds, high_count; #INT_RTCC //Interrupt procedure clock_isr() { //called every time RTCC high_count -= 1; //flips from 255 to 0 if(high_count==0) { ++seconds; high_count=high_start; //Inc SECONDS counter every } //76 times to keep time } void main() { //a simple stopwatch program byte start, time; high_count = high_start; setup_timer_0( RTCC_INTERNAL | RTCC_DIV_256 ); set_timer0(0); enable_interrupts(INT_RTCC); enable_interrupts(GLOBAL); do { printf("Press any key to begin.nr"); getc(); start = seconds; printf("Press any key to stop.rn"); getc(); time = seconds - start; printf("%U seconds.nr", time); } while (TRUE); }
Simple A/D
///////////////////////////////////////////////////////////////////////// //// EX_ADMM.C //// //// //// //// This program displays the min and max of 30 A/D samples over //// //// the RS-232 interface. The process is repeated forever. //// //// //// //// Configure the CCS prototype card as follows: //// //// Insert jumpers from: 11 to 17, 12 to 18 and 9 to 16 //// //// Use the #9 POT to vary the voltage. //// ///////////////////////////////////////////////////////////////////////// #include <16f877a.h> #fuses HS,NOLVP,NOWDT,PUT #use delay(clock=20000000) #use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7) void main() { int i, value, min, max; printf("Sampling:"); setup_adc_ports( RA0_ANALOG ); setup_adc( ADC_CLOCK_INTERNAL ); set_adc_channel( 0 ); do { //Takes 30 samples from pin A0 min = 255; //and displays the min and max max = 0; //values for that 100ms period for(i = 0; i <= 30; ++i) { delay_ms(100); value = read_adc(); if(value < min) min = value; if(value > max) max = value; } printf("nrMin:%x MAX: %x", min, max); } while (TRUE); }
Output Listing
.................... min=255; 008D: MOVLW FF 008E: MOVWF 28 .................... max=0; 008F: CLRF 29 .................... incc=TRUE; 0090: BSF 2B,0 .................... for(i=0;i<=30;++i) { 0091: CLRF 26 0092: MOVLW 1F 0093: SUBWF 26,W 0094: BTFSC 03,0 0095: GOTO 0AC .................... delay_ms(100); 0096: MOVLW 64 0097: MOVWF 2C 0098: GOTO 02D .................... value = Read_ADC(); 0099: BSF 1F,2 009A: BTFSC 1F,2 009B: GOTO 09A 009C: MOVF 1E,W 009D: MOVWF 27 .................... if(value < min) 009E: MOVF 28,W 009F: SUBWF 27,W 00A0: BTFSC 03,0 00A1: GOTO 0A4 .................... min=value; 00A2: MOVF 27,W 00A3: MOVWF 28 .................... if(value > max) 00A4: MOVF 27,W 00A5: SUBWF 29,W 00A6: BTFSC 03,0 00A7: GOTO 0AA .................... max=value; 00A8: MOVF 27,W 00A9: MOVWF 29 .................... } 00AA: INCF 26,F 00AB: GOTO 092 .................... if (incc) 00AC: BTFSC 2B,0 .................... counter++; 00AD: INCF 2A,F
Simple Square Wave Generator
///////////////////////////////////////////////////////////////////////// //// 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 B4. //// //// //// //// Comment out the printf's and getc to eliminate the RS232 and //// //// just output a square wave. //// //// //// //// Change both delay_us to delay_ms to make the frequency 1 hz. //// //// This will be more visable on a LED. //// //// //// //// //// //// Change the device, clock and RS232 pins for your hardware if //// //// needed. //// ///////////////////////////////////////////////////////////////////////// #include <30F2010.h> //#device ICD=TRUE // For using the debugger, un-comment #use delay(crystal=20mhz) // UART1A specifies the alternate UART pins Pin_C13, Pin_C14 // use UART1 to sprcify UART for pins Pin_F3, Pin_F2 #use rs232(baud=9600, UART1A) void main() { printf("Press any key to beginnr"); getc(); printf("1 khz signal activatednr"); while (TRUE) { output_high(PIN_B4); delay_us(500); output_low(PIN_B4); delay_us(500); } }
Watchdog Timer
///////////////////////////////////////////////////////////////////////// //// EX_WDT.C //// //// //// //// This program demonstartes the watchdog timer. If the user //// //// does not hit a key in the set amount of time, the processor //// //// restarts, and tells the user why it restarted. //// //// //// //// Jumpers: //// //// PCH pin C7 to RS232 RX, pin C6 to RS232 TX //// //// PCD none //// //// //// //// This example will work with the PCD compiler. //// //// The following conditional compilation lines are used to //// //// include a valid device for each compiler. Change the device, //// //// clock and RS232 pins for your hardware if needed. //// ///////////////////////////////////////////////////////////////////////// //// (C) Copyright 1996,2003 Custom Computer Services //// //// This source code may only be used by licensed users of the CCS //// //// C compiler. This source code may only be distributed to other //// //// licensed users of the CCS C compiler. No other use, //// //// reproduction or distribution is permitted without written //// //// permission. Derivative programs created using this software //// //// in object code form are not restricted in any way. //// ///////////////////////////////////////////////////////////////////////// #ifndef __PCD__ #error This example is only for dsPIC/PIC24 devices #endif #include <30F5011.h> #fuses HS,NOPROTECT,WDT,WPSB1,WPSA512 #use delay(clock=20000000) #use rs232(baud=9200, UART1) main() { switch ( restart_cause() ) { case RESTART_WATCHDOG: { printf("rnRestarted processor because of watchdog timeout!rn"); break; } case RESTART_POWER_UP: { printf("rnNormal power up!rn"); break; } } setup_wdt(WDT_ON); while(TRUE) { restart_wdt(); printf("Hit any key to avoid a watchdog timeout.rn"); getc(); } }
A/D Conversion
///////////////////////////////////////////////////////////////////////// //// EX_ADMM10.C //// //// //// //// This program displays the min and max of 30 A/D samples over //// //// the RS-232 interface. The process is repeated forever. //// //// //// //// If required configure the CCS prototype card as follows: //// //// Insert jumper from output of POT to pin A5 //// //// Use a 10K POT to vary the voltage. //// //// //// //// Jumpers: //// //// PCM,PCH pin C7 to RS232 RX, pin C6 to RS232 TX //// //// PCD none //// //// //// //// This example will work with the PCM, PCH, and PCD compilers. //// //// The following conditional compilation lines are used to //// //// include a valid device for each compiler. Change the device, //// //// clock and RS232 pins for your hardware if needed. //// ///////////////////////////////////////////////////////////////////////// //// (C) Copyright 1996,2007 Custom Computer Services //// //// This source code may only be used by licensed users of the CCS //// //// C compiler. This source code may only be distributed to other //// //// licensed users of the CCS C compiler. No other use, //// //// reproduction or distribution is permitted without written //// //// permission. Derivative programs created using this software //// //// in object code form are not restricted in any way. //// ///////////////////////////////////////////////////////////////////////// #include <30F5011.h> #fuses HS,NOWDT #use delay(clock=20000000) #use rs232(baud=9600, UART1) void main() { int i, value, min, max; printf("Sampling:"); setup_adc_ports( sAN0 ); setup_adc( ADC_CLOCK_INTERNAL ); set_adc_channel( 0 ); do { min=255; max=0; for(i=0; i<=30; ++i) { delay_ms(100); value = read_adc(); if(valuemax) max=value; } printf("nrMin: %2X Max: %2Xnr",min,max); } while (TRUE); }