- // 触摸按键唤醒
-
-
- #define MAIN_Fosc 24000000L //定义主时钟 串口波特率 300 ~ 4800
-
-
- #include "STC8Hxxx.h"
-
-
- sbit P_K15_LED = P5^4;
-
-
- u16 xdata TK_cnt[16]; // 按键计数值, 16位
- u16 xdata TK_zero[16]; // 按键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[16]={ 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[6:4]+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[7:0]) = 128/TSWUTC[7:0] 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[i] = TK_cnt[i]; //保存0点
-
- TSTH15 = TK_zero[15] - T_KeyPress[15]/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
- }
- }
-
-
- void delay_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[j] = TSDAT; //保存某个通道的读数
- }
- }
复制代码 参考了压缩包中的案例
实际去用万用表检测的时候没变化
触摸TK15 阈值是调好的 芯片夹在烧录座上
|