PIC单片机CCS之C语言(#DEVICE的用法)
语法: #device chip options
本文引用地址:https://www.eepw.com.cn/article/201611/315393.htmchip是一个特殊的处理器名字(如: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<(BUFFSIZE*2)) //否则,若BUFFSIZE 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<(BUFFSIZE*2)) //否则,若BUFFSIZE return(buffer2[index%BUFFSIZE]); else return(buffer3[index%BUFFSIZE]); //否则,若index>(BUFFSIZE*2) ,则执行该句; } void main() { char * i; //声明字符型指针变量i char c; //声明字符型变量c do { i=0; printf("rnEnter string: "); do{ c=getc(); //读UART write_buffer(i++,c); //写数组 } while(c!=r); i=0; printf("rnString 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()函数的用法
评论