进入睡眠模式,手册上说会暂停数码管和键盘扫描,但是我这个数码管还亮着。。。 睡眠模式命令是:0x4402吧?
在休眠之前,先关闭显示,然后再发睡眠命。
呃,调了好久发现问题了。。 我是用键盘某个按键设定为睡眠功能。按下键之后,通过中断方式读取按键编码,若与睡眠键编码相等则发送睡眠命令。在线调试的时候能正常睡眠,但是给板子上电跑的时候不行,然后我再给454发送睡眠命令之前延时大于450ms,就能正常睡眠了。 是不是在两次对454的读和写之间必须要有一个比较大的时间~~
这个倒是没有特别的要求!如果可以,你程序贴出来给我看一下!
void interrupt VectorNumber_Vtimch2 Timer2(void) { EnableInterrupts; DISABLE_KEY_INTERRUPT; CLEAR_KEY_INTER_FLAG; Key_Code =CH454GetKey(); DISABLE_KEY_INTERRUPT;//因在CH454Stop函数结束时开启了中断,所以此时中断函数尚未结束,需关闭 //以下根据实际需要修改功能【【【【【【【【【【【【【【【【【【【 #ifdef DEBUG switch(Key_Code){ case 0x58:Key_Code =0x01; break; case 0x59:Key_Code =0x02; break; case 0x5a:Key_Code =0x03; break; case 0x50:Key_Code =0x04; break; case 0x51:Key_Code =0x05; break; case 0x52:Key_Code =0x06; break; case 0x48:Key_Code =0x07; break; case 0x49:Key_Code =0x08; break; case 0x4a:Key_Code =0x09; break; case 0x5b:Key_Code =0x00; break; case 0x40:{ if(CH454_Temp_Flag !=CH454_NULL){//说明上一次输入参数后并未按确认键 CH454_Buffer =0; } CH454_Temp_Flag =CH454_KP; Key_Code =CH454_NULL; Dial_Times |=(KP_LEN |0x80); }break; case 0x41:{ if(CH454_Temp_Flag !=CH454_NULL){//说明上一次输入参数后并未按确认键 CH454_Buffer =0; } CH454_Temp_Flag =CH454_KI; Key_Code =CH454_NULL; Dial_Times |=(KI_LEN |0x80); }break; case 0x42:{ if(CH454_Temp_Flag !=CH454_NULL){//说明上一次输入参数后并未按确认键 CH454_Buffer =0; } CH454_Temp_Flag =CH454_KD; Key_Code =CH454_NULL; Dial_Times |=(KD_LEN |0x80); }break; case 0x4b:{ if(CH454_Temp_Flag !=CH454_NULL){//说明上一次输入参数后并未按确认键 CH454_Buffer =0; } CH454_Temp_Flag =CH454_SPEED; Key_Code =CH454_NULL; Dial_Times |=(SPEED_LEN |0x80); }break; case 0x53:{//确认键 //进行赋值操作 if((Dial_Times ==0x80) &&(CH454_Temp_Flag !=CH454_NULL)){ PORTB =CH454_Buffer; CH454_Temp_Flag =CH454_NULL; CH454_Buffer =0; } Key_Code =CH454_NULL; }break;
case 0x43:{//用作使键盘模块处于休眠状态或唤醒 if((Dial_Times ==0x80) &&(CH454_Temp_Flag ==CH454_NULL)){//参数输入完毕,并且按了确认键 DelayMs(10000); //必须加延时,否则CH454将不能进入睡眠模式!!!!! Dial_Times &=0x7f; Key_Code =CH454_NULL; CH454Write(CH454_SLEEP); } }break; default: { CH454_Buffer =0; CH454_Temp_Flag =CH454_NULL; Key_Code =CH454_FAULT; } }
if((Dial_Times >0x80) &&(Key_Code !=CH454_NULL) &&(CH454_Temp_Flag !=CH454_NULL)){ CH454_Buffer +=Key_Code; if(Dial_Times >0x81){ CH454_Buffer =((CH454_Buffer <<3) +(CH454_Buffer <<1)); } Dial_Times--; } #endif
ENABLE_KEY_INTERRUPT; } #pragma CODE_SEG DEFAULT
最开始我把这些功能语句放在一个单独的函数中,如果按下设定为睡眠模式的键,只要450ms就能使454睡眠,但是放到中断函数中之后,需要10s才能进入睡眠了。