HyunYong_7782 发表于 2025-11-7 15:42:21

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

// 触摸按键唤醒


#define MAIN_Fosc                24000000L        //定义主时钟串口波特率 300 ~ 4800


#include        "STC8Hxxx.h"


sbit        P_K15_LED = P5^4;


u16        xdata TK_cnt;        // 按键计数值, 16位
u16        xdata TK_zero;        // 按键0点值, 16位
u16        KeyState;                        // 按键状态, 每个bit对应一个键, 1为按下, 0为释放
u8        WakeUpkey;
bit        B_KeyPress;


void        delay_ms(u8 ms);


//                         K0   K1   K2   K3   K4   K5      K6    K7   K8   K9   K10   K11    K12    K13    K14    K15
u16 code T_KeyPress={ 1300,2000,900,   800,   900,   1000,   1100, 1400,1000,1200,   900,1200,750,   900,   1300,1800};        //触摸后的变化值


void main(void)
{
        u8        i;

        P_SW2 |= 0x80;                //允许访问扩展寄存器xsfr

        EA = 1;                                //允许全局中断

        P_K15_LED = 0;


    P1M0 &= ~0x0b; P1M1 |= 0x0b;
        P3M0 = 0x00; P3M1 = 0xff;
        P5M0 |= 0x10; P5M1 &= ~0x10;


        P1IE &= ~0x0b;
        P3IE = 0x00;
        P5IE &= ~0x10;


        TSCHEN1 = 0x00;                //TK0~TK7
        TSCHEN2 = 0x80;                //TK8~TK15
        TSCFG1= (7<<4) + 6;        //B6~B4:开关电容工作频率 = fosc/(2*(TSCFG1+1)), B2~B0:放电时间(系统时钟周期数) 0(125) 1(250) 2(500) 3(1000) 4(2000) 5(2500) 6(5000) 7(7500) 最好大于等于3(1000)
        TSCFG2= 1;                //B1~B0:配置触摸按键控制器的内部参考电压(AVCC的分压比), 0(1/4)1(1/2)2(5/8)3(3/4)
        TSRT = 0x00;                //没有LED分时扫描
        TSWUTC = 128;        //唤醒频率 = F32K/(32*8*TSWUTC) = 128/TSWUTC Hz, TSWUTC = 1~255
        IE2 |= 0x80;                //允许触摸按键中断

    IRC32KCR = 0x80;                            //启动内部32K IRC
    while (!(IRC32KCR & 1));                  //等待时钟稳定

        delay_ms(50);                //延时一下

        for(i=0; i<10; i++)        //扫描10次键, 将此值作为未触摸时的0点, 要求上电时不要触摸按键
        {
                TSCTRL = (1<<7) + (1<<6);                //开始扫描, 无平均
                delay_ms(50);        //延时一下, 等待扫描完成
        }
        for(i=0; i<16; i++)                TK_zero = TK_cnt;        //保存0点

        TSTH15 = TK_zero - T_KeyPress/2;        //设置唤醒门槛值 = 0点(未触摸)值 - 触摸变化值/2

        WakeUpkey= 0;
        B_KeyPress = 0;

        while (1)
        {

                if(B_KeyPress)
                {
                        if(WakeUpkey == 15)        P_K15_LED = ~P_K15_LED;
                }

                TSCTRL = (1<<3) + (1<<2) + 0;        //关闭触摸模块, 允许16位数字比较器, 允许低功耗唤醒。 B7: TSGO,B6: SINGLE,B5: TSWAIT, B4: TSWUCS, B3: TSDCEN, B2: TSWUEN, B1 B0: TSSAMP

                P5M0 &= ~0x10; P5M1 |= 0x10;
                PCON |= 0x02;        //睡眠

                NOP(5);

                TSCTRL = (1<<7) + (1<<3) + (1<<2) + 0;        //开始扫描, 无平均, B7: TSGO,B6: SINGLE,B5: TSWAIT, B4: TSWUCS, B3: TSDCEN, B2: TSWUEN, B1 B0: TSSAMP
        }
}


voiddelay_ms(u8 ms)
{
   u16 i;
       do
       {
               i = MAIN_Fosc / 10000;
                while(--i)        ;
   }while(--ms);
}


void        TKSU_ISR(void) interrupt TKSU_VECTOR
{
        u8        j;

        j = TSSTA2;

        if(j & 0x40)        //数据溢出, 错误处理(略)
        {
                TSSTA2 |= 0x40;        //写1清零
        }
        if(j & 0x80)        //扫描完成
        {
                TSSTA2 |= 0x80;                //写1清零
                j &= 0x0f;
                WakeUpkey = j;
                B_KeyPress = 1;
                TK_cnt = TSDAT;        //保存某个通道的读数
        }
}参考了压缩包中的案例
实际去用万用表检测的时候没变化

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

乘风飞扬 发表于 2025-11-8 19:53:23

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

HyunYong_7782 发表于 2025-11-8 23:50:14

乘风飞扬 发表于 2025-11-8 19:53
像你主循环这样写法,就算唤醒了也会马上再次进休眠。
先用例子测试,功能验证正常后再进行修改或者移植:
...

这不是我写的,例程上找到的{:nanguo:}
我试一下这个

HyunYong_7782 发表于 2025-11-20 02:23:31

可以了 解决了

HyunYong_7782 发表于 2025-11-20 02:24:18

已解决
页: [1]
查看完整版本: 参考了触摸按键唤醒的案例,但是测量的时候没有唤醒