×
单片机 > 单片机程序设计 > 详情

PIC单片机CCS之C语言(#DEVICE的用法)

发布时间:2020-06-19 发布时间:
|
#DEVICE

语法: #device chip options

chip是一个特殊的处理器名字(如:PIC16C74),目的是取得支持设备的当前列表:

START | RUN | CCSC +Q

Option是设备标准操作的限定句.有效的可选项是:

*=5                      使用5位指针(适合所有的器件)

*=8                      使用8位指针(适合14和16位的器件)

*=16                      使用16位指针(适合14位的器件)

ADC=x                   这里的x是read_adc()函数返回的位数.

ICD=TRUE               产生兼容Microchips ICD硬件调试代码

WRITE_EEPROM=ASYNC 当写EEPROM时,防止EEPROM写暂停.当使用时,不会从

ISR和外部的ISR写入EEPROM

chip和options是可选项,若干个#device行可全部用来定义这个设备.注意: 带有`芯片标识符的#device将会清除先前的#device和#fuse的设定.

目的:定义目标处理器,每个程序必须有一个正确的带有chip的#device.

例子:

#device  PIC16C74                 //定义目标处理器为PIC16C74

#device  PIC16C67  *=16           //定义目标处理器为PIC16C67,使用16位指针

#device  *=16  ICD=TRUE         //使用16位指针,产生兼容的ICD硬件调试代码

#device  PIC16F877  *=16  ADC=10 // read_adc()函数返回的位数为10位

例子文件:ex_mxram.c, ex_icd.c, 16c74.h

文件: ex_mxram.c如下:

#if defined( __PCB__)   //若使用了PCB编译器,则defined( __PCB__)返回值为1

#include <16C57.H>     //包含16C57.H头文件

#device *=8           // This allows auto variables over location 0x1F

                     //使用8位指针(适合14和16位的器件)

#fuses HS, NOWDT, NOPROTECT  //HS:高速晶振/谐振器, NOWDT:不使用WDT

                               // NOPROTECT:程序存储器代码不保护

#use delay(clock=20000000)        //使能内置函数的功能:delay_ms()和delay_us()

                               //#USE DELAY()必须在#use rs232()使用之前出现.

#use rs232(baud=9600, xmit=PIN_A3, rcv=PIN_A2)  //使用波特率为9600,

//发送脚为PIN_A3

//接收脚为PIN_A2

//使能内置函数:GETC,PUTC和PRINTF, kbhit();

#define BUFFSIZE 16       //用BUFFERSIZE代替10

 

#elif defined(__PCM__)

#include <16F877.H>

#device *=16                    // This allows auto variables over location 0xFF

#fuses HS,NOWDT,NOPROTECT,NOLVP

#use delay(clock=20000000)

#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)  // Jumpers: 8 to 11, 7 to 12

#define BUFFSIZE 64

#endif     //结束if定义

 

 

byte buffer1[BUFFSIZE],buffer2[BUFFSIZE],buffer3[BUFFSIZE];

// Three buffers are allocated because C requires arrays elements to be in

// consecutive memory locations and the PIC memory has holes.

//声明buffer1[BUFFSIZE]数组, buffer2[BUFFSIZE]数组, buffer3[BUFFSIZE]数组

// The following allows reads and writes to the three arrays like they are

// one large array.

void write_buffer(char * index, char value) {

   if(index

    buffer1[index]=value;   //若index

 else if(index

    buffer2[index%BUFFSIZE]=value;

 else

    buffer3[index%BUFFSIZE]=value; //否则,若index>(BUFFSIZE*2) ,则执行该句;

}

 

char read_buffer(char * index) {

   if(index

    return(buffer1[index]);        //若index

 else if(index

    return(buffer2[index%BUFFSIZE]);

 else

    return(buffer3[index%BUFFSIZE]);  //否则,若index>(BUFFSIZE*2) ,则执行该句;

}

 

void main() {

   char * i;    //声明字符型指针变量i

   char c;     //声明字符型变量c

   do {

       i=0;

       printf("\r\nEnter string: ");

       do{

         c=getc();   //读UART

          write_buffer(i++,c);  //写数组

       } while(c!='\r');

 

       i=0;

       printf("\r\nString from buffer: ");

       do{

         c=read_buffer(i++);  //读数组

         putc(c);  //写UART,通过RS232发送

       } while(c!='\r');

 } while(1);

}

上面的例子通过UART读/写三个数组.

文件: ex_icd.c如下:

#if defined(__PCM__)   //若使用了PCM编译器,则defined( __PCM__)返回值为1

#include <16F877.h>    //包含16F877.h头文件

#device ICD=TRUE     //产生兼容Microchips ICD硬件调试代码

#fuses HS,NOWDT,NOPROTECT,NOLVP   //HS:高速晶振/谐振器, NOWDT:不使用WDT

                                      // NOPROTECT:程序存储器代码不保护

#use delay(clock=20000000)  //使能内置函数的功能:delay_ms()和delay_us()

                         //#USE DELAY()必须在#use rs232()使用之前出现.

#endif    //结束if定义

#define  TOGGLE_PIN  PIN_B0    //用TOGGLE_PIN代替PIN_B0

// This function turns the LEDs on and off这个函数是用来开关LED

void flash_led() {

   output_low(TOGGLE_PIN);  // TOGGLE_PIN脚(PIN_B0)输出低电平

   delay_ms(500);   //延时500ms

   output_high(TOGGLE_PIN);  // TOGGLE_PIN脚(PIN_B0)输出高电平

   delay_ms(500);  //延时500ms

}

 

void main()   {

   int a, b, c;        //声明整型变量a, b和c

   long al, bl, cl;     //声明Long型变量a1, b1和c1

   a=10;           //将a初始为10

   b=25;           //将b初始为25

   al=300;          //将a1初始为300

   bl=525;          //将b1初始为525

   c=a+b;           //简单数学加法

   c=a*b;           //简单的数学乘法

   cl=al+bl;

   cl=al*bl;

   while(TRUE)    

      flash_led();    //LED的闪烁频率为1Hz

}

上面的例子介绍delay_ms(), output_high(), output_low()函数的用法

关键字:PIC单片机  CCS  DEVICE 


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
PIC单片机的多路AD切换程序设计