本帖最后由 abadboy 于 2013-11-17 11:54 编辑
各位老师:我现在用C语言想实现睡眠状态下,用RB0下降沿中断和RB端口的RB3-RB0电平变化中断唤醒,控制LED指示。
今天早早起来弄了一上午,RB0下降沿中断可以唤醒MCU,但RB3-RB0端口电平变化中断始终无法唤醒MCU,查不出问题所在。
请帮忙解答,谢谢!
//***********************************************************************************/
#include<pic.h> //包含单片机内部资源预定义
__CONFIG(0x3F32); //(芯片配置字(关闭看门狗)
#define LED_PWR RD1 //将LED_BUSY宏定义为RD1端口,输出“0”灯亮
//**************************调用串口和RB中断函数*****************
void interrupt USART_PIR(void)
{
//**************************串口中断*****************
if(RCIE&&RCIF) //RCIE=1接收中断允许,RCIF=1接收中断判断是否为串口接收中断
{
TXREG=RCREG; //把接收到的数据发送回去
//while (!TRMT);//TRMT为发送移位寄存器状态位,1=空,0=满(数据未发完)
TX_UartInt();
}
//**************************RB0外部中断*****************
else if(INTF) //判断是否为RB0外部中断,注意if前需要加else
{
INTF = 0; //INTF为RB0外部中断标志位,"1"表示外部中断有发生(必须软件清零)
}
//**************************RB电平变化中断*****************
else if(RBIF) //判断是否为RB电平变化中断
{
RBIF = 0; //RBIF为RB电平变化中断标志位,"1"表示外部中断有发生(必须软件清零)
}
}
//**************************调用系统初始化设置*****************
void init () //
{
//**********配制输入端口***********************
TRISB = 0x0f; //0000_1111,配制RB0-RB3为输入
//**********配制输出端口***********************
TRISD1 = 0; // 配制RD1为输出,控制LED灯亮
//**********配制串口设置***********************
SPBRG=25; //4M晶振SPBRG值为25对应设置的波特率为9600BPS
TXSTA=0X24; //使能串口发送,选择高速波特率
RCSTA=0X90; //使能串口工作,连续接收
RCIE=0X1; //使能接收中断
GIE=0X0; //关闭全局中断,默认0关闭全局中断
PEIE=0X1; //开启外部中断,默认0关闭外部中断
INTE=1; //RB0/INT0外部中断允许位,“1”允许RB0/INT0外部中断,默认关闭
RBIE=1; //使能RB端口电平变化中断
OPTION=0X00; //选项寄存器,关闭WDT
//bit7-bit4由各PB口上拉控制位使能+RB0下降沿中断+TIMER0选择内部时钟周期+TIMER0低到高跳变递增
//选项寄存器bit3-bit0由预分频器分配给WDT(1)+二分这一分频(001)
}
/* 主程序*/
main ()
{
init (); /*初始化*/
LED_PWR = 0; delay1ms(500); LED_PWR = 1;delay1ms(10);
while(1)
{
SLEEP(); /*单片机开始进入休眠状态*/
if (INTF)
{
TX_RB0Int();INTF = 0; //串口打印中断标识RB0中断
}
else if (RBIF)
{
TX_RBChange();RBIF = 0; //串口打印中断标识RB电平变化中断
}
LED_PWR = 0; delay1ms(200); LED_PWR = 1;delay1ms(200); //LED工作闪烁指示
LED_PWR = 0; delay1ms(200); LED_PWR = 1;delay1ms(200);
LED_PWR = 0; delay1ms(200); LED_PWR = 1;delay1ms(200);
}
}
|