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.
  • XML Parser - Parse XML documents using the minimal resources of a PIC® MCU.
Stepper Motor Controller

Back to Top

/////////////////////////////////////////////////////////////////////////
////                        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 

#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

Back to Top

///////////////////////////////////////////////////////////////////////
////                          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);
}
Output Listing

Back to Top

....................       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

Back to Top


/////////////////////////////////////////////////////////////////////////
////                             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

Back to Top


/////////////////////////////////////////////////////////////////////////
////                         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

Back to Top


/////////////////////////////////////////////////////////////////////////
////                          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);
}