天天看點

應廣單片機-外部中斷demo

     對于一般的應用,比如鍵盤,充電檢測燈,甚至一些通信,定時查詢端口狀态就OK了,但是一些特殊應用,特别是通信類的。最好還是用中斷,那不多說,上代碼。歡迎探讨和交流!

#include    "extern.h"

#define DISABLE 0

#define ENABLE 1

#define     HIGH    1

#define  LOW    0

#define DISABLE 0

#define ENABLE 1

#define EMPTY 0

#define FULL 1

#define ON 1

#define OFF 0

 BIT     RX                :PA.0;

BYTE  BitVal1;

BIT bMsFlag         :BitVal1.2;          /*曆史狀态*/

/*系統變量*/

Word usTmrCnt;

byte usPwmCnt;

//word ucCmd;

void Tmr16InterInit ( void )

{

    usTmrCnt=0;

    $ T16M    IHRC, /1,BIT10

    INTEN.T16 =1;/*開啟定時中斷*/

    Intrq.T16 =0;/*清除中斷請求*/

    ENGINT //全局中斷開啟

}

void ExtIntInit(void)

    /*PA0 中斷,使能*/

    INTEN.0=1;

    /*下降緣中斷

    b7:5@00=保留

    b4@1=T16下降沿請求中斷?;0=T16上升沿請求中斷

    b3:2@00=PB0/PA4上升沿,下降遠均請求中斷,01=上升沿,10=下降沿;11=保留

    b1:0@00=PA0/PB5上升沿,下降遠均請求中斷,01=上升沿,10=下降沿;11=保留

    */

    integs=0x00;

    /*清除PA0/PB5中斷标記*/

    Intrq.0=0;

}

void    GpioInit (void)

{    

    $ RX   In,pull;

}

void    FPPA0 (void)

{

    .ADJUST_IC    SYSCLK=IHRC/8, IHRC=16MHz, VDD=3V;

    $ CLKMD IHRC/8,En_IHRC,En_ILRC,En_WatchDog;

    byte temp;

    .delay  25*2000;

    GpioInit();

    ExtIntInit();

    Tmr16InterInit();

    while (1)

    {

        wdreset;

        if(bMsFlag)

        {

            bMsFlag=0;

        }

    }

}

void    Interrupt (void)

{

    pushaf;

    if (Intrq.T16)

    {    

         stt16 usTmrCnt;

        Intrq.T16    =    0;

        /*1ms 計數*/

       usPwmCnt++;

       if(usPwmCnt>16)

       {

              usPwmCnt=0;

           bMsFlag=1;

       }

    }

    /*下降沿中斷*/

    if ( Intrq.0 )  

    {

        /*清除中斷标記,這裡設定斷點,切換RX狀态就行*/

        Intrq.0=0;