明月清风
发表于 7 天前
请教梁工。使用自己的板子,烧录了“03-16键简单应用-触摸按键唤醒-外中断唤醒”,串口(每秒发出1次"W”)和指示灯都正常。经打印相关信息,按下和未按下,触摸值到的值,有明显变化。 按下的阈值也低于设置的TSTH,但是无法执行到下面的代码里,不知道怎么回事?
if(B_KeyPress)
{
B_KeyPress = 0;
if(WakeUpkey == 0) P_K0_LED = ~P_K0_LED; //键触摸操作
if(WakeUpkey == 1) P_K1_LED = ~P_K1_LED;
if(WakeUpkey == 2) P_K2_LED = ~P_K2_LED;
if(WakeUpkey == 3) P_K3_LED = ~P_K3_LED;
if(WakeUpkey == 4) P_K4_LED = ~P_K4_LED;
if(WakeUpkey == 5) P_K5_LED = ~P_K5_LED;
if(WakeUpkey == 6) P_K6_LED = ~P_K6_LED;
if(WakeUpkey == 7) P_K7_LED = ~P_K7_LED;
if(WakeUpkey == 8) P_K8_LED= ~P_K8_LED;
if(WakeUpkey == 9) P_K9_LED= ~P_K9_LED;
if(WakeUpkey == 10) P_K10_LED = ~P_K10_LED;
if(WakeUpkey == 11) P_K11_LED = ~P_K11_LED;
if(WakeUpkey == 12) P_K12_LED = ~P_K12_LED;
if(WakeUpkey == 13) P_K13_LED = ~P_K13_LED;
if(WakeUpkey == 14) P_K14_LED = ~P_K14_LED;
if(WakeUpkey == 15) P_K15_LED = ~P_K15_LED;
}
梁工
发表于 7 天前
明月清风 发表于 2025-6-10 16:11
请教梁工。使用自己的板子,烧录了“03-16键简单应用-触摸按键唤醒-外中断唤醒”,串口(每秒发出1次"W”) ...
判断按键部分有问题吧?不按键读数多少?按键后读数多少?
明月清风
发表于 6 天前
梁工 发表于 2025-6-10 18:12
判断按键部分有问题吧?不按键读数多少?按键后读数多少?
谢谢回复。之前理解的不对,由于自己的板子 不是16键触摸。个别通道一直读出来是0,相当于一直触发了。加了打印函数,发现一直是通道3触发。
梁工
发表于 6 天前
明月清风 发表于 2025-6-11 11:03
谢谢回复。之前理解的不对,由于自己的板子 不是16键触摸。个别通道一直读出来是0,相当于一直触发了。加 ...
未启动的按键,不要做处理即可。
明月清风
发表于 5 天前
梁工,遇到一个新问题,折腾了半天没搞懂,程序始终无法运行。我正常运行的程序,包含初始化,使用了TSCTRL = 0x80; 在MCU准备进入休眠时,代码如下,
X32KCR = 0x80 + 0x40; //启动外部32K晶振, 低增益+0x00, 高增益+0x40.
while (!(X32KCR & 0x01));//等待时钟稳定
printf("进入休眠\n\r");
TSCTRL = 0x00;
TSCTRL = (1<<4) + (1<<3) + (1<<2) + 0;
//关闭触摸模块, 允许16位数字比较器, 允许低功耗唤醒。 B7: TSGO,B6: SINGLE,B5: TSWAIT, B4: TSWUCS, B3: TSDCEN, B2: TSWUEN, B1 B0: TSSAMP
DelayXms(1);
PCON |= 0x02; //睡眠
NOP(5);
printf("WAKE..\n\r");
TSCTRL = (1<<7) + (1<<6) + (1<<3) + (1<<2) + 0; //开始扫描, 无平均, B7: TSGO,B6: SINGLE,B5: TSWAIT, B4: TSWUCS, B3: TSDCEN, B2: TSWUEN, B1 B0: TSSAMP
if(B_KeyPress)
{
B_KeyPress = 0;
if(WakeUpkey == 0)
{
P20 = ~P20;
TSCTRL = 0x80; //开始自动扫描, 无平均, B7: TSGO,B6: SINGLE,B5: TSWAIT, B4: TSWUCS, B3: TSDCEN, B2: TSWUEN, B1 B0: TSSAMP
return; //退出睡眠
}
if(WakeUpkey == 1) P21 = ~P21;
if(WakeUpkey == 2) P42 = ~P42;
printf("WakeUpkey = %bd \n\r",WakeUpkey);
}
现在的现象和问题就是:我只要在其他地方调用过 TSCTRL = 0x80;这句,包含初始化阶段,也就是TSGO=1,等到我再回到上述进入休眠的流程。就无法通过触摸按键从休眠中唤醒。实在不知道问题出在哪?{:weiqu:}
梁工
发表于 5 天前
明月清风 发表于 2025-6-12 09:11
梁工,遇到一个新问题,折腾了半天没搞懂,程序始终无法运行。我正常运行的程序,包含初始化,使用了TSCTRL ...
请参考我主楼的程序。
明月清风
发表于 5 天前
梁工 发表于 2025-6-12 09:24
请参考我主楼的程序。
关于触摸低功耗的部分基本上跟你的一样的了。这个问题始终存在,懵了
明月清风
发表于 5 天前
梁工 发表于 2025-6-12 09:24
请参考我主楼的程序。
梁工,你好,我直接用你的代码跑,只要 加上 TSCTRL = 0x80; 这句,后面的唤醒功能就完全失效了。我认为这是一个BUG。C:\Users\yang.xingyuan\Desktop\1749709885494.jpg
梁工
发表于 5 天前
明月清风 发表于 2025-6-12 14:33
梁工,你好,我直接用你的代码跑,只要 加上 TSCTRL = 0x80; 这句,后面的唤醒功能就完全失效了。我认为这 ...
你启动扫描,马上又进入睡眠,可能不行。你这样试下:
TSCTRL = 0x00;
delay_ms(50); //延时一下
TSCTRL = (1<<3) + (1<<2) + 0; //关闭触摸模块, 允许16位数字比较器, 允许低功耗唤醒。 B7: TSGO,B6: SINGLE,B5: TSWAIT, B4: TSWUCS, B3: TSDCEN, B2: TSWUEN, B1 B0: TSSAMP
明月清风
发表于 4 天前
梁工 发表于 2025-6-12 14:48
你启动扫描,马上又进入睡眠,可能不行。你这样试下:
TSCTRL = 0x00;
delay_ms(50); //延时一下
感谢回复。这里加上延时,确实有效果{:baoquan:}