#BYTE
语法: #byte id=x
id是一个有用的C标识符;
x是一个常数或是一个C变量;
意图:假如id是一个已知C的变量,那么它将定位在地址x处,在这种情况下,变量类型的开始界说不会被改动.若id不是已知的C变量,则运用#byte id=x就可创立一个新的C变量,且放在地址x处,类型为整型(8位).
主见:在两个不同的存储区里,x不是仅有对应这个变量(id)的地址.其它变量或许和它具有相同的地址.实际上,当x是一个变量时,那么id和x就同享有相同的地址存储单元.
比如:
#byte status=3 //界说status的地址为3
#byte b_port=6 //界说b_port的地址为6
struct{
short int r_w; //界说位变量
short int c_d; //界说位变量
int unused :2; //保存两位
int data :4; //保存4位
}a_port //将a_port界说为结构变量, r_w对应a_port.0, c_d对应a_port.1
#byte a_port=5 //界说a_port的地址为5,即端口RA口
…
a_port.c_d=1;
比如文件: ex_glint.c
#DEFINE
语法: #define id text
or
#define id(x,y…) text
id是一个预处理器标识符;text是恣意字符文字;x,y等是被定坐落预处理器中的标识符,在这中方法下,有一个或更多的标识符被逗号离隔.
意图:运用简略的字符来规则替代id,这个所给的字符来自于程序指针.
在第二种方法下,本来的标识符要同text中的那个简略的标识符相匹配,用text替代本来的标识符;
假如text包括#idx方法的字符,那么赋值后的结果是参数id和字符x衔接;
假如text包括idx##idy方法的字符,那么参数idx就和参数idy衔接构成一个新的标识符;
比如: #define BITS 8 //用BITS替代8
a=a+BITS; //相当于a=a+8
#define hi(x) (x<<4) //将(x<<4) 用hi(x) 替代
a=hi(a); //相当于a=(a<<4)
比如文件:ex_stwt.c, ex_macro.c
文件:ex_stwt.c如下:
#if defined(__PCM__) //若运用了PCM编译器,则defined(__PCM__)回来值为1
#include <16F877.h> //包括16F877.h头文件
#fuses HS, NOWDT, NOPROTECT, NOLVP //HS:高速晶振/谐振器, NOWDT:不运用WDT
// NOPROTECT:程序存储器代码不维护
#use delay(clock=20000000) //使能内置函数的功用:delay_ms()和delay_us()
//#USE DELAY()必须在#use rs232()运用之前呈现.
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) //运用波特率为9600,
//发送脚为PIN_C6
//接纳脚为PIN_C7
//使能内置函数:GETC,PUTC和PRINTF;
#elif defined(__PCH__)
#include <18F452.h>
#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
#endif //完毕if
#define INTS_PER_SECOND 76 // (20000000/(4*256*256)) 用INTS_PER_SECOND替代76
BYTE seconds; //秒计数器,1秒=(4/20000000)*256*256* INTS_PER_SECOND
BYTE int_count; // 在1秒未到之前,还要经过多少次中止,才够1秒;
#int_rtcc //Timer0(RTCC)溢出, 指定下面的函数是一个中止服务函数
void clock_isr() { // the RTCC (timer0) overflows (255->0),For this program this is apx 76 times
if(–int_count==0) { // per second.
++seconds; //1秒到, seconds加1;
int_count=INTS_PER_SECOND; ////给int_count赋初值
}
}
void main() {
BYTE start;
int_count=INTS_PER_SECOND; //给int_count赋初值
set_timer0(0); //设定实时时钟/计数器的计数初值
setup_counters( RTCC_INTERNAL, RTCC_DIV_256 | RTCC_8_BIT);
//设置Timer0的时钟源为内部时钟源
//每隔256个脉冲,TMR0计数1次
//在PIC18XXXX中,RTCC_8_BIT设置Timer0为8位定时器方法;
enable_interrupts(INT_RTCC); //答应Timer0(RTCC)溢出,树立中止标志位
enable_interrupts(GLOBAL); //使能总中止
do {
printf(“Press any key to begin.\n\r”);
getc(); //从RS232口读入1个字符
start=seconds;
printf(“Press any key to stop.\n\r”);
getc(); //从RS232口读入1个字符
printf(“%u seconds.\n\r”,seconds-start);
} while (TRUE);
}
上面的文件是运用Timer0选用内部指令周期作为时钟源,再256分频,构成1秒产生齐器.
文件: ex_macro.c如下:
#define BUFFERSIZE 10 //用BUFFERSIZE替代10
#define BUFFER_EMPTY (next_in==next_out)
//用BUFFER_EMPTY替代表达式(next_in==next_out)
#define min(x,y) ((x #define max(x,y) ((x>y)?x:y) //用max(x,y)替代表达式((x>y)?x:y) ,若x>y,则回来x #define forever while(1); //用forever替代表达式while(1) #define MHZ(x) x##000000 //用MHZ(x)替代x##000000
#ifndef __PCB__ //若没有界说__PCB__,则履行下面的句子;
#define NORMAL_RS232 baud=9600, xmit=PIN_C6, rcv=PIN_C7 //
#else //若有界说__PCB__,则履行下面的句子;
#define NORMAL_RS232 baud=9600, xmit=PIN_B1, rcv=PIN_B0
#endif //完毕if界说
#define set_options(value) {#ASM \
MOVLW value \
OPTION \
#ENDASM}
#define debug(x) printf(“%s variable value is %d\r\n”,#x,x);
//用debug(x)替代printf(“%s variable value is %d\r\n”,#x,x);;
#define TOSTRING(s) #s //用TOSTRING(s)替代#s
#define DEVICE_FILE_FOR(chip) TOSTRING(chip##.h)
#ifdef __pcb__ //若有界说__PCB__,则履行下面的句子;
#define IDLE {if(kbhit()) isr();} //用IDLE替代{if(kbhit()) isr();}
//若getc()读到数据,则kbhit()回来1,不然, kbhit()回来0
#else //若没有界说__PCB__,则履行下面的句子;
#define IDLE ; //用IDLE替代; ;
#endif //完毕if界说
#include DEVICE_FILE_FOR(16C74) //包括16C74.h头文件
#fuses HS,NOPROTECT //HS:高速晶振/谐振器, NOPROTECT:程序存储器代码不维护
#use delay(clock=MHZ(20)) //使能内置函数的功用:delay_ms()和delay_us()
//#USE DELAY()必须在#use rs232()运用之前呈现.
#use RS232(NORMAL_RS232) //运用波特率为9600,
//发送脚为PIN_C6
//接纳脚为PIN_C7
//使能内置函数:GETC,PUTC和PRINTF, kbhit();
int buffer[BUFFERSIZE]; //声明buffer[10]数组
int next_in, next_out; //声明整型变量next_in和next_out
#ifndef __pcb__ //若没有界说__PCB__,则履行下面的句子;
#int_rda //RS232接纳到的数据有用,指定下面的函数是一个中止函数
#endif //完毕if界说
void isr() {
buffer[next_in]=getc(); //从RS232口读数据
next_in=(next_in+1)%BUFFERSIZE; //将next_in加1后,除以10,将商赋给next_in
}
void main() {
int x, largest; //声明整型变量x和largest
set_options(0x34); //用汇编设置option寄存器,将预分频器留给Timer0运用
//分频比为1:32, Timer0的时钟源挑选外部时钟;
// Timer0在下降沿递加计数;INT脚电平下降沿触发中止
//使能GPIO上拉
#ifndef __pcb__ //若没有界说__PCB__,则履行下面的句子;
enable_interrupts(INT_RDA); //使能UART接纳中止
enable_interrupts(GLOBAL); //使能总中止
#endif //完毕if界说
next_in=next_out=0; //初始化变量next_in 和next_out
largest=0; //初始化变量largest
do {
while(BUFFER_EMPTY) //当next_in=next_out时
IDLE; //若界说__PCB__,则用IDLE替代{if(kbhit()) isr();}
//若getc()读到数据,则kbhit()回来1,不然, kbhit()回来0
//若没有界说__PCB__,则用IDLE替代;
x=buffer[next_out];
next_in=(next_out+1)%BUFFERSIZE; //将next_out加1后,除以10,将商赋给next_in
largest = max(largest,x); //求最大值
debug(next_in); //用debug(x)替代printf(“%s variable value is %d\r\n”,#x,x);;
debug(next_out) //用debug(x)替代printf(“%s variable value is %d\r\n”,#x,x);;
} forever; //用forever替代表达式while(1)
}上面的比如是经过UART接纳10个数据,求其最大值