CH552/projects/examples/TouchKey/TouchKey.C
2019-01-04 15:58:00 +08:00

121 lines
4.8 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/********************************** (C) COPYRIGHT *******************************
* File Name : TouchKey.C
* Author : WCH
* Version : V1.0
* Date : 2017/01/20
* Description : CH554 触摸按键采样间隔设置、通道选择和切换和中断处理函数
*******************************************************************************/
#include "..\Public\CH554.H"
#include "..\Public\Debug.H"
#include "TouchKey.H"
#include "stdio.h"
#pragma NOAREGS
UINT16 KeyFree[KEY_LAST-KEY_FIRST+1]; //触摸空闲值存储,用于比较按键状态,如果采样值小于基准值表明按键按下
UINT8V KeyBuf; //触摸按键状态为0表示无按键非0表示当前检测按键被按下
/*******************************************************************************
* Function Name : GetTouckKeyFreeBuf()
* Description : 获取触摸按键空间状态键值
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void GetTouckKeyFreeBuf()
{
UINT8 i,j;
UINT8 TmpSum = 0;
KeyBuf = 0; //初始化设置为无按键状态
for(i=KEY_FIRST;i<(KEY_LAST+1);i++)
{
j = KEY_BASE_SAMPLE_TIME; //采多次求平均值作为采样参考
TKEY_CTRL = (TKEY_CTRL & 0xF8 | i)+1; //设置采样通道
while(j--)
{
while((TKEY_CTRL&bTKC_IF) == 0); //bTKC_IF变为1时本周期采样完成
TmpSum += TKEY_DAT&0x0F; //采样值稳定取低4位就够了
}
KeyFree[i] = TKEY_DAT&0x07F0 + TmpSum/5; //保存采样值
}
#if INTERRUPT_TouchKey
IE_TKEY = 1; //使能Touch_Key中断
#endif
}
/*******************************************************************************
* Function Name : TouchKeyChannelSelect(UINT8 ch)
* Description : 触摸按键通道选择
* Input : UINT8 ch 采用通道
0~5 分别代表采样通道
* Output : None
* Return : 成功 SUCCESS
失败 FAIL 不支持的通道
*******************************************************************************/
UINT8 TouchKeyChannelSelect(UINT8 ch)
{
if(ch < 6)
{
TKEY_CTRL = (TKEY_CTRL & 0xF8 | ch)+1;
return SUCCESS;
}
return FAIL;
}
#if INTERRUPT_TouchKey
/*******************************************************************************
* Function Name : TouchKeyInterrupt(void)
* Description : Touch_Key 中断服务程序
*******************************************************************************/
void TouchKeyInterrupt( void ) interrupt INT_NO_TKEY using 1 //Touch_Key中断服务程序,使用寄存器组1
{
UINT8 ch;
UINT16 KeyData;
KeyData = TKEY_DAT; //保持87us,尽快取走
ch = TKEY_CTRL&7; //获取当前采样通道
if ( ch > KEY_LAST ){
TKEY_CTRL = TKEY_CTRL & 0xF8 | KEY_FIRST; //从首通道开始采样
}
else
{
TKEY_CTRL ++; //切换至下一个采样通道
}
if ( KeyData < (KeyFree[ch-KEY_FIRST] - KEY_ACT) ) //如条件满足,代表按键按下
{
KeyBuf=ch; //可以在此处进行按键动作处理或者置标志通知main进行处理
}
}
#else
/*******************************************************************************
* Function Name : TouchKeyChannelQuery()
* Description : 触摸按键通道状态查询
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void TouchKeyChannelQuery()
{
UINT8 ch;
UINT16 KeyData;
while((TKEY_CTRL&bTKC_IF) == 0); //bTKC_IF变为1时本周期采样完成
KeyData = TKEY_DAT; //保持87us,尽快取走
ch = TKEY_CTRL&7; //获取当前采样通道
if ( ch > KEY_LAST ){
TKEY_CTRL = TKEY_CTRL & 0xF8 | KEY_FIRST; //从首通道开始采样
}
else
{
TKEY_CTRL ++; //切换至下一个采样通道
}
if ( KeyData < (KeyFree[ch-KEY_FIRST] - KEY_ACT) ) //如条件满足,代表按键按下
{
KeyBuf=ch; //可以在此处进行按键动作处理或者置标志通知main进行处理
}
}
#endif