語法: #bit id=x.y
本文引用地址:http://www.eepw.com.cn/article/201611/315392.htmid是一個有效的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分頻後計數.