- void INT0() interrupt 0 //INT0:长短按: 改边沿触发+20msT0消抖+电平检测; 理论上:按键检测用边沿触发+定时消抖最可靠;
- { //关键:短按一般0.1~0.3s,弹起很快;
- TH0=TL0=0xB8, TR0=1; //消抖: 20ms(B8实20.2),每次跳变抖动都重新计时;
- while(!TF0) ; TF0=0; //查询: 一直等TF0=1才往下执行,注意用;号;查询方式要清0; 双沿EA=0没必要;
- if(key==1) {Kc++, Kc=Kc%6;} //短按: 上升沿有效; 弹起20ms即可切换1次彩灯:6次循环; Kc=Kc%6等效if(Kc>=6) Kc=0;
- else //长按: 下降沿有效; 短按一般0.1~0.3s,超过为长按,弹起很快;
- { dl_ms( 480); // 按下0.3-0.5s仍未弹起赶紧执行长按代码(不然总体太慢);
- if(key==0) // 未弹起(再处理大白灯和待机):
- {dl_ms(1000); // 再延时1s,总1.5s;
- if(key==0) W=!W; //白灯: 长按1.5s则:白灯开/关; Kc要-1;
- dl_ms(1000); // 再延时1s,总2.5s;
- if(key==1) Kc--; // 按下1.5-2s期间已经弹起, Kc先-1;
- else //复位: 按下1.5-2s期间仍未弹起, 则准备处理复位;
- {dl_ms(500), W=!W; // 先延时0.5s,总3s;白灯闪1次再准备进复位,方便观察;效果很好!
- dl_ms(100), status=2; // 长按超3s则:复位;状态标志2(开机0/待机1/复位2); ok!很好!
- }}} //效果: 改双沿后短按迅速(之前等0.5秒), 无需开关中断防干扰;
- }
- void INT1() interrupt 2 //INT1:充电监控: 边沿触发+20msT0消抖+电平检测;主要实时唤醒掉电状态; 1212;
- { //理论: 本监控电路其实只用中断+20ms软件消抖也可靠,暂统一用边沿触发+定时消抖好了;
- TH0=TL0=0xB8, TR0=1; //消抖: 20ms(实20.2),每次跳变抖动都重新计时;
- while(!TF0) ; TF0=0; //查询: 一直等到TF0=1才往下执行,注意;号; 查询方式要清0; EA=0防干扰没必要;
- }
复制代码
|