PIC16F886的RA0的超低功耗唤醒有问题

2020-02-06 09:47发布

现象是这样的,我想做个实验,PIC16F886的RA0有超低功耗唤醒功能,我想用一个按键接RA0,实现:按第一次进入低功耗,按第2次低功耗唤醒,然后依次循环。RA0接的上拉电阻,按键到地;
现在可以实现进入低功耗,也可以实现低功耗唤醒。但是唤醒之后,RA0的电平似乎被锁定成低电平了,虽然外部仍然为高,但是RA0在单片机里面像怎么都改变不了了,一直为低,搞得我没办法继续下去。有谁知道是怎么回事吗?程序如下:
#include<pic.h>
#define uchar unsigned char
#define uint unsigned int
uchar n=0,time_flag=0,rb_flag=0;
uchar rb0_flag=0,rb1_flag=0,rb2_flag=0,rb3_flag=0;
uchar t_rb0,t_rb1,t_rb2,t_rb3;
uchar run,num;
uchar dis1,dis2,dis3,dis4;
uchar flag_run1=0,flag_run2,flag_run3,flag_run4;//闪烁标志
uchar flag_huanxing=0;//唤醒标志
uchar flag_2;
uchar dat;
__CONFIG(XT&WDTDIS&PWRTEN&MCLREN&UNPROTECT&DUNPROTECT&BORDIS&IESOEN&FCMEN&LVPDIS&DEBUGEN&BORV40);

void delayms(uchar x)
{
    uint y;
    for(;x>0;x--)
        for(y=100;y>0;y--);
}

void ulpwu_init()//超低功耗唤醒初始化
{

    RA0=1;
    TRISA&=0xfe;//RA0输出
    delayms(1);
    ULPWUIF=0;//超低功耗唤醒中断标志位清零
    ULPWUE=1;//超低功耗唤醒使能
    TRISA|=0x01;//RA0输入

    ULPWUIE=1;//超低功耗中断唤醒中断使能
    PEIE=1;//超低功耗中断使能的开关,要开启
    GIE=1;//总中断开启
    SLEEP();//休眠,库函数,在pic.h里
}


void io_init()
{
    ANSEL=0x00;
    TRISA|=0x01;//RA0作为数字输入
    PORTA|=0x01;

    TRISC=0x00;
    PORTC=0xf0;
   
    GIE=1;//总中断开启
}


void interrupt tmr1()
{
    if(ULPWUIF==1)//超低功耗中断唤醒标志位为1
    {
        ULPWUIF=0;//必须手动清零
        ANSEL=0x00;
        TRISA=0x01;
        PORTC=0xf0;
    }
   
}


void main()
{
    uchar i,temp;
    io_init();
    while(1)
    {
        if(RA0==0)
        {
            delayms(10);
            if(RA0==0)
            {
                while(RA0==0);
                PORTC=0xff;
                ulpwu_init();
            }   
        }

    }
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。