求助:程序现在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);
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
//#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<font color="#000000">);
}
}
一周热门 更多>