- halt进入休眠模式
- 内部带隙参考电压测量电量
if(on_off_key_pin==0)//右键按下,on_off_key_pin为0,因为接地
{
on_off_key_flag=1;
on_off_count++;
if(on_off_count>30)//按下这个按键,每次进入循环on_off_count会+1;on_off_count>30次,则表示长按
{
on_off_count=30;
on_off_long_edge=1;//长按标志位置1
sleep_f=1;//表示要关机(我要求的长按关机)
on_off_key_flag=0;
}
}
else
{
on_off_count=0;
if(on_off_key_flag==1)//如果之前按下过,on_off_key_flag会置1,再抬起到这里
{
on_off_key_edge=1;//右键抬起,短按标志位置1
//--------------下面是双击的代码---------
key_press_loop++;
//-----------下面是双击的程序-------------
/*
双击的思路就是:第一次按下后,开始利用中断计数,在规定的时间内 再按下一次 表明双击;
如果在按下一次后,规定的时间内没有再次按下,表明单次短按
*/
if(first_flag==0)//第一次按下的标志位
{
first_flag=1;
key_flash_loop=0;//规定时间的计数器
key_press_loop++;//按下的次数
}
else
{
if(key_flash_loop<8) //如果在规定时间内
{
if(key_press_loop>1)//按下2次
{
Double_click_edge=1;//双击的标志位
first_flag=0;
key_press_loop=0;
key_flash_loop=0;
}
}
else//这里可以去掉
{
}
}
on_off_key_flag=0;
}
}
csdn上的一个源码
- BS86D20芯片
- halt进入暂停状态时会被看门狗复位唤醒
- 需要在程序入口判断以二次halt进入暂停状态
#include "bs86d20a-3.h"
void main()
{
if(_to && _pdf) //看门狗复位
{
_halt();
goto wakeup_label;
}
else
{
//system_init();
}
while(1)
{
//...
if(en_halt)
{
halt_prepare();
_halt();
wakeup_label:
_nop();
_nop();
wakeup_prepare();
}
//....
}
}