SC95F8617触摸库使用笔记
一、资料概述
主要参考资料:《赛元SC95F系列TouchKey MCU 应用指南v0.0.1.pdf》。资料包链接如下: 1.我下载时的地址: SC95F8X1X触控资料 2.我转存的百度盘:[SC95F8X1X触控资料] 链接:https://pan.baidu.com/s/1FaoaZUbpgLb9LvdgFPGV7w?pwd=fnn7 提取码:fnn7
3.csdn下载 SC95F8X1X触控资料 先来看看资料包的内容: 触摸库分为2种(高可靠模式和高灵敏度模式),3个(高灵敏度有T1和T2两种),看看他们有什么区别: 通过上表的信息,我只用到一路触摸,我就选用了高灵敏度模式T1。因为T2至少要3个按键。
二、关键的配置参数
下面来看看配置文件的源码《S_TOUCHKEYCFG.H》:
#ifndef __S_TOUCHKEYCFG_H__
#define __S_TOUCHKEYCFG_H__
#define SOCAPI_SET_TOUCHKEY_TOTAL 2
#define SOCAPI_SET_TOUCHKEY_CHANNEL 0x000000c0
unsigned int code TKCFG[17] = {
1,
0,
0,
7,
10,
3000,
300,
200,
2,
0,
0,
4,
100,
10,
65535,
65535,
10
};
unsigned char code TKChannelCfg[SOCAPI_SET_TOUCHKEY_TOTAL][8]={
0x03,
0x18,
0x04,
0x1f,
0x1f,
0x05,
0x0C,
0xbe,
0x03,0x18,0x04,0x1f,0x1f,0x05,0x05,0x3a,
};
#endif
我就更改了3个地方:
- 按键总数 SOCAPI_SET_TOUCHKEY_TOTAL 由demo的3改为2;
- 根据我的触摸按键IO口,SOCAPI_SET_TOUCHKEY_CHANNEL 改为0x000000C0;TK0对应0x00000001;TK1对应0x00000002;依此类推。
- 触摸阈值的高字节由0x07 改为 0x0C,这是因为我的系统有电机,如果是原来的0x07,过于灵敏,会误触发。
三、把触摸库整合到自己的工程
高灵敏度模式T1包含了2个库,区别在于库使用到的临时变量区间选择在哪个区域。我选用了Small。
SC95F8X1X_HighSensitive_Lib_T1_S_V0.0.2.LIB --- 使用Small模式编译,变量区间在data
SC95F8X1X_HighSensitive_Lib_T1_L_V0.0.2.LIB --- 使用Large模式编译,变量区间在xdata
3.1把库文件添加进工程
把库文件添加到自己的工程中,下面4个文件: 这几个文件的官方介绍: 触摸库API函数接口说明: 触摸库使用流程图:
3.2触摸库API使用源码分析
3.2.1 设置IO口为推挽输出,且输出高电平(我用了P31-TK6作为触摸口)
P3CON = B0011_1111;
P3PH = 0x00;
P31 = 1;
3.2.2 在main函数中调用初始化函数TouchKeyInit
TouchKeyInit();
3.2.3 在main函数中,1ms扫描一次按键
void main(void)
{
...
TouchKeyInit();
...
while(1){
WDT_CLR ;
if(FlagTick_1ms){
FlagTick_1ms = 0;
#if CFG_TOUCH_BODY == 1
Sys_Scan();
#endif
}
...
}
}
void Sys_Scan(void)
{
if(SOCAPI_TouchKeyStatus&0x80)
{
SOCAPI_TouchKeyStatus &=0x7f;
exKeyValueFlag = TouchKeyScan();
ChangeTouchKeyvalue();
TouchKeyRestart();
}
}
#define KEY_STAT_DELAY_TICK 15
#define KEY_UP_STAT_DELAY_TICK 15
unsigned char xdata bKeyIsDown;
unsigned char xdata keyChangeDelay;
void ChangeTouchKeyvalue(void)
{
if(exKeyValueFlag != 0x00000000)
{
switch(exKeyValueFlag)
{
case 0x00000040:
if(!bKeyIsDown){
keyChangeDelay++;
if(keyChangeDelay > KEY_STAT_DELAY_TICK){
keyChangeDelay = 0;
bKeyIsDown = 1;
FlagPeopleNotInBed = 0;
LED1 = 1;
}
}
break;
default: exKeyValueFlag = 0x00000000;
}
}else {
if(bKeyIsDown){
keyChangeDelay++;
if(keyChangeDelay > KEY_UP_STAT_DELAY_TICK){
keyChangeDelay = 0;
bKeyIsDown = 0;
LED1 = 0;
FlagPeopleNotInBed = 1;
}
}
}
}
四、针对特殊应用修改触摸库函数
我的应用有些特殊,我是在按摩椅系统中,用来检测人体是否到位。在按摩椅表层放置一根细长的导线。一开始,我把TKCFG[5]SET_KEY_CONTI_TIME 按键最长输出 设置为0xFFFF(默认为十进制3000),按键最长输出为8分钟左右,我需要按键能够持续输出30分钟。于是找到了触摸库文件《S_TouchKeyCFG.C》
unsigned long int TouchKeyScan(void)
{
unsigned char t;
unsigned char MultipleCnt = 0;
unsigned long int Keyvalue = 0;
unsigned long int KeyData = 0;
if(GetIsNeedUpdateBaseline() == 0)
{
Keyvalue = SensorKeyFlag();
for(t=0;t<CurrentChannelMax;t++)
{
Keyvalue = Keyvalue>>1;
if(TK_CY)
{
KeyData |= ((unsigned long int)0x01 << (CurrentChannel[t]));
MultipleCnt++;
}
}
if(MultipleCnt >= 2)
{
bMultiple = 1;
if(MultipleCnt >= SOCAPI_MAX_KEY_NUM_INVALID)
{
SetNeedUpdateBaseline();
}
else
{
if(IsDoubleKeyOrSlideKey())
{
bMultiple = 0;
}
}
}
if(bMultiple == 0)
{
if(KeyData != 0x0)
{
UpdateBaseLNum++;
}
else
{
UpdateBaseLNum = 0;
}
}
else
{
MultipleLNum++;
KeyData = 0x00;
}
if(MultipleLNum >SOCAPI_MAX_KEY_MUTIPLE)
{
SetNeedUpdateBaseline();
MultipleDealTpye = 1;
MultipleLNum = 0;
}
}
else
{
MultipleDeal(TKCFG[AUTO_UPDATE_TIME]);
}
return KeyData;
}
注释掉的如下代码,就可以保证按键持续输出时间超过30分钟:
if(UpdateBaseLNum > SetOneKeyPushResetTime())
{
SetNeedUpdateBaseline();
UpdateBaseLNum = 0;
}
|