PIC16F767唤不醒

2020-02-08 09:25发布

求助:程序现在PIC16F877A上试过,可以唤醒,现在写到PIC16F767中,只是改成了内部晶振,其他基本没变,就是唤不醒,求助各位PIC高手是什么原因
程序如下:

//#include <pic1687x.h>
#include <htc.h>

#define uint8 unsigned char
#define uint16 unsigned int

//__CONFIG(WDTDIS & LVPDIS & HS & PWRTDIS & BORDIS);//设置配置位
__CONFIG(WDTDIS & INTIO & PWRTDIS & BORDIS);//设置配置位
//WDTDIS:disable watchdog timer
//LVPDIS:low voltage programming disabled
//HS:high speed crystal/resonator
//PWRTDIS:disable power up timer
//BORDIS:disable brown out reset

#define                OnOff                RB6                                                        //电源开关输入,掉电唤醒
#define                KeyUp                RB5                                                        //+键,掉电唤醒
#define                KeyDown                RB4                                                        //-键,掉电唤醒
#define                KeyOk                RB0                                                        //确定键,掉电唤醒
#define                TestPort        RC4
/*******************************************************************************
* 函 数 名: DelayMS(uint16 delay)
* 函数功能: 毫秒延时        for20MHZ
* 入口参数: delay
* 返    回: 无
*******************************************************************************/

void DelayMS(uint16 delay)
{
    uint16 i;
    for(;delay>0;delay--)
        for(i=0;i<453;i++);
}

/*******************************************************************************
* 函 数 名: main()
* 函数功能: 跑马灯
*******************************************************************************/
void main()
{       
        uint16 i;
        GIE=0;                                                                                         //全局中断禁止,只执行唤醒功能
        OSCCON=0x48;                                                                        //内部 RC 振荡器频率,1M,器件使用系统主时钟OSCCON=0x4a;
       
        //外部中断INT唤醒代码
        TRISB0=1;                                                                                //设置为输入模式
        INTEDG=0;                                                                                //下降沿中断
        //INTF=0;                                                                                        //确保在有效中断发生前中断标志位0
        INT0IF=0;
        //INTE=1;                                                                                        //允许RB0/INT中断响应
        INT0IE=1;
       
        //PORTB 口“电平变化中断”初始化
        TRISB =0xf1;                                                                         //设置相应口的输入输出方式
        RBPU=0;                                                                                        //RB口弱上拉有效
        RBIF=0;                                                                                 //清除B 口电平变化中断标志
        RBIE=1;                                                                                 //B口变位中断允许
        PORTB=PORTB;                                                                         //读B 口的值,以锁存旧值,为变位中断创造条件
       
        //CCP1模块捕捉模式唤醒设置
        TRISC2=1;                                                                                //设置为输入模式
        CCP1CON=0x04;                                                                        //捕捉模式,每一个脉冲下降沿捕捉一次
       
        //CCP2模块捕捉模式唤醒设置
        TRISC1=1;                                                                                //设置为输入模式
        CCP2CON=0x04;                                                                        //捕捉模式,每一个脉冲下降沿捕捉一次
       
        PEIE = 1;                                                                                //开外设中断
       
        TRISC = 0x00;                //设置PORTD为输出
        while(1)
        {
                for(i=0;i<1000;i++)TestPort=!TestPort;
                DelayMS(100);
                //INTF=0;
                INT0IF=0;
                RBIF=0;                                                                                 //清除B 口电平变化中断标志
                //INTE=1;                                                                                        //允许RB0/INT中断响应
                INT0IE=1;
                RBIE=1;                                                                                 //B口变位中断允许
                PORTB=0x00;
                PORTB=PORTB;                                                                         //读B 口的值,以锁存旧值,为变位中断创造条件
                CCP1IF=0;
                CCP1IE=1;
                CCP2IF=0;
                CCP2IE=1;
                SLEEP();                                                                                //单片机开始进入休眠状态
                NOP();
                TRISB0=1;                                                                                //设置为输入模式
                INTEDG=0;                                                                                //下降沿中断
                if(INT0IF)
                {
                        //INTE=0;
                        //INTF=0;
                        INT0IE=0;
                        INT0IF=0;
                        PORTC=0x01;
                }
                if(RBIF)
                {
                        RBIE=0;
                        if(KeyDown==0)
                        {
                                PORTC=0x02;       
                        }
                        else if(KeyUp==0)
                        {
                                PORTC=0x04;
                        }
                        PORTB=PORTB;
                        RBIF=0;                                                                                 //清除B 口电平变化中断标志
                }
                if(CCP1IF)
                {
                        CCP1IE=0;
                        CCP1IF=0;
                        PORTC=0x08;
                }
                if(CCP2IF)
                {
                        CCP2IE=0;
                        CCP2IF=0;
                        PORTC=0x10;
                }
                DelayMS(5000);
        }       
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。