找回密码
 立即注册
查看: 24|回复: 2

参考了触摸按键唤醒的案例,但是测量的时候没有唤醒

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:39
  • 最近打卡:2025-11-08 23:50:14
已绑定手机

22

主题

77

回帖

257

积分

中级会员

积分
257
发表于 前天 15:42 | 显示全部楼层 |阅读模式
  1. // 触摸按键唤醒
  2. #define MAIN_Fosc                24000000L        //定义主时钟  串口波特率 300 ~ 4800
  3. #include        "STC8Hxxx.h"
  4. sbit        P_K15_LED = P5^4;
  5. u16        xdata TK_cnt[16];        // 按键计数值, 16位
  6. u16        xdata TK_zero[16];        // 按键0点值, 16位
  7. u16        KeyState;                        // 按键状态, 每个bit对应一个键, 1为按下, 0为释放
  8. u8        WakeUpkey;
  9. bit        B_KeyPress;
  10. void          delay_ms(u8 ms);
  11. //                         K0     K1     K2     K3     K4     K5      K6    K7     K8     K9     K10   K11    K12    K13    K14    K15
  12. u16 code T_KeyPress[16]={ 1300,  2000,  900,   800,   900,   1000,   1100, 1400,  1000,  1200,   900,  1200,  750,   900,   1300,  1800};        //触摸后的变化值
  13. void main(void)
  14. {
  15.         u8        i;
  16.         P_SW2 |= 0x80;                //允许访问扩展寄存器xsfr
  17.         EA = 1;                                //允许全局中断
  18.         P_K15_LED = 0;
  19.     P1M0 &= ~0x0b; P1M1 |= 0x0b;
  20.         P3M0 = 0x00; P3M1 = 0xff;
  21.         P5M0 |= 0x10; P5M1 &= ~0x10;
  22.         P1IE &= ~0x0b;
  23.         P3IE = 0x00;
  24.         P5IE &= ~0x10;
  25.         TSCHEN1 = 0x00;                //TK0~TK7
  26.         TSCHEN2 = 0x80;                //TK8~TK15
  27.         TSCFG1  = (7<<4) + 6;        //B6~B4:开关电容工作频率 = fosc/(2*(TSCFG1[6:4]+1)), B2~B0:放电时间(系统时钟周期数) 0(125) 1(250) 2(500) 3(1000) 4(2000) 5(2500) 6(5000) 7(7500) 最好大于等于3(1000)
  28.         TSCFG2  = 1;                //B1~B0:配置触摸按键控制器的内部参考电压(AVCC的分压比), 0(1/4)  1(1/2)  2(5/8)  3(3/4)
  29.         TSRT = 0x00;                //没有LED分时扫描
  30.         TSWUTC = 128;        //唤醒频率 = F32K/(32*8*TSWUTC[7:0]) = 128/TSWUTC[7:0] Hz, TSWUTC = 1~255
  31.         IE2 |= 0x80;                //允许触摸按键中断
  32.     IRC32KCR = 0x80;                            //启动内部32K IRC
  33.     while (!(IRC32KCR & 1));                    //等待时钟稳定
  34.         delay_ms(50);                //延时一下
  35.         for(i=0; i<10; i++)        //扫描10次键, 将此值作为未触摸时的0点, 要求上电时不要触摸按键
  36.         {
  37.                 TSCTRL = (1<<7) + (1<<6);                //开始扫描, 无平均
  38.                 delay_ms(50);        //延时一下, 等待扫描完成
  39.         }
  40.         for(i=0; i<16; i++)                TK_zero[i] = TK_cnt[i];        //保存0点
  41.         TSTH15 = TK_zero[15] - T_KeyPress[15]/2;        //设置唤醒门槛值 = 0点(未触摸)值 - 触摸变化值/2
  42.         WakeUpkey  = 0;
  43.         B_KeyPress = 0;
  44.         while (1)
  45.         {
  46.                 if(B_KeyPress)
  47.                 {
  48.                         if(WakeUpkey == 15)        P_K15_LED = ~P_K15_LED;
  49.                 }
  50.                 TSCTRL = (1<<3) + (1<<2) + 0;        //关闭触摸模块, 允许16位数字比较器, 允许低功耗唤醒。 B7: TSGO,  B6: SINGLE,  B5: TSWAIT, B4: TSWUCS, B3: TSDCEN, B2: TSWUEN, B1 B0: TSSAMP
  51.                 P5M0 &= ~0x10; P5M1 |= 0x10;
  52.                 PCON |= 0x02;        //睡眠
  53.                 NOP(5);
  54.                 TSCTRL = (1<<7) + (1<<3) + (1<<2) + 0;        //开始扫描, 无平均, B7: TSGO,  B6: SINGLE,  B5: TSWAIT, B4: TSWUCS, B3: TSDCEN, B2: TSWUEN, B1 B0: TSSAMP
  55.         }
  56. }
  57. void  delay_ms(u8 ms)
  58. {
  59.      u16 i;
  60.          do
  61.          {
  62.                  i = MAIN_Fosc / 10000;
  63.                 while(--i)        ;
  64.      }while(--ms);
  65. }
  66. void        TKSU_ISR(void) interrupt TKSU_VECTOR
  67. {
  68.         u8        j;
  69.         j = TSSTA2;
  70.         if(j & 0x40)        //数据溢出, 错误处理(略)
  71.         {
  72.                 TSSTA2 |= 0x40;        //写1清零
  73.         }
  74.         if(j & 0x80)        //扫描完成
  75.         {
  76.                 TSSTA2 |= 0x80;                //写1清零
  77.                 j &= 0x0f;
  78.                 WakeUpkey = j;
  79.                 B_KeyPress = 1;
  80.                 TK_cnt[j] = TSDAT;        //保存某个通道的读数
  81.         }
  82. }
复制代码
参考了压缩包中的案例
实际去用万用表检测的时候没变化

触摸TK15 阈值是调好的 芯片夹在烧录座上
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:550
  • 最近打卡:2025-11-08 19:45:51
已绑定手机

48

主题

2308

回帖

8160

积分

论坛元老

积分
8160
发表于 昨天 19:53 | 显示全部楼层
像你主循环这样写法,就算唤醒了也会马上再次进休眠。
先用例子测试,功能验证正常后再进行修改或者移植:
触摸按键唤醒,1uA/1个键/1秒唤醒,STC触摸MCU, 唤醒【主时钟停振/省电模式】
https://www.stcaimcu.com/thread-5167-1-1.html
(出处: 国芯人工智能技术交流网站)
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:39
  • 最近打卡:2025-11-08 23:50:14
已绑定手机

22

主题

77

回帖

257

积分

中级会员

积分
257
发表于 昨天 23:50 | 显示全部楼层
乘风*** 发表于 2025-11-8 19:53
像你主循环这样写法,就算唤醒了也会马上再次进休眠。
先用例子测试,功能验证正常后再进行修改或者移植:
...

这不是我写的,例程上找到的
我试一下这个
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-11-9 11:25 , Processed in 0.104118 second(s), 54 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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