语法: #bit id=x.y
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> //包含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)
#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分频后计数.
上一篇:PIC单片机CCS之C语言(#DEVICE的用法)
下一篇:PIC 8位单片机指令识读技巧
推荐阅读最新更新时间:2024-03-16 15:12