一、自带触控程序
TBK-RD8T3x评估版自带触控DEMO程序,上手十分丝滑,轻点几下,划一划LED灯亮起,似乎触控原本就该如此。并且新定义TBK-RD8T3x应用资料->TBK-RD8T3x Demo Code中是提供了源码,出于好奇大略看一下,初时如云里雾里,GPIO初始化在哪?TK的初始化哪?程序这么就知道了触控哪个按键。好像DEMO中提到了,但哪个是呀?程序里这些都该封装的封装,该静态库的静态库,给用户空间不多,而规则倒是有一些,如果不了解规则那真是看不懂了。如果有同样困惑,那你一定也看了DEMO源码。
二、程序分析
1、DEMO主程序
void main(void)
{
/*** MCU init***/
SC_Init();
TouchKeyInit();
while(1)
{
Sys_Scan();
}
}
包括SC_Init():GPIO的初始化;GPIO中只有LED灯的GPIO初始化,没有TK的。
TouchKeyInit():触控初始化;这个函数没有提供源码,是静态库。那静态库怎么知道TK初始了哪个引脚?
Sys_Scan():轮询监测触控是否被按下,MCU做出响应。
2、S_TouchKeyCFG.h
查了一下TK的通过配置文件S_TouchKeyCFG.h初始化的, TouchKeyInit()应该是读取了配置文件然后调用静态库中的函数对TK引脚初始化。
//*************************************************************************************************
//Copyright (c) 合肥市新定义电子有限公司
//文件名称: S_TouchKeyCFG.h
//作者:
//模块功能: 触控键配置文件
//版本: V0.2
//更改记录:
//************************************************************************************************
#ifndef __S_TOUCHKEYCFG_H__
#define __S_TOUCHKEYCFG_H__
#define SOCAPI_SET_TOUCHKEY_TOTAL 9
#define SOCAPI_SET_TOUCHKEY_CHANNEL 0x0FC00007
unsigned int code TKCFG[17] = {0,0,0,5,10,3000,200,100,2,0,0,4,0,1,65535,65535,20};
unsigned char code TKChannelCfg[9][8]={
0x05,0x39,0x04,0x08,0x13,0x05,0x01,0x01,
0x05,0x39,0x04,0x08,0x15,0x05,0x00,0xe2,
0x05,0x39,0x04,0x08,0x12,0x05,0x00,0xc8,
0x05,0x39,0x04,0x08,0x11,0x05,0x00,0xd1,
0x05,0x39,0x04,0x08,0x0e,0x05,0x00,0xd6,
0x05,0x39,0x04,0x08,0x0e,0x05,0x01,0x09,
0x05,0x39,0x04,0x08,0x0c,0x05,0x00,0xe3,
0x05,0x39,0x04,0x08,0x0b,0x05,0x00,0xf7,
0x05,0x39,0x04,0x08,0x11,0x05,0x01,0x04,
};
#endif
《新定义RD8系列TouchKey MCU应用指南》中相关定义的解释
#define SOCAPI_SET_TOUCHKEY_TOTAL 9
TK通道数目,DEMO中用到了TK0、TK1、TK2;TK22-TK27,一共9个TK通道。
#define SOCAPI_SET_TOUCHKEY_CHANNEL 0x0FC00007
具体是哪些通道哪?上面的0x0FC00007是16进制转化为2进制就是: 1111110000000000000000000111
也就是对应前面的9个通道。
unsigned int code TKCFG[17] = {0,0,0,5,10,3000,200,100,2,0,0,4,0,1,65535,65535,20};
unsigned char code TKChannelCfg[9][8]={...
这两个数组是什么?官方大部分说保持默认不改动 ,反正不动就是了。
3、如何感知触控点亮LED
SysFunVarDefine.c:
void ChangeTouchKeyvalue(void)
{
/*<UserCodeStart>*//*<SinOne-Tag><347>*/
switch(exKeyValueFlag)
{
case 0x00400000:exKeyValue = 1;break;
case 0x00800000:exKeyValue = 2;break;
case 0x01000000:exKeyValue = 3;break;
case 0x02000000:exKeyValue = 4;break;
case 0x04000000:exKeyValue = 5;break;
case 0x08000000:exKeyValue = 6;break;
default:exKeyValue = 0xff;break;
}
/*<UserCodeEnd>*//*<SinOne-Tag><347>*/
}
其中exKeyValueFlag的值也是表示TK通道数目,如0x00400000,就是:10000000000000000000000,对应TK22。
void UpdateDisplay(void)
{
/*<UserCodeStart>*//*<SinOne-Tag><351>*/
if(exKeyValue != 0xff)
{
if(gTkIsValid == 0) //松手前只出一次键
{
gTkIsValid = 1;
KeyValue=exKeyValue;
switch(KeyValue)
{
case 1:LED1= ~LED1;break;
case 2:LED2= ~LED2;break;
case 3:LED3= ~LED3;break;
case 4:LED4= ~LED4;break;
case 5:LED5= ~LED5;break;
case 6:LED6= ~LED6;break;
default:exKeyValue = 0xff;break;
}
}
}
else
{
gTkIsValid = 0;
}
/*<UserCodeEnd>*//*<SinOne-Tag><351>*/
}
UpdateDisplay()根据exKeyValue的值来反转对应的LED。
三、总结
1、TK的初始化配置在S_TouchKeyCFG.h中。初始化函数没有开源。
2、TK的通道依赖一个2进制数对应的位,初始化和触控判断都要用到。
3、有个Touch Key Tool Menu的程序是调试触摸用的,可以配制TKChannelCfg,但需要有烧录器才能使用。
4、EasyCodeCube.exe有TK的支持,可以很容易实现TK功能。