快捷搜索:

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

id是一个有用 的C标识符;

x是一个常数或是一个C变量;

y是一个常数(为0~7)

用意:创建一个新的C变量(是一位),放置在存储区中,对应的是字节x中y位,有利 于在C言语 中只接存取CPU特殊功用 存放 器中的一位.它也可用来存取规范 C变量的一位.

例子:

#bit T0IF = 0xb.2 //定义 T0IF的位地 址为0xb.2

T0IF=0; //清除Timer0的中断标志位

int result;

#bit result_odd = result.0 //定义 result_odd的位地 址为result.0

if(result_odd){;} //若result_odd为1,则空操作

例子文件: ex_glint.c

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

#include //包括 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

#fuses HS,NOWDT,NOPROTECT,NOLVP

#use delay(clock=20000000)

#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

#endif //完毕 if

long counter; //将counter定义 为long型变量

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

int save_w; //将save_w定义 为int型变量

#locate save_w=0x7f //将save_w定位在RAM中,0x7f的地 址处, 用来暂存W的内容

int save_status; //将save_status定义 为int型变量, 用来暂存status的内容

#locate save_status=0x20 //将save_status定位在RAM中, 0x20的地 址处,

#byte status = 3 //定义 status的地 址为3,即状态存放 器的地 址

#bit zero_flag = status.2 //定义 zero_flag的位地 址为status.2,即status的Z位

#bit t0if = 0xb.2 //定义 t0if的位地 址为0xb.2,即timer0的溢出标志位

#elif defined(__PCH__)

int save_w;

#locate save_w=0x80

int save_status;

#locate save_status=0xFF

#byte status = 0xFD8

#bit zero_flag = status.2 //status的全0位,即Z

#bit t0if = 0xFF2.2

#endif //完毕 if

#INT_GLOBAL //指示下面的函数代替 编译器发生 中断

void isr() {

#asm //刺进 汇编开始

//store current state of processor

MOVWF save_w //将W的内容存到save_w中,用意是保存W,行将 W入栈

SWAPF status,W //将status内容高半字节和低半字节进行交换,存入W中

BCF status,5 //将status的第5位清0,行将 RP0=0

BCF status,6 //将status的第6位清0, 行将 RP1=0,两句是用来选择bank0

MOVWF save_status //将W的内容存到save_status中,用意是保存status,行将 status入栈

BCF t0if //将timer0的中断标志位t0if清0

INCF counter,F // counter加1后存到counter

BTFSC zero_flag //若counter不等于0x00, 则zero_flag=0,跳过下一句;

//若counter=0x00,zero_flag=1,则执行下一句;

INCF (&counter+1),F // counter的地 址加1, (&counter+1)的内容加1

SWAPF save_status,W //将save_status内容高半字节和低半字节进行交换,存入W中

MOVWF status //将W的内容存到status中, status出栈

SWAPF save_w,F //将save_w内容高半字节和低半字节进行交换,其成绩存入save_w中

SWAPF save_w,W //将save_w内容高半字节和低半字节进行交换,存入W 中, W出栈

#endasm //刺进 汇编完毕

}

void main() {

printf("\r\nStarting the counter.\r\n\n");

counter = 0;

setup_counters(RTCC_INTERNAL,RTCC_DIV_32); //设置Timer0的时钟源为内部时钟源

//每隔32个脉冲,TMR0计数1次

enable_interrupts(INT_RTCC); //允许Timer0(RTCC)溢出,建立中断标志位

enable_interrupts(GLOBAL); //使能总中断

while(TRUE)

{

printf("The counter value is currently: %5lu\r\n", counter);

delay_ms(1000); //延时1000ms

}

}

//上面的例子只是说明用timer0对内部时钟源进行32分频后计数.

您可能还会对下面的文章感兴趣: