各位前辈:我用PIC型号为16F877A,想实现单片机进入睡眠后,中断来了,LED灯亮的功能。我建了RB0下降沿和RB4电平变化中断,在中断里面自定义了两位变量标志,有中断响应时,一直调不了这两个标志(中断有效时,将标志位B_Rb0Int 为 1或 B_Rb4Change 为 1,点亮LED),请帮忙看一下哪里有问题,在此谢过啦!
代码如下:
//***********************************************************************************/
#include<pic.h> //包含单片机内部资源预定义
__CONFIG(0x3F32); //(芯片配置字(关闭看门狗)
#define LED_PWR RD1 //将LED_BUSY宏定义为RD1端口,输出“0”灯亮
bit B_Rb0Int; //自定义RB0中断有效变量标志
bit B_Rb4Change; //自定义RB4中断有效变量标志
//**************************调用初始化设置*****************
void init () //所有没有用到的IO口,都需要设置为输出“0”,否则会吸收信号干扰耗电
{
TRISB = 0x11; //0001_0001 ,RB4、RB0为输入,其他为输出
INTE=1; //RB0/INT0外部中断允许位,“1”允许RB0/INT0外部中断,默认关闭
OPTION=0X00; //选项寄存器,关闭开启WDT
RBIE = 1; //使能RB端口电平变化中断
INTF = 0;RBIF = 0; //清零RB0外部中断和RB7-RB4电平变化中断标志位
}
//**************************调用中断函数*****************
void interrupt USART_PIR(void) //中断函数
{
//**************************RB0外部中断*****************
if(INTF)
{
INTF = 0; //清零RB0外部中断标志位
B_Rb0Int = 1; //B_Rb0Int有效变量标志置1
}
//**************************RB7-4电平变化中断*****************
else if(RBIF) //判断是否为RB4电平变化中断
{
RBIF = 0; //清零
delay1ms(1500); //延时防抖
if (RB4 == 1)
{
RB4 = RB4; // 读RB4端口的值,
B_Rb4Change = 1;
}
else
{
B_Rb4Change = 0; //B_Rb4Change有效变量标志置0
}
}
}
//********************主函数***********************
void main()
{
init (); //调用端口配制初始化
while(1)
{
if (B_Rb0Int || B_Rb4Change)
{
LED_PWR = 0; //中断有效时,LED亮
delay1ms(1500); LED_PWR = 1;
B_Rb0Int = 0; INTF = 0; //清零
B_Rb4Change = 0; RBIF = 0; //清零
}
SLEEP();
}
} |