a.循环低功耗、中断服务程序唤醒
void main()
{
关闭开门狗;
初始化时钟;
初始化端口;
初始化屏幕;
其他外围必要的初始化;
开中断;
while(1)
{
进入低功耗模式;
执行某函数;
}
}
中断函数1
{
退出低功耗;
中断服务程序;
}
例如:
View Code
#pragma vector=ADC12_VECTOR
__interrupt void ADC12ISR (void) //AD转换中断服务程序
{
static unsigned char index = 0;
LPM3_EXIT;
switch(__even_in_range(ADC12IV,34))
{
case 0: break; // Vector 0: No interrupt
case 2: break; // Vector 2: ADC overflow
case 4: break; // Vector 4: ADC timing overflow
case 6: // Vector 6: ADC12IFG0
if(index < 8)
{
results[index] = (ADC12MEM0*2.048/4096);
index++;
}
if(8==index) { index=0; }
S_judge=1;
break;
default: break;
}
}
void main()
{
WDTCTL = WDTPW + WDTHOLD;
Init_CLK() ;
LCD_Init() ;
Clear_LCD(Color_BK);
Init_Port() ;
Init_RTC();
_EINT(); //开全局中断
Init_ADC();
ADC12CTL0 |= ADC12SC; //开始AD转换
while(1)
{
LPM3;
Show_Clock();
if(S_judge==1)
{
for(int n=0;n<Num_of_Results;n++)
{
fsum+=fresults[n];
}
m=fsum/Num_of_Results;
sprintf(str,"%02.1f",m);
PutStringEN24(104,260,str);
fsum=0;
S_judge=0;
ADC12CTL0 |= ADC12SC;
}
}
b.低功耗、中断服务程序
该种结构比较简单,与第一种结构的差别在于主程序没有循环执行某函数。
void main()
{
关闭开门狗;
初始化时钟;
初始化端口;
初始化屏幕;
其他外围必要的初始化;
开全局中断;
进入低功耗;
}
中断服务程序1
{
退出低功耗;
中断服务程序;
}
c.开机设定、低功耗、中断服务程序
void main()
{
关闭开门狗;
初始化时钟;
初始化端口;
初始化屏幕、键盘;
初始化其他外围;
开全局中断;
键盘设定数据,开机初始化;
键入低功耗;
}
中断服务程序1
{
退出低功耗;
中断服务程序;
}
比如在第一种模式里加入开机设定的部分。
d.菜单按键方式
void main()
{
关闭开门狗;
初始化时钟;
初始化端口;
初始化屏幕、键盘;
初始化其他外围;
开全局中断;
while(1)
{
扫描按键;
switch(键值)
{
case...
}
更改显示;
}
}