void init()
{
OSCCONbits.SCS = 0x2; //选择内部4M晶振
OSCCONbits.IRCF = 0xd;
OSCCON = 0b11101010;
TRISD = 0;
TRISC = 0;
TRISB = 0b00111011; //RB0,RB1,RB3,RB4,RB5输入
ANSELB = 0;
ANSELD = 0;
PORTB = 0;
LATB = 1;
LATD = 0;
LATC = 0;
}
void main()
{
init(); //相应I0口配置
OPTION_REG |= 0b0000000; //INT选择上升沿触发唤醒休眠
IOCBP = 0x1; //电平上升沿触发
IOCBN = 0x0;
INTCON |= 0b11000000; //全局中断GIE,外围PIE1使能
INTCONbits.IOCIE = 1; //电平变化中断使能
SLEEP(); //休眠
NOP(); //空
while(INT_value == 1) //中断唤醒
{........}
}
void interrupt ISR (void)
{
if(INTCONbits.IOCIF && PORTBbits.RB0 == 1) //开关机键外部中断唤醒单片机,
{
if(PORTBbits.RB0==1)//开机键按下
{
__delay_ms(50);
if(PORTBbits.RB0==1)//再次判断
{
INTCONbits.IOCIF=0;
INT_value++; //外部中断变量++
INT_value=(INT_value==1)? 1:0; //通过INT_value变量控制while()循环,开关机
}
}
}
|