电源开关休眠和唤醒:
#include "msp430x42x.h"
char TimeCount=0; //闪烁计时
char BT_IntervalFlag; //定时中断全局变量标志
void main( void )
{
DTCTL=WDTPW+WDTHOLD; //停止看门狗
FLL_CTL0|=XCAP18PF; //配置晶振负载电容
P1DIR |= BIT0+BIT1+BIT2+BIT3+BIT4;
P2DIR |= BIT0+BIT1+BIT2+BIT3; //悬空不用的IO口要置为输出
P1OUT = 0; //否则不确定电平会造成IO耗电
P2OUT = 0;
BTCTL = BT_ADLY_125; //BasicTimer时钟选为ACLK,设为125ms中断一次
IE2 |= BTIE; // 允许BasicTimer中断
P1IES |= BIT6; // P1.6下降沿触发中断
P1IE |= BIT6; // 允许P1.6中断
_EINT(); // 总中断允许
while(1) // 主循环
{ BT_IntervalFlag=0;
while(BT_IntervalFlag==0) LPM3;
//休眠,仅留ACLK,仅能被被BasicTimer唤醒。以下代码将每1/8秒执行一次。
TimeCount++; //计数
if(TimeCount>=4) TimeCount=0; //产生0~3计数(0.5秒)
if(TimeCount==0) P2OUT |= BIT0; //亮125ms
else P2OUT &=~BIT0; //灭375ms
if((P1IN & BIT5)==0) //若KEY1被按下
{
P2OUT &=~ BIT0; //关闭LED
P1IFG &=~ BIT5; //清除P1.5中断标志
LPM4; //关机
}
}
}
#pragma vector = BASICTIMER_VECTOR // BasicTimer定时器中断
__interrupt void BT_ISR(void) // 声明一个中断服务程序,名为BT_ISR()
{
BT_IntervalFlag=1;
__low_power_mode_off_on_exit(); //退出中断时唤醒CPU。
}
#pragma vector = PORT1_VECTOR //P1口中断源
__interrupt void P1_ISR(void) //声明一个中断服务程序,名为P1_ISR()
{
P1IFG=0;
__low_power_mode_off_on_exit(); //退出中断时唤醒CPU。
}
复制代码
电源开关复位:
#include "msp430x42x.h"
char TimeCount=0; //闪烁计时
__no_init char PWR_Flag; //电源标志
void main( void )
{
WDTCTL=WDTPW+WDTHOLD; //停止看门狗
FLL_CTL0|=XCAP18PF; //配置晶振负载电容
P1DIR |= BIT0+BIT1+BIT2+BIT3+BIT4;
P2DIR |= BIT0+BIT1+BIT2+BIT3; //悬空不用的IO口要置为输出
P1OUT = 0; //否则不确定电平会造成IO耗电
P2OUT = 0;
BTCTL = BT_ADLY_125; //BasicTimer时钟选为ACLK,设为125ms中断一次
IE2 |= BTIE; // 允许BasicTimer中断
_EINT(); // 总中断允许
if(PWR_Flag ==0) PWR_Flag=1; // 电源标志每次复位后取反
else PWR_Flag=0;
if(PWR_Flag ==0) LPM4; //电源标志为0时关机
//--------------电源标志为1时才执行主循环--------------------------
while(1) // 主循环
{
LPM3; //休眠,仅留ACLK,以下代码将每1/8秒执行一次。
TimeCount++; //计数
if(TimeCount>=4) TimeCount=0; //产生0~3计数(0.5秒)
if(TimeCount==0) P2OUT |= BIT0; //亮125ms
else P2OUT &=~BIT0; //灭375ms
}
}
#pragma vector = BASICTIMER_VECTOR // BasicTimer定时器中断
__interrupt void BT_ISR(void) // 声明一个中断服务程序,名为BT_ISR()
{
__low_power_mode_off_on_exit(); //退出中断时唤醒CPU。
}
|