📄 main.c
字号:
//-----------------------------------------------------------------
// 名称: 睡眠模式及看门狗应用测试
//-----------------------------------------------------------------
// 说明: 系统启动时即进入睡眠,LED1点亮,按下S1时唤醒,LED1熄灭,
// LED2开始闪烁,看门狗溢出时间为2304ms,定时器TMR1每隔1500ms喂狗
// 如果按下S1则停止喂狗,引起系统复位.
// 由于TIMER1中断用于喂狗,且在睡眠之前启用了TIMER1中断,即使
// 不按下S1,当前TIMER1的溢出中断发生时同样会唤醒.
//
//-----------------------------------------------------------------
#include <pic.h>
__CONFIG(WDTEN & XT & UNPROTECT); //启用看门狗
#define INT8U unsigned char
#define INT16U unsigned int
#define _XTAL_FREQ 4000000UL //4MHz
//按键定义
#define KEY_DN() !RD0 //停止喂狗
//分别定义LED1开/关,LED闪烁
#define LED1_ON() RB3 = 1
#define LED1_OFF() RB3 = 0
#define LED2_OFF() RB6 = 0
#define LED2_BLINK() RB6 = ~RB6
//------------------------------------------------------------------
// 主程序
//------------------------------------------------------------------
void main()
{
TRISB0 = 1; RBPU = 0; //RB0按键输入,RB端口内部上拉
TRISB3 = TRISB6 = 0; //LED1,LED2输出引脚
TRISD0 = 1; //停止喂狗按键输入引脚
LED1_ON(); LED2_OFF(); //初始时LED1点亮,LED2关闭
}
//-----------------------------------------------------------------
// RB0/INT中断服务程序唤醒主程序继续运行,定时器1中断程序负责喂狗
//-----------------------------------------------------------------
void interrupt TMR1_AND_RB0_INT_ISR()
{
static INT8U T0_Count = 0, T1_Count = 0; //用于延时累加的变量
if (INTF) INTF = 0; //按键触发RB0/INT中断(手动唤醒)
if (TMR1IF) //TIMER1每隔1500ms喂狗
{
}
if (T0IF) //TIMER0溢出中断控制LED2正常闪烁
{
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -