问题描述:在掉电模式下,不能唤醒,经过仿真跟踪,发现主要是在掉电模式下,不能进Timer3 中断,系统中试用12M内部RC和 32K外部晶振,LPD程序如下:
void POWER_down(void) interrupt 14 //掉电中断
{
//标志位清0
_nop_();
LPDCON &= Bin(10111111);
//首先关掉所以需要耗电的元件,降低损耗
P1|=Bin(11111100);
P3|=Bin(00001111); //先关灯
P4=Bin(11111111); //关灯关公共端
if(LPDCON&0x20) //如果是因为电压高于设定LPD值时进入中断的,即将进入正常状态
{
//io_Beep = 0;
_nop_();
Init_System(); //重新初始化
}
else
{
sysLPD = 1; //出现了低电压中断,设置电池供电标志
LPDCON = Bin(10101101); //&= 0xFB; //设置电压高于4.35产生中断
CLKCON = Bin(10001000); //D7加速,D6D5无效,D4无效,D3=1打开,D2=0选择32K
//Old_Mode = Mode;
////////////////调整LCD电压///////////////////////////
DISPCON= 0x7F; //0X68; //3V电源供电
//DISPCON=Bin(01101111); //开LCD驱动,开对比度控制,选第15段对比度
//BIT7 BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0
//DISPSEL LCDON ELCC DUTY VOL3 VOL2 VOL1 VOL0
//0LCD;1LED 1 1 0 0 0 1 1
//lcdFAMER f=12m/512/disclk =64 ;disclk=0x016e
//设置晶振为32768HZ外振,以及中断时间,其他中断,重新定义IO口
P0SS=0x00; //P0模式选择寄存器 0=IO 1=segment
//SEG1-SEG8
P1SS =0Xff;
//SEG9-SEG16
P2SS =0X03; //P2.0,P2.1为SEG
//COM1-COM8
P3SS =0XFF;
P0CR =Bin(10000000); //端口输入输出控制寄存器 0 输入 1 输出
//0.0--小功率,0.1--蜂鸣器,0.2--同步,0.3--超温,0.4--触摸,0.5--power
P0PCR =Bin(10000000); //输入端口内部上拉电阻控制 0关闭, 1开启
P0 =Bin(10000000); //端口数据寄存器
P1CR =Bin(11111111);
P1PCR =0xff;
P1 =0x00; //P1用做LCD输出SEG
P2CR =Bin(11111111);
P2PCR =Bin(11111111);
P2 =0xff; //P2.0,P2.1LCD的SEG
P3CR =0xff;
P3PCR =0xff;
P3 =0x00; //P3用做COM口
P4CR =Bin(11111111);
P4PCR =0xff;
P4 =Bin(00011111);
BANK1SEL() ;
P5CR =Bin(11111111); //注意:P5和P0地址一样,P5在BANK1,一定要加上地址设置
P5PCR =0xff;
P5 =0x00;
BANK0SEL() ;
DISPCON1 =0X00; //LCD参数,固定
DISPCLK0 =0x00; //LCD时钟控制寄存器
DISPCLK1 =0x00; //0x000=使用系统时钟
///////////////重新定义时间中断////////////////////////
EA = 0;
//定时器3代替定时器0
BANK1SEL() ;
TF3=0;
//T3CON =Bin(00000010); ////0B0000 0110 1分频
T3CON =Bin(00000000);
//BIT7 BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0
// TF3 -- T3PS.1 T3PS.0 - TR3 T3CLK.1 T3CLK.0
TL3=LOBYTE(2^16 -16384);
TH3=HIBYTE(2^16 -16384);
//IEN1 |=0x10 ;
//ET3=1;
TR3=1; //开启TIMER 3定时器
BANK0SEL() ;
EA = 1;
}
// LPDCON &= 0xEB;//清中断标志
} |