参考了触摸按键唤醒的案例,但是测量的时候没有唤醒
// 触摸按键唤醒#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 阈值是调好的 芯片夹在烧录座上
像你主循环这样写法,就算唤醒了也会马上再次进休眠。
先用例子测试,功能验证正常后再进行修改或者移植:
触摸按键唤醒,1uA/1个键/1秒唤醒,STC触摸MCU, 唤醒【主时钟停振/省电模式】
https://www.stcaimcu.com/thread-5167-1-1.html
(出处: 国芯人工智能技术交流网站)
乘风飞扬 发表于 2025-11-8 19:53
像你主循环这样写法,就算唤醒了也会马上再次进休眠。
先用例子测试,功能验证正常后再进行修改或者移植:
...
这不是我写的,例程上找到的{:nanguo:}
我试一下这个 可以了 解决了 已解决
页:
[1]