新聞中心

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

        PIC單片機CCS之C語言(#INT_XXXX的應用)

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

        語法: #INT_AD //AD轉換完成

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

        #INT_ADOF //AD轉換時間溢出

        #INT_BUSCOL //總線沖突

        #INT_BUTTON //按鈕

        #INT_CCP1 //捕獲或比較器1

        #INT_CCP2 //捕獲或比較器1

        #INT_COMP //比較器探測

        #INT_EEPROM //EEPROM寫完成

        #INT_EXT //外部中斷

        #INT_EXT1 //外部中斷1

        #INT_EXT2 //外部中斷2

        #INT_I2C //I2C中斷(只用于14000)

        #INT_LCD //LCD行動

        #INT_LOWVOLT //低電壓探測

        #INT_PSP //并行端口PSP數據輸入

        #INT_RB //端口B在B4~B7的電平變化

        #INT_RC //端口C在C4~C7的電平變化

        #INT_RDA //RS232接收到的數據有用, 使能UART接收中斷

        #INT_RTCC //Timer0(RTCC)溢出

        #INT_SSP //SPI口或I2C被激活

        #INT_TBE //RS232發送緩沖區是空的

        #INT_TIMER0 //Timer0(RTCC)溢出

        #INT_TIMER1 //Timer1溢出

        #INT_TIMER2 //Timer2溢出

        #INT_TIMER3 //Timer3溢出

        注意:大多數#INT_options在指定的芯片上是有用的. 在devices.h文件中,檢查所給芯片的全部列表.

        目的:這些指令指定下面的函數是一個中斷服務函數,中斷函數可以沒有任何參數.不是所有指令都可用于所有的元件,為了獲得元件的有效中斷,請參閱devices.h文件或在PCW中,點擊VIEW|Valid ints也可查得有哪些中斷.

        當中斷被檢測到時,編譯器將產生代碼跳到中斷服務函數.它將產生代碼來存儲或重新存儲機器狀態,并且清除中斷標志位.為了防止標志位被清除,請在#INT_XXXX后面添加NOCLEAR語句即可.

        ENABLE_INTERRUPTS(INT_XXXX)在中斷前初始化時要被激活,并且ENABLE_INTERRTUPTS(GLOBAL)也要使能中斷,才可進入中斷.

        關鍵字HIGH和FAST可用于PCH編譯中,用來標志高中斷優先權.一個高優先權的中斷可在另一中斷正在進行的情況下產生中斷.一個標有FAST中斷在執行時,它不存儲或重新存儲任何寄存器,這就要你盡可能地存儲你自己需要的存儲器.標有HIGH的中斷能夠正常使用.在建立高優先權中斷時,請參閱#DEVICE以獲取更多的信息.

        例子:#int_ad

        adc_handler(){

        adc_active=FALSE;

        }

        #int_rtcc noclear

        isr(){

        }

        例子文件:參閱ex_sisr.c和ex_stwt.c以獲取完全的例子

        文件: ex_stwt.c在前面已經介紹過了,這里不再重述

        文件: ex_sisr.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, kbhit();

        #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 BUFFER_SIZE 32 //用BUFFER_SIZE代替32

        BYTE buffer[BUFFER_SIZE]; //聲明字符型數組buffer[BUFFER_SIZE]

        BYTE next_in = 0; //聲明字符型變量next_in,并賦初值為0

        BYTE next_out = 0; //聲明字符型變量next_out,并賦初值為0

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

        void serial_isr() {

        int t; //聲明整型變量t;

        buffer[next_in]=getc(); //從RS232接口讀1個字節,存到數阻buffer[]中

        t=next_in; //將next_in賦給暫態變量t

        next_in=(next_in+1) % BUFFER_SIZE; //%用來求余數

        if(next_in==next_out)

        next_in=t; // Buffer full !!

        }

        #define bkbhit (next_in!=next_out) //用bkbhit代替表達式(next_in!=next_out);

        BYTE bgetc() {

        BYTE c; //聲明字符型變量c;

        while(!bkbhit) ; //當next_in=next_out時,空操作,等待next_in不等于next_out

        c=buffer[next_out];

        next_out=(next_out+1) % BUFFER_SIZE; //%用來求余數

        return(c); //函數返回暫態變量c的值,并退出該函數

        }

        void main() {

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

        enable_interrupts(int_rda); //使能UART在接收到1個字節時,中斷允許

        printf("rnRunning...rn");

        // The program will delay for 10 seconds and then display

        // any data that came in during the 10 second delay

        do {

        delay_ms(10000); //延時10秒

        printf("rnBuffered data => ");

        while(bkbhit) //當接收緩沖區沒有滿,則執行下面語句

        putc( bgetc() ); //將接收到的數據再通過UART發送出去顯示

        } while (TRUE);

        }

        上面的例子主要介紹UART接收中斷的設計,將接收到的數據及時送去顯示.



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 利辛县| 陈巴尔虎旗| 拉萨市| 高邑县| 涞源县| 井冈山市| 哈巴河县| 新乐市| 昌图县| 池州市| 商都县| 松阳县| 桐城市| 穆棱市| 福清市| 奈曼旗| 甘谷县| 郑州市| 长子县| 色达县| 高邮市| 泽普县| 神农架林区| 蓝山县| 达拉特旗| 汕尾市| 清苑县| 永新县| 开江县| 棋牌| 鄂伦春自治旗| 中超| 武强县| 哈尔滨市| 廉江市| 靖边县| 共和县| 芒康县| 佛山市| 宜阳县| 正安县|