各位: 下午刚写了一个比较简单的小程序,本意是想在TxPort(GP1)上输出一串波形(编码格式跟红外有此类似)。 有按键按下时,唤醒MCU并输出波形,再Sleep。Sleep时,WDT也会唤醒MCU并判断键是否还被按下,若按下则再输出波形。 但现在出现当波形输出完毕后,仅100ms左右,GP1又输出波形了,这与我程序设置不符合,程序里设置看门狗唤醒的分频为1:128,应该2.3S后才会出现波形才对。 下面是完整的原程序,是我哪里欠考虑,到现在还没想出之所以然来,请各位帮帮忙,先谢过了。 #include <pic.h>
__CONFIG(MCLRDIS & WDTEN & PROTECT); #define Key GP0 #define TxPort GP1
const unsigned char IdCode[]={0xff,0xff,0xff,0xff};
void delay(unsigned char DlyCnt){ for(;DlyCnt>0;DlyCnt--){ asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); } }
void tx_head(void){ TxPort=1; delay(250); delay(250); delay(250); TxPort=0; delay(50); }
void tx_1(void){ TxPort=1; delay(150); TxPort=0; delay(50); }
void tx_0(void){ TxPort=1; delay(50); TxPort=0; delay(50); }
void delay_10ms(void){ unsigned char DlyCnt; for(DlyCnt=4;DlyCnt>0;DlyCnt--) delay(250); }
void transmit_data(){ unsigned char TxCnt,TxBitCnt,TxData; tx_head(); for(TxCnt=0;TxCnt<4;TxCnt++){ TxData=IdCode[TxCnt]; for(TxBitCnt=0;TxBitCnt<8;TxBitCnt++){ if((TxData & 0x01)==0x01) tx_1(); else tx_0(); TxData>>=1; } } }
void main(){ GPIO=0x00; TRISGPIO=0x0d; //0x09; //GP0及GP3为输入 asm("clrwdt"); OPTION=0x5f; //使能引脚电平变化 delay(100); if(!Key){ delay_10ms(); if(!Key){ asm("clrwdt"); transmit_data(); } } asm("sleep"); asm("sleep"); asm("sleep"); } |