新聞中心

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

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

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

        語法: #byte id=x

        本文引用地址:http://www.104case.com/article/201611/315405.htm

        id是一個有效的C標識符;

        x是一個常數或是一個C變量;

        目的:如果id是一個已知C的變量,那么它將定位在地址x處,在這種情況下,變量類型的最初定義不會被改變.若id不是已知的C變量,則利用#byte id=x就可創建一個新的C變量,且放在地址x處,類型為整型(8位).

        主意:在兩個不同的存儲區里,x不是唯一對應這個變量(id)的地址.其它變量可能和它擁有相同的地址.實際上,當x是一個變量時,那么id和x就共享有相同的地址存儲單元.

        例子:

        #byte status=3 //定義status的地址為3

        #byte b_port=6 //定義b_port的地址為6

        struct{

        short int r_w; //定義位變量

        short int c_d; //定義位變量

        int unused :2; //保留兩位

        int data :4; //保留4位

        }a_port //將a_port定義為結構變量, r_w對應a_port.0, c_d對應a_port.1

        #byte a_port=5 //定義a_port的地址為5,即端口RA口

        a_port.c_d=1;

        例子文件: ex_glint.c

        #DEFINE

        語法: #define id text

        or

        #define id(x,y…) text

        id是一個預處理器標識符;text是任意字符文字;x,y等是被定位于預處理器中的標識符,在這中形式下,有一個或更多的標識符被逗號隔開.

        目的:利用簡單的字符來規定代替id,這個所給的字符來自于程序指針.

        在第二種形式下,原來的標識符要同text中的那個簡單的標識符相匹配,用text代替原來的標識符;

        如果text包含#idx形式的字符,那么賦值后的結果是參數id和字符x連接;

        如果text包含idx##idy形式的字符,那么參數idx就和參數idy連接形成一個新的標識符;

        例子: #define BITS 8 //用BITS代替8

        a=a+BITS; //相當于a=a+8

        #define hi(x) (x<<4) //將(x<<4) 用hi(x) 代替

        a=hi(a); //相當于a=(a<<4)

        例子文件:ex_stwt.c, ex_macro.c

        文件:ex_stwt.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) // Jumpers: 8 to 11, 7 to 12

        #endif //結束if

        #define INTS_PER_SECOND 76 // (20000000/(4*256*256)) 用INTS_PER_SECOND代替76

        BYTE seconds; //秒計數器,1秒=(4/20000000)*256*256* INTS_PER_SECOND

        BYTE int_count; // 在1秒未到之前,還要經過多少次中斷,才夠1秒;

        #int_rtcc //Timer0(RTCC)溢出, 指定下面的函數是一個中斷服務函數

        void clock_isr() { // the RTCC (timer0) overflows (255->0),For this program this is apx 76 times

        if(--int_count==0) { // per second.

        ++seconds; //1秒到, seconds加1;

        int_count=INTS_PER_SECOND; ////給int_count賦初值

        }

        }

        void main() {

        BYTE start;

        int_count=INTS_PER_SECOND; //給int_count賦初值

        set_timer0(0); //設定實時時鐘/計數器的計數初值

        setup_counters( RTCC_INTERNAL, RTCC_DIV_256 | RTCC_8_BIT);

        //設置Timer0的時鐘源為內部時鐘源

        //每隔256個脈沖,TMR0計數1次

        //在PIC18XXXX中,RTCC_8_BIT設置Timer0為8位定時器方式;

        enable_interrupts(INT_RTCC); //允許Timer0(RTCC)溢出,建立中斷標志位

        enable_interrupts(GLOBAL); //使能總中斷

        do {

        printf("Press any key to begin.nr");

        getc(); //從RS232口讀入1個字符

        start=seconds;

        printf("Press any key to stop.nr");

        getc(); //從RS232口讀入1個字符

        printf("%u seconds.nr",seconds-start);

        } while (TRUE);

        }

        上面的文件是利用Timer0采用內部指令周期作為時鐘源,再256分頻,構成1秒發生齊器.

        文件: ex_macro.c如下:

        #define BUFFERSIZE 10 //用BUFFERSIZE代替10

        #define BUFFER_EMPTY (next_in==next_out)

        //用BUFFER_EMPTY代替表達式(next_in==next_out)

        #define min(x,y) ((x

        #define max(x,y) ((x>y)?x:y) //用max(x,y)代替表達式((x>y)?x:y) ,若x>y,則返回x

        #define forever while(1); //用forever代替表達式while(1)

        #define MHZ(x) x##000000 //用MHZ(x)代替x##000000

        #ifndef __PCB__ //若沒有定義__PCB__,則執行下面的語句;

        #define NORMAL_RS232 baud=9600, xmit=PIN_C6, rcv=PIN_C7 //

        #else //若有定義__PCB__,則執行下面的語句;

        #define NORMAL_RS232 baud=9600, xmit=PIN_B1, rcv=PIN_B0

        #endif //結束if定義

        #define set_options(value) {#ASM

        MOVLW value

        OPTION

        #ENDASM}

        #define debug(x) printf("%s variable value is %drn",#x,x);

        //用debug(x)代替printf("%s variable value is %drn",#x,x);;

        #define TOSTRING(s) #s //用TOSTRING(s)代替#s

        #define DEVICE_FILE_FOR(chip) TOSTRING(chip##.h)

        #ifdef __pcb__ //若有定義__PCB__,則執行下面的語句;

        #define IDLE {if(kbhit()) isr();} //用IDLE代替{if(kbhit()) isr();}

        //若getc()讀到數據,則kbhit()返回1,否則, kbhit()返回0

        #else //若沒有定義__PCB__,則執行下面的語句;

        #define IDLE ; //用IDLE代替; ;

        #endif //結束if定義

        #include DEVICE_FILE_FOR(16C74) //包含16C74.h頭文件

        #fuses HS,NOPROTECT //HS:高速晶振/諧振器, NOPROTECT:程序存儲器代碼不保護

        #use delay(clock=MHZ(20)) //使能內置函數的功能:delay_ms()和delay_us()

        //#USE DELAY()必須在#use rs232()使用之前出現.

        #use RS232(NORMAL_RS232) //使用波特率為9600,

        //發送腳為PIN_C6

        //接收腳為PIN_C7

        //使能內置函數:GETC,PUTC和PRINTF, kbhit();

        int buffer[BUFFERSIZE]; //聲明buffer[10]數組

        int next_in, next_out; //聲明整型變量next_in和next_out

        #ifndef __pcb__ //若沒有定義__PCB__,則執行下面的語句;

        #int_rda //RS232接收到的數據有用,指定下面的函數是一個中斷函數

        #endif //結束if定義

        void isr() {

        buffer[next_in]=getc(); //從RS232口讀數據

        next_in=(next_in+1)%BUFFERSIZE; //將next_in加1后,除以10,將商賦給next_in

        }

        void main() {

        int x, largest; //聲明整型變量x和largest

        set_options(0x34); //用匯編設置option寄存器,將預分頻器留給Timer0使用

        //分頻比為1:32, Timer0的時鐘源選擇外部時鐘;

        // Timer0在下降沿遞增計數;INT腳電平下降沿觸發中斷

        //使能GPIO上拉

        #ifndef __pcb__ //若沒有定義__PCB__,則執行下面的語句;

        enable_interrupts(INT_RDA); //使能UART接收中斷

        enable_interrupts(GLOBAL); //使能總中斷

        #endif //結束if定義

        next_in=next_out=0; //初始化變量next_in 和next_out

        largest=0; //初始化變量largest

        do {

        while(BUFFER_EMPTY) //當next_in=next_out時

        IDLE; //若定義__PCB__,則用IDLE代替{if(kbhit()) isr();}

        //若getc()讀到數據,則kbhit()返回1,否則, kbhit()返回0

        //若沒有定義__PCB__,則用IDLE代替;

        x=buffer[next_out];

        next_in=(next_out+1)%BUFFERSIZE; //將next_out加1后,除以10,將商賦給next_in

        largest = max(largest,x); //求最大值

        debug(next_in); //用debug(x)代替printf("%s variable value is %drn",#x,x);;

        debug(next_out) //用debug(x)代替printf("%s variable value is %drn",#x,x);;

        } forever; //用forever代替表達式while(1)

        }上面的例子是通過UART接收10個數據,求其最大值



        關鍵詞: PIC單片機CC

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 神农架林区| 浮梁县| 桂东县| 任丘市| 右玉县| 上思县| 天镇县| 阜平县| 宜黄县| 黔江区| 亚东县| 同德县| 昌平区| 平山县| 庆安县| 当涂县| 九江市| 利辛县| 松江区| 呼玛县| 二连浩特市| 错那县| 文山县| 醴陵市| 亳州市| 武安市| 从化市| 壶关县| 安乡县| 宜春市| 合川市| 寿阳县| 长武县| 土默特左旗| 外汇| 合肥市| 天水市| 上蔡县| 京山县| 泾川县| 西乡县|