找回密码
 立即注册
查看: 138|回复: 0

休眠后会自己被唤醒

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:159
  • 最近打卡:2026-05-10 13:08:11
已绑定手机

35

主题

124

回帖

373

积分

中级会员

积分
373
发表于 2025-11-25 10:38:07 | 显示全部楼层 |阅读模式
  1. // TT-002  休眠后自己被唤醒
  2. #include "STC8Hxxx.h"
  3. // 引脚定义
  4. sbit Battery_voltage_ADC = P1^0;
  5. sbit Motor_voltage_ADC   = P1^1;
  6. sbit motor_switch        = P1^3;
  7. sbit PWMB_Signal         = P5^4;
  8. sbit TK          = P3^7;
  9. sbit LEDR        = P3^6;
  10. sbit LEDG        = P3^5;
  11. sbit LEDB        = P3^4;
  12. sbit sheet_switch = P3^3;
  13. sbit base        = P3^2;
  14. sbit charge_switch = P3^1;
  15. sbit Sheet_Current_ADC = P3^0;
  16. // 宏定义
  17. #define MAIN_Fosc        30000000L
  18. // 全局变量
  19. u16 xdata TK_cnt[16];
  20. u16 xdata TK_zero[16];
  21. u16 code T_KeyPress[16] = {1300,2000,900,800,900,1000,1100,1400,1000,1200,900,1200,750,900,1300,10000};
  22. u16 code T_KeyState[16] = {0x0001,0x0002,0x0004,0x0008,0x0010,0x0020,0x0040,0x0080,
  23.                            0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x8000};
  24. bit  B_TK_Lowpass = 0;
  25. bit  Wakeup_FirstScan = 0;     
  26. u8 ch;
  27. u8   read_cnt = 0;
  28. u8   i;
  29. u16  KeyState = 0;
  30. // 延时函数
  31. void delay_ms(u8 ms)
  32. {
  33.     u16 i;
  34.     do { i = MAIN_Fosc / 10000; while(--i); } while(--ms);
  35. }
  36. // 触摸初始化(仅上电时用)
  37. void TK_Init(void)
  38. {
  39.     TSCHEN1 = 0x00;
  40.     TSCHEN2 = 0x80;
  41.     TSCFG1  = (7<<4) + 6;
  42.     TSCFG2  = 1;
  43.     TSRT    = 0x00;
  44.     TSWUTC  = 255;
  45.     IE2    |= 0x80;
  46.     IRC32KCR = 0x80;
  47.     while(!(IRC32KCR & 1));
  48.     delay_ms(50);
  49.     B_TK_Lowpass = 0;
  50.     for(read_cnt=0; read_cnt<10; read_cnt++)
  51.     {
  52.         TSCTRL = (1<<7) + (1<<6);
  53.         delay_ms(50);
  54.     }
  55.     for(i=0; i<16; i++) TK_zero[i] = TK_cnt[i];
  56.     B_TK_Lowpass = 1;
  57.     KeyState = 0;
  58.     TSTH15 = TK_zero[15] - T_KeyPress[15]/2;
  59. }
  60. // Timer0 初始化
  61. void Timer0_Init(void)
  62. {
  63.     AUXR &= 0x7F;
  64.     TMOD &= 0xF0;
  65.         TL0 = 0x2C;                                //设置定时初始值
  66.         TH0 = 0xCF;                                //设置定时初始值
  67.     TF0 = 0;
  68.     TR0 = 1;
  69.     ET0 = 1;
  70. }
  71. // 唤醒
  72. void IO_Wakeup(void)
  73. {
  74.     _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
  75.     TSCTRL = (1<<7) + (1<<3) + (1<<2);   // 重开触摸模块
  76.     P3M0 = 0x7a; P3M1 = 0x85; P3IE = 0x04;
  77.     P5M0 |= 0x10; P5M1 &= ~0x10; P5IE &= ~0x10;
  78.     P1M0 = (P1M0 & ~0x03) | 0x08;
  79.     P1M1 = (P1M1 & ~0x08) | 0x03; P1IE &= ~0x0b;
  80.     motor_switch = 0;
  81.     sheet_switch = 0;
  82.     PWMB_Signal  = 0;
  83.     charge_switch = 0;
  84.     LEDR = 0; LEDB = 0;          // 蓝灯灭,表示已唤醒
  85.    
  86.     for(i=0; i<16; i++) TK_zero[i] += 300;
  87.     B_TK_Lowpass = 1;
  88.     Wakeup_FirstScan = 1;
  89.     KeyState = 0;
  90. }
  91. // 进入休眠
  92. void IO_Sleep(void)
  93. {
  94.     P5M0 &= ~0x10; P5M1 |= 0x10;
  95.     P1M0 &= ~0x0b; P1M1 |= 0x0b;
  96.     P3M0 = 0x00;   P3M1 = 0xff;
  97.     TSCTRL = (1<<3) + (1<<2);
  98. }
  99. // 主函数
  100. void main(void)
  101. {
  102.     P_SW2 |= 0x80;
  103.     EA = 1;
  104.     charge_switch = 0; sheet_switch = 0;
  105.     LEDR = 1; LEDG = 0; LEDB = 1;
  106.     motor_switch = 0; PWMB_Signal = 0;
  107.     P3M0 = 0x7a; P3M1 = 0x85; P3IE = 0x04;
  108.     P5M0 |= 0x10; P5M1 &= ~0x10; P5IE &= ~0x10;
  109.     P1M0 = (P1M0 & ~0x03) | 0x08;
  110.     P1M1 = (P1M1 & ~0x08) | 0x03; P1IE &= ~0x0b;
  111.     IRCDB = 0x10;
  112.     IAP_TPS = 0x30;
  113.     TK_Init();
  114.     Timer0_Init();
  115.     IO_Sleep();
  116.     PCON |= 0x02;        // 进入Power-down
  117.     IO_Wakeup();         // 触摸唤醒后从这里继续
  118.     while(1)
  119.     {
  120.         if(KeyState & 0x8000)   LEDG = 1;                                                                  // K15按下(含长按)时灯常亮
  121.         else                    LEDG = 0;                                                                  // 释放时灯灭
  122.     }
  123. }
  124. // 触摸中断服务
  125. void TKSU_ISR(void) interrupt TKSU_VECTOR
  126. {
  127.     if(TSSTA2 & 0x40) TSSTA2 |= 0x40;
  128.     if(TSSTA2 & 0x80)
  129.     {
  130.         TSSTA2 |= 0x80;
  131.         ch = TSSTA1 & 0x0F;              
  132.         if(!B_TK_Lowpass) TK_cnt[ch] = TSDAT;
  133.         else              TK_cnt[ch] = (TK_cnt[ch] >> 1) + (TSDAT >> 1);
  134.     }
  135. }
  136. // Timer0 中断(5ms)
  137. void Timer0_Isr(void) interrupt 1
  138. {
  139.     TSCTRL = (1<<7) + (1<<6);    // 触发下一次扫描
  140.     if(Wakeup_FirstScan)
  141.     {
  142.         Wakeup_FirstScan = 0;
  143.         
  144.         for(i=0; i<16; i++) TK_zero[i] = TK_cnt[i] + 80;
  145.         TSTH15 = TK_zero[15] - T_KeyPress[15]/2;
  146.         return;
  147.     }
  148.     if(++read_cnt >= 3)
  149.     {
  150.         read_cnt = 0;
  151.         for(i=0; i<16; i++)
  152.         {
  153.             if(TK_zero[i] > TK_cnt[i])
  154.             {
  155.                 if((TK_zero[i] - TK_cnt[i]) >= T_KeyPress[i]/4)
  156.                     KeyState |=  T_KeyState[i];
  157.                 else if((TK_zero[i] - TK_cnt[i]) <= T_KeyPress[i]/8)
  158.                     KeyState &= ~T_KeyState[i];
  159.             }
  160.             else
  161.             {
  162.                 KeyState &= ~T_KeyState[i];
  163.                 if((TK_cnt[i] - TK_zero[i]) > 100) TK_zero[i] += 100;
  164.                 else                               TK_zero[i] += 10;
  165.             }
  166.         }
  167.     }
  168. }
复制代码
用的STC8H1K17T


之前的触摸按键长按虽然可以用了
但是发现一个方便的方案把原有的
  1.             if(TK_zero[i] > TK_cnt[i])
  2.             {
  3.                 if((TK_zero[i] - TK_cnt[i]) >= T_KeyPress[i]/4)
  4.                     KeyState |=  T_KeyState[i];
  5.                 else if((TK_zero[i] - TK_cnt[i]) <= T_KeyPress[i]/8)
  6.                     KeyState &= ~T_KeyState[i];
  7.             }
复制代码
原先是/2 /3 通过修改为/4 /8 且屏蔽TK_zero--;以后 可以做到长按-即使长时间触摸仍然是正常的
但是随之移植到程序中出现一个问题,查询了规格书,STOP模式只能被中断或者触摸唤醒
但是实际的过程中当我看到指示灯亮起后 熄灭进入休眠模式 设备竟然能够自己唤醒 换设备 换芯片 仍然会有这个问题 怀疑是程序中某项配置的问题
但是对比了以往的休眠方式是一致的
即使有问题 STOP模式应该也无法自动唤醒才对

用回以前休眠的程序却能解决问题 是不是触摸的配置不能这么修改呢
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-5-10 23:22 , Processed in 0.099476 second(s), 42 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表