mcu_init();
while (1){
//TODO Auto-generated main function
if (!TO) {
//CLRWDT(); //clear wdt status
wdt_counter++; //if wdt reset
LED_PORT = wdt_counter;
while (1); //wait for the next wdt
}
//do something here
}
}
==============end code==========================
2.初始化里作上电检测,非上电重启时跳过初始化
3.程序流程复杂时使用状态机实现,以便立即回到唤醒前状态.
“millwood0”和 “rainyss ”请看一下我的程序,看是不是程序问题!?
/////////////////////////////////////////////////////////////////////////////////////////////////
#include <pic.h>
#define uchar unsigned char
#define Weak_up GP3 //I
#define LED GP0 //o
//__CONFIG(0x06);//内部4M晶振,代码保护开,WDT开
__CONFIG(0x02);//内部4M晶振,代码保护开,WDT 0ff
//////////////////////////////////////////////////////////////////////////////////////////////////////////
static bit POWER_flag;//开关机标记
static uchar Sleep_count;//休眠延时
//////////////////////////////////////////////////////////////////////////
////////////////////初始化程序//////////////////////////////////////////////
void Init(void)//初始化程序
{
OPTION = 0x00;//T0分频:2;上拉开,唤醒开
TRIS = 0x3E;//设置IO口方向3E:111110
CM1CON0 = 0xF7;//电压比较器关
ADCON0=0x00; //AD关
if(PD)//如果是上电复位
{
GPIO = 0x00;//输出口清零
POWER_flag=1;//开机
//LED=POWER_flag;//上电led亮
LED=1;//上电led亮
}
else//如果不是上电复位
{
if(GPWUF)//如果是电平变化唤醒
{
GPWUF = 0; //清除唤醒标志
Sleep_count=255;//休眠延时计数赋值
POWER_flag=!POWER_flag;//开关机标记取反
//LED=POWER_flag;//LED无法取反,一直亮,所以我认为无论什么复位,POWER_flag每次都被清零了
LED=!LED;//LED状态正常取反
}
}
}
void main() //主程序
{
Init(); //初始化
while (1) //主循环
{
if(Sleep_count)//进入休眠延时
Sleep_count--;
else//进入休眠
{
if(Weak_up) //进入休眠前读端口,这点很重要,否则不正常
asm("sleep"); //休眠
}
}
}
============code====================
#include <htc.h>
#include "gpio.h"
__CONFIG(MCLRDIS & WDTEN & BORDIS & PWRTEN & INTIO);
#define LED_PORT GPIO
#define LED_DDR TRISIO
#define LED_PINs 0xff
void mcu_init(void) {
ANSEL=0x00; //all pins digital
CMCON=0x07; //analog comparators off
PSA=1; //prescaller to wdt
// PS2=1, PS1=1, PS0=1; //prescaler to 1<<0b111. time-out period=18ms*128=2s
PS2=0, PS1=1, PS0=1; //prescaler to 1<<0b011. time-out period=18ms*8=160ms
IO_CLR(LED_PORT, LED_PINs); //led_pins low
IO_OUT(LED_DDR, LED_PINs);
}
void
main(void)
{
static unsigned char wdt_counter=0;
mcu_init();
while (1){
//TODO Auto-generated main function
if (!TO) {
//CLRWDT(); //clear wdt status
wdt_counter++; //if wdt reset
LED_PORT = wdt_counter;
while (1); //wait for the next wdt
}
//do something here
}
}
==============end code==========================
一周热门 更多>