對于一般的應用,比如鍵盤,充電檢測燈,甚至一些通信,定時查詢端口狀态就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;