对于一般的应用,比如键盘,充电检测灯,甚至一些通信,定时查询端口状态就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,QQ:85547259*/