|
现象是这样的,我想做个实验,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();
}
}
}
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|