您的位置 首页 数字

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

#BYTE语法:#byteid=xid是一个有效的C标识符;x是一个常数或是一个C变量;目的:如果id是一个已知C的变量,那么它将定位在地址x处,在…

#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个数据,求其最大值

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/shuzi/268186.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部