前段时间,我们根据当时在做的一个项目,写了篇《CH592/CH582 触摸按键应用开发实例讲解》的博文,在那篇博文中我们简单介绍了触摸按键的原理,所以这里我们就讲触摸按键的原理,而侧重讲解触摸按键的实现,官方提供的触摸库的添加及应用。
想要了解触摸按键的原理的朋友可以自行搜索相关资料,也可以参考我们之前的博文:
CH592/CH582 触摸按键应用开发实例讲解-优快云博客
一、在现有工程中添加触摸库

本博文以CH584M为例讲解,我们在官方提供的CH585例程中找到以下目录文件并复制到我们现有的工程目录中。



在工程中设置include目录并添加触摸库。


、
按上图所示添加相应的文件目录并修改设置好工程,那我们就完成了在现有的工程中添加触摸功能的软件框架。
二、初步理解例程中触摸功能的实现

从上图中我们可以看出,使用官方提供的触摸库还是比较简单的,我们需要做的只是简单几个步骤:
1、初始化触摸库的基本参数:
/*********************************************************************
* @fn touch_on_TMOS_init
*
* @brief 触摸初始化函数(基于TMOS)
*
* @return none
*/
void touch_on_TMOS_init(void)
{
TouchKey_TaskID = TMOS_ProcessEventRegister(Touch_Key_ProcessEvent);
TKY_PeripheralInit(); /* 初始外设,例如背光和蜂鸣器等 */
touch_Init(&touch_cfg); /* 初始化触摸库 */
wakeUpCount = 50; // 唤醒后持续时间,单位TRIGGER_TIME(100ms)
wakeupflag = 1; // 置成唤醒状态
triggerTime = TRIGGER_TIME;
TKY_SetSleepStatusValue(~tkyQueueAll);
#if TKY_SLEEP_EN
tky_DealData_start();
#else
tky_DealData_stop();
#endif
#if PRINT_EN
tmos_set_event(TouchKey_TaskID, DEBUG_PRINT_EVENT);
#endif
tmos_set_event(TouchKey_TaskID, WAKEUP_DATA_DEAL_EVT);
tmos_set_event(TouchKey_TaskID, TKY_KEEPALIVE_EVENT);
// TMR0_TimerInit(FREQ_SYS/1000); //定时周期为1ms
// TMR0_ITCfg(ENABLE, TMR0_3_IT_CYC_END);
// PFIC_EnableIRQ( TMR0_IRQn );
dg_log("Touch Key init Finish!\n");
}
/********************************************************************************************************
* @fn touch_Init
*
* @brief 初始化按键. 该函数被 TKY_Init() 调用。
*
* @return none
*/
void touch_Init(touch_cfg_t *p)
{
touch_InitHard(); /* 初始化Touch硬件和库基本参数 */
touch_InitVar(p); /* 初始化按键变量 */
}
/********************************************************************************************************
* @fn touch_InitHard
* @brief 初始化触摸按键
* @param 无
* @return 无
*/
static void touch_InitHard (void)
{
touch_Regcfg();
touch_Baseinit();
touch_Channelinit();
}
/********************************************************************************************************
* @fn touch_Baseinit
* @brief 触摸基础库初始化
* @param 无
* @return 无
*/
static void touch_Baseinit(void)
{
uint8_t sta=0xff;
TKY_BaseInitTypeDef TKY_BaseInitStructure = {0};
for(uint8_t i = 0; i < TKY_MAX_QUEUE_NUM; i++) //初始化tkyQueueAll变量
{
tkyQueueAll |= 1<<i;
}
dg_log("tQ : %04x\n",tkyQueueAll);
//----------触摸按键基础设置初始化--------
TKY_BaseInitStructure.filterMode = TKY_FILTER_MODE;
TKY_BaseInitStructure.shieldEn = TKY_SHIELD_EN;
TKY_BaseInitStructure.singlePressMod = TKY_SINGLE_PRESS_MODE;
TKY_BaseInitStructure.filterGrade = TKY_FILTER_GRADE;
TKY_BaseInitStructure.maxQueueNum = TKY_MAX

最低0.47元/天 解锁文章
822






