• halt进入休眠模式
    • 内部带隙参考电压测量电量
    1. if(on_off_key_pin==0)//右键按下,on_off_key_pin为0,因为接地
    2. {
    3. on_off_key_flag=1;
    4. on_off_count++;
    5. if(on_off_count>30)//按下这个按键,每次进入循环on_off_count会+1;on_off_count>30次,则表示长按
    6. {
    7. on_off_count=30;
    8. on_off_long_edge=1;//长按标志位置1
    9. sleep_f=1;//表示要关机(我要求的长按关机)
    10. on_off_key_flag=0;
    11. }
    12. }
    13. else
    14. {
    15. on_off_count=0;
    16. if(on_off_key_flag==1)//如果之前按下过,on_off_key_flag会置1,再抬起到这里
    17. {
    18. on_off_key_edge=1;//右键抬起,短按标志位置1
    19. //--------------下面是双击的代码---------
    20. key_press_loop++;
    21. //-----------下面是双击的程序-------------
    22. /*
    23. 双击的思路就是:第一次按下后,开始利用中断计数,在规定的时间内 再按下一次 表明双击;
    24. 如果在按下一次后,规定的时间内没有再次按下,表明单次短按
    25. */
    26. if(first_flag==0)//第一次按下的标志位
    27. {
    28. first_flag=1;
    29. key_flash_loop=0;//规定时间的计数器
    30. key_press_loop++;//按下的次数
    31. }
    32. else
    33. {
    34. if(key_flash_loop<8) //如果在规定时间内
    35. {
    36. if(key_press_loop>1)//按下2次
    37. {
    38. Double_click_edge=1;//双击的标志位
    39. first_flag=0;
    40. key_press_loop=0;
    41. key_flash_loop=0;
    42. }
    43. }
    44. else//这里可以去掉
    45. {
    46. }
    47. }
    48. on_off_key_flag=0;
    49. }
    50. }

    csdn上的一个源码

    • BS86D20芯片
      • halt进入暂停状态时会被看门狗复位唤醒
      • 需要在程序入口判断以二次halt进入暂停状态
    1. #include "bs86d20a-3.h"
    2. void main()
    3. {
    4. if(_to && _pdf) //看门狗复位
    5. {
    6. _halt();
    7. goto wakeup_label;
    8. }
    9. else
    10. {
    11. //system_init();
    12. }
    13. while(1)
    14. {
    15. //...
    16. if(en_halt)
    17. {
    18. halt_prepare();
    19. _halt();
    20. wakeup_label:
    21. _nop();
    22. _nop();
    23. wakeup_prepare();
    24. }
    25. //....
    26. }
    27. }