PIC單片機CCS之C語言(#BIT的用法)
語法: #bit id=x.y
本文引用地址:http://m.butianyuan.cn/article/201611/315392.htmid是一個有效的C標識符;
x是一個常數(shù)或是一個C變量;
y是一個常數(shù)(為0~7)
目的:創(chuàng)建一個新的C變量(是一位),放置在存儲區(qū)中,對應的是字節(jié)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) //使能內(nèi)置函數(shù)的功能:delay_ms()和delay_us()
//#USE DELAY()必須在#use rs232()使用之前出現(xiàn).
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) //使用波特率為9600,
//發(fā)送腳為PIN_C6
//接收腳為PIN_C7
//使能內(nèi)置函數(shù):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的內(nèi)容
int save_status; //將save_status定義為int型變量, 用來暫存status的內(nèi)容
#locate save_status=0x20 //將save_status定位在RAM中, 0x20的地址處,
#byte status = 3 //定義status的地址為3,即狀態(tài)寄存器的地址
#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 //指示下面的函數(shù)代替編譯器產(chǎn)生中斷
void isr() {
#asm //插入?yún)R編開始
//store current state of processor
MOVWF save_w //將W的內(nèi)容存到save_w中,目的是保存W,即將W入棧
SWAPF status,W //將status內(nèi)容高半字節(jié)和低半字節(jié)進行交換,存入W中
BCF status,5 //將status的第5位清0,即將RP0=0
BCF status,6 //將status的第6位清0, 即將RP1=0,兩句是用來選擇bank0
MOVWF save_status //將W的內(nèi)容存到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,則執(zhí)行下一句;
INCF (&counter+1),F // counter的地址加1, (&counter+1)的內(nèi)容加1
SWAPF save_status,W //將save_status內(nèi)容高半字節(jié)和低半字節(jié)進行交換,存入W中
MOVWF status //將W的內(nèi)容存到status中, status出棧
SWAPF save_w,F //將save_w內(nèi)容高半字節(jié)和低半字節(jié)進行交換,其結果存入save_w中
SWAPF save_w,W //將save_w內(nèi)容高半字節(jié)和低半字節(jié)進行交換,存入W 中, W出棧
#endasm //插入?yún)R編結束
}
void main() {
printf("rnStarting the counter.rnn");
counter = 0;
setup_counters(RTCC_INTERNAL,RTCC_DIV_32); //設置Timer0的時鐘源為內(nèi)部時鐘源
//每隔32個脈沖,TMR0計數(shù)1次
enable_interrupts(INT_RTCC); //允許Timer0(RTCC)溢出,建立中斷標志位
enable_interrupts(GLOBAL); //使能總中斷
while(TRUE)
{
printf("The counter value is currently: %5lurn", counter);
delay_ms(1000); //延時1000ms
}
}
//上面的例子只是說明用timer0對內(nèi)部時鐘源進行32分頻后計數(shù).
評論