找回密码
 立即注册
查看: 382|回复: 4

触摸按键休眠后无法唤醒

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:115
  • 最近打卡:2025-03-28 11:36:20

8

主题

42

回帖

384

积分

中级会员

积分
384
发表于 2024-5-1 09:28:05 | 显示全部楼层 |阅读模式
现象:触摸按键功能正常,根据案例增加  休眠部分
{                TSCHEN1 = 0xff;                //TK0~TK7        仅仅允许K0唤醒
                TSCHEN2 = 0x0f;                //TK8~TK15
                TSCTRL = (1<<3) + (1<<2) + 0;        //关闭触摸模块, 允许16位数字比较器, 允许低功耗唤醒。 B7: TSGO,  B6: SINGLE,  B5: TSWAIT, B4: TSWUCS, B3: TSDCEN, B2: TSWUEN, B1 B0: TSSAMP

                NOP(2);
                PCON |= 0x02;        //睡眠
                NOP(5);

    PrintString1("STC8H4K64TLR 唤醒后\r\n");
                TSCHEN1 = 0xff;                //TK0~TK7        允许所有16个键
                TSCHEN2 = 0x0f;                //TK8~TK15
                TSCTRL = (1<<7) + (1<<3) + (1<<2) + 0;}
就无法唤醒了,
扫描函数如下,

void Touch_Init(void)
{
//        u8 i;
//  TSRT = 0x00;                  //没有LED分时扫描
        TSCHEN1 = 0xff;                //TK0~TK7
        TSCHEN2 = 0x0f;                //TK8~TK12 1111
        TSCFG1  = (7<<4) + 6;        //开关电容工作频率 = fosc/(2*(TSCFG1[6:4]+1)), 放电时间(系统时钟周期数) 0(125) 1(250) 2(500) 3(1000) 4(2000) 5(2500) 6(5000) 7(7500) 最小3
        TSCFG2  = 1;                //配置触摸按键控制器的内部参考电压(AVCC的分压比), 0(1/4)  1(1/2)  2(5/8)  3(3/4)
//        TSCTRL = (1<<7) + (1<<6) +3;        //开始扫描, B7: TSGO,  B6: SINGLE,  B5: TSWAIT, B4: TSWUCS, B3: TSDCEN, B2: TSWUEN, B1 B0: TSSAMP
        TSRT = 0x00;                //没有LED分时扫描
        TSCTRL =0xa0; //0xa0
//B7:TSGO=1使能触摸按键 1011 0100
//B6:SINGLE=1单次扫描模式、=0自动重复扫描
//B5:TSWAIT=1完成一轮扫描后、TSIF 被硬件置 1,此时触摸按键控制器会暂停扫描,直到 TSIF 标志位被清 0后才开始下一轮的扫描
//B4:TSWUCS=0使用内部32K晶振
//B3:TSDCEN=0不使能16位比较器
//B2:TSWUEN=1使能低功耗唤醒功能
//B1B0:TSSAMP=11单次按键扫描4次
  TSWUTC = 20;                        //唤醒
        IE2 |= 0x80;                //允许触摸按键中断
        EA = 1;
        ReadZeroData();
}
void Touch_Scan()
{
        u8 i;
        if(B_1ms)
        {
                        B_1ms = 0;
                        for(i=0;i<12;i++)          //#
                        {
                                JudgeKey(i);        //判断键值
                        }

                        B = (u8)tpFlag;
                        if(B0)           //触摸按键被触发后,对应的指示灯信号进行翻转
                        {
                                beep(10);
                                key_value=3;
                                LED3 = !LED3;
                                TX1_write2buff(key_value);
                        }
                        if(B1)       
                        {
                                beep(10);
                                key_value=6;
                                LED6 = !LED6;
                                TX1_write2buff(key_value);
                        }
                        if(B2)       
                        {
                                beep(10);
                                key_value=1;
                                LED1 = !LED1;
                                TX1_write2buff(key_value);
                        }
                        if(B3)       
                        {
                                beep(10);
                                key_value=4;
                                LED4 = !LED4;
                                TX1_write2buff(key_value);
                        }
                        if(B4)       
                        {
                                beep(10);
                                key_value=8;
                                LED8 = !LED8;
                                TX1_write2buff(key_value);
                        }
                        if(B5)       
                        {
                                beep(10);
                                key_value=10;         
                                LED12 = !LED12;
                                TX1_write2buff(key_value);
                        }
                        if(B6)       
                        {
                                beep(10);
                                key_value=11;              //*
                                LED11 = !LED11;
                                TX1_write2buff(key_value);
                        }
                        if(B7)       
                        {
                                beep(10);
                                key_value=7;
                                LED7 = !LED7;
                                TX1_write2buff(key_value);
                        }
                       
                        B = (u8)(tpFlag >> 8);
                        if(B0)       
                        {
                                beep(10);
                                key_value=12;
                                LED13 = !LED13;
                                TX1_write2buff(key_value);
                        }
                        if(B1)       
                        {
                                beep(10);
                                key_value=9;
                                LED9 = !LED9;
                                TX1_write2buff(key_value);
                        }
                        if(B2)       
                        {
                                beep(10);
                                key_value=5;
                                LED5 = !LED5;
                                TX1_write2buff(key_value);
                        }
                        if(B3)       
                        {
                                beep(10);
                                key_value=2;
                                LED2 = !LED2;
                                TX1_write2buff(key_value);                               
                        }                       
                        tpFlag = 0;       
                       
                TSCHEN1 = 0xff;                //TK0~TK7        仅仅允许K0唤醒
                TSCHEN2 = 0x0f;                //TK8~TK15
                TSCTRL = (1<<3) + (1<<2) + 0;        //关闭触摸模块, 允许16位数字比较器, 允许低功耗唤醒。 B7: TSGO,  B6: SINGLE,  B5: TSWAIT, B4: TSWUCS, B3: TSDCEN, B2: TSWUEN, B1 B0: TSSAMP
               
                NOP(2);
                PCON |= 0x02;        //睡眠
                NOP(5);
                       
    PrintString1("STC8H4K64TLR 唤醒后\r\n");
                TSCHEN1 = 0xff;                //TK0~TK7        允许所有16个键
                TSCHEN2 = 0x0f;                //TK8~TK15
                TSCTRL = (1<<7) + (1<<3) + (1<<2) + 0;
        }
}

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6841

积分

论坛元老

积分
6841
发表于 2024-5-1 11:06:23 | 显示全部楼层
用这个帖子提供的例程试试:
触摸按键唤醒,1uA/1个键/1秒唤醒,STC触摸MCU, 唤醒【主时钟停振/省电模式】
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=5167
(出处: 国芯技术交流网站)
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:115
  • 最近打卡:2025-03-28 11:36:20

8

主题

42

回帖

384

积分

中级会员

积分
384
发表于 2024-5-1 13:38:36 | 显示全部楼层
就是参考的例程
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6841

积分

论坛元老

积分
6841
发表于 2024-5-2 09:54:17 来自手机 | 显示全部楼层
lier378912453 发表于 2024-5-1 13:38
就是参考的例程

先直接用例子测试,功能测试正常后再进行修改或者移植。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:115
  • 最近打卡:2025-03-28 11:36:20

8

主题

42

回帖

384

积分

中级会员

积分
384
发表于 2024-5-8 18:11:35 | 显示全部楼层
大家好  请教下两个问题
一:12个触摸按键(亚克力覆盖在PCB上),多次触摸时,有时候会有串扰的问题(触摸按键时 间隔时间长一点 也会时不时出现串扰),这个应该从哪方面来分析呢
二:根据手册中的流程 触摸唤醒掉电流程  一步一步操作下来,发现可以进入掉电模式 但是唤醒不起来了(待机功耗550uA 进入掉电模式时70UA左右,但是唤醒不起来)TSWUTC从128改到15 也不管
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 01:21 , Processed in 0.108270 second(s), 72 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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