應廣微控制器-外部中斷demo

深圳市泛海微電子公司部落格發表於2020-12-15

     對於一般的應用,比如鍵盤,充電檢測燈,甚至一些通訊,定時查詢埠狀態就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;

    }


    popaf;
}
/*edit by zhongvv

相關文章