在线时间0 小时
UID294147
注册时间2011-5-26
NXP金币0
该用户从未签到
新手上路

- 积分
- 187
- 最后登录
- 1970-1-1
|

楼主 |
发表于 2011-10-10 09:50:26
|
显示全部楼层
回复:MC9S08MM128如何设置停止模式的中断退出源?
附上这部分的程序设置:
//=============================================================================
//函 数 名: TOD_Init()
//功 能: TOD初始化设置
//说 明: TOD为日期更新服务,可用作ADC硬件触发源测试用
//=============================================================================
void TOD_Init(void)
{
CCSCTRL |= 0x20; //要使用外部32.768K晶振,这条指令是必须有的(CCSCTRL寄存器在第十五章中)
TODC |= 0x10; //TOD Reset 软件复位计数器
TODC = 0x01; //外部OSCOUT clock,Use for 32.768 kHz
//TODC = 0x20; //内部1 kHz
//TODM = 0x04; //匹配值设为1秒,这个要在下一条指令前
//Always configure the TODM value before setting the MTCHEN bit
//匹配1秒要设为4,不能设为1,必须要按8位写入,开发手册有误人之嫌
TODSC = 0xF0; //11110000
//TODSC = 0xF2; //11110010 Clear Quarter-Second,Second and Match Interrupt Flag,Enable quarter-second interrupts
//Match functionality is enabled
TODC |= 0x80; //TODEN=1,启动TOD
//while(TODSC_MTCHWC); //这句如果要的话只能放在启动TOD后,否则程序一直跳不过去
}
interrupt 29 void TOD_ISR (void) //TOD中断函数,TOD中断向量号是29 (从mc9s08mm64.h可以查看到)
{
unsigned char temp;
TODSC |= 0xE0; //清Quarter-Second,Second and Match Interrupt Flag
led_auto++; //按键背光延时计数标志
time_flag++; //日期时间计数标志
sys_down_count++; //系统自动关机延时计数
if (time_flag >= 4) //计数一秒
{
time_flag = 0;
if (++sec >= 60) //秒数加1后大于等于60则进位,否则退出
{
sec=0;
if (++minute >= 60) //分数加1后等于60则进位,否则退出
{
minute=0;
if (++hour >= 24) //时数加1后等于24则进位,否则退出
{
hour=0;
if (++day >= month[mon]+1) //如果日期数加1后大于本月日期数
{
if (year%4==0 && mon==2) //如果是闰年且是2月份则日期数暂时保持为29号不变(这里判断闰年的方法是有限制的)
{
if(day==month[mon]+1) return; //是2月29就跳出该程序
}
day=1; //其它月份日期数则变为1
if (++mon >= 13) //月数加1后大于12就进一位
{
mon=1;
if (++year >= 2100) //年数加1后大于2099就循环从2000开始
{
year=2000;
}
}
}//if(++day>month[mon])
}//if(++hour>=24)
}//if(++min>=60)
}//if (++sec>=60)
}
if(led_auto >= 20) //背光延时20*0.25=5秒
{
led_auto = 0;
PTGD |= BIT0; //输出高电平背光灯灭
}
if(sys_down_count >= 480) //自动关机延时480*0.25=120秒(两分钟)
{
sys_down_count = 0; //自动关机延时计数复位
sysdown_flag = 1; //低功耗模式标志置位
}
}
修改说明: 增加了红色显示那个条件,否则判断是错误的。 |
|