久久ER99热精品一区二区-久久精品99国产精品日本-久久精品免费一区二区三区-久久综合九色综合欧美狠狠

新聞中心

EEPW首頁 > 嵌入式系統 > 設計應用 > PIC單片機CCS之C語言(#BIT的用法)

PIC單片機CCS之C語言(#BIT的用法)

作者: 時間:2016-11-17 來源:網絡 收藏
#BIT

語法: #bit id=x.y

本文引用地址:http://cqxgywz.com/article/201611/315392.htm

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("rnStarting the counter.rnn");

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: %5lurn", counter);

delay_ms(1000); //延時1000ms

}

}

//上面的例子只是說明用timer0對內部時鐘源進行32分頻后計數.



關鍵詞: PIC單片機CCSBI

評論


技術專區

關閉