//文件touchbutton.h
#ifndef _TOUCHBUTTON_H_
#define _TOUCHBUTTON_H_
//=========宏定义===========================================
#define DEF_WATCH_TKREFER //查看参考 -用于测试
//===========================================================
#define V_REFER 1 //AD值超过此值 更新参考值
#define V_PRESS 7 //AD值-参考 大于此值 认为按键按下-按键灵敏度
#define VT_KTc 30 //更新参考值所需要的次数
//--------按键位置定义-----------
#define K_TKON SETB0 //ON/OFF
#define K_TKBL SETB1 //沸腾
#define K_TKPU SETB2 //水泵
#define K_TKST SETB3 //恒温设定
//#define V_TKQK1 (uint8)5 //快速加减时间 值
typedef struct TCHBUT{
uint8 KTc1 ; //更新参考值确认时间
uint8 KRefer1 ; //按键1参考电压
uint8 KTc2 ; //更新参考值确认时间
uint8 KRefer2 ; //按键2参考电压
/* uint8 KTc3 ; //更新参考值确认时间
uint8 KRefer3 ; //按键2参考电压
uint8 KTc4 ; //更新参考值确认时间
uint8 KRefer4 ; //按键2参考电压
uint8 KTc5 ; //更新参考值确认时间
uint8 KRefer5 ; //按键2参考电压
uint8 KTc6 ; //更新参考值确认时间
uint8 KRefer6 ; //按键2参考电压
uint8 KTc7 ; //更新参考值确认时间
uint8 KRefer7 ; //按键2参考电压
// uint8 KTc8 ; //更新参考值确认时间
// uint8 KRefer8 ; //按键2参考电压
*/
uint8 KTVal1 ;
uint8 KTVal2 ;
// uint8 KTVal3 ;
// uint8 KTVal4 ;
}tTCHBut ;
extern xdata tTCHBut tCHBut ;
#define KTc1 tCHBut.KTc1
#define KRefer1 tCHBut.KRefer1
#define KTc2 tCHBut.KTc2
#define KRefer2 tCHBut.KRefer2
#define KTc3 tCHBut.KTc3
#define KRefer3 tCHBut.KRefer3
#define KTc4 tCHBut.KTc4
#define KRefer4 tCHBut.KRefer4
#define KTc5 tCHBut.KTc5
#define KRefer5 tCHBut.KRefer5
#define KTc6 tCHBut.KTc6
#define KRefer6 tCHBut.KRefer6
#define KTc7 tCHBut.KTc7
#define KRefer7 tCHBut.KRefer7
//#define KTc8 tCHBut.KTc8
//#define KRefer8 tCHBut.KRefer8
#define KTVal1 tCHBut.KTVal1
#define KTVal2 tCHBut.KTVal2
#define KTVal3 tCHBut.KTVal3
#define KTVal4 tCHBut.KTVal4
//=======按键检测==============
typedef struct BUTTON2{
uint8 TKNOW ; //当前几次按键的状态
uint8 TKLST ;
// uint8 TKLST1 ;
// uint8 TKLST2 ;
// uint8 TKLST3 ;
uint8 TKSTB ; //去抖后按键状态
uint8 TKSTBL ; //上次 去抖后按键状态
uint8 TKAVL ; //下降沿有效值
uint8 TKAVLP ; //上升沿有效值
uint8 TKeyStatu ; //读按键的当前值
uint8 TKLONG ; //长按键计数
// uint8 TTconQK ; //快速调节计数 111 555 10 10 10
}tButton2 ;
extern tButton2 tKey2 ;
#define TKNOW tKey2.TKNOW
#define TKLST tKey2.TKLST
#define TKLST1 tKey2.TKLST1
//#define KLST2 tKey.TKLST2
//#define KLST3 tKey.TKLST3
#define TKSTB tKey2.TKSTB
#define TKSTBL tKey2.TKSTBL
#define TKAVL tKey2.TKAVL
#define TKAVLP tKey2.TKAVLP
#define TKeyStatu tKey2.TKeyStatu
#define TKLONG tKey2.TKLONG
#define TTconQK tKey2.TTconQK
#define V_TKLOV1 200 //1S确认为长按
#define V_TKLOV2 20//15 //150MS置一次按键标志
//=========================================
typedef struct KFlag2//按键处理标志位定义
{
uint8 Flg1: 1 ;
uint8 Flg2: 1 ;
uint8 Flg3: 1 ;
uint8 Flg4: 1 ;
uint8 Flg5: 1 ;
uint8 Flg6: 1 ;
uint8 Flg7: 1 ;
uint8 Flg8: 1 ;
}tKFlg2 ;
extern tKFlg2 KF2 ;
//#define F_TRdKeyOK KF2.Flg1 //读按键有效
#define F_TKLO KF2.Flg2 //长按有效
//#define F_TKQK1 KF2.Flg4
//#define F_TKQK2 KF2.Flg5
#define F_TKEYOK KF2.Flg6
//===========================================
//================================
extern void ReadTKRefer(uint8 CH_AD,uint8 *a) ;
extern void CheckTouch1(void) ;
extern void CheckTouch2(void) ;
extern void CheckTKey(void) ;
#endif
//文件touchbutton.c
#include "global.h"
#include "touchbutton.h"
//#include "touchbutton.h"
/***********************************************
触摸PWM 500K
当按按键时 电压值抬高
***********************************************/
tButton2 tKey2 ;
tKFlg2 KF2 ;
xdata tTCHBut tCHBut ;
//#define LKEY_ENB //长按键使能
//***************************************
// 函数名称:ReadTKRefer
// 函数功能:读触摸按键参考
// 入口参数:CH_AD 按键AD通道
// 出口参数:*a 对应该按键的AD参考值
//***************************************
void ReadTKRefer(uint8 CH_AD,uint8 *a)
{
uint8 R_Save[3];
uint8 R_Save2[3];
uint16 R_SaveSum = 0 ;
uint8 Tcon = 0 ;
uint8 Tmp1 ;
uint8 i ;
for(i=40;i>0;i--)
{
AdcSwitch(CH_AD) ; //读按键1电压
Tmp1 = ADDH ;
RMov3Data_Byte(R_Save,Tmp1) ;
Tmp1 = C3MidVal(R_Save); //处理位数最大3位 取中值处理
RMov3Data_Byte(R_Save2,Tmp1) ;
Tmp1 = C3MidVal(R_Save2); //处理位数最大3位 取中值处理
R_SaveSum += Tmp1 ;
Tcon ++ ;
if(Tcon >= (1<<3))
{
*a = R_SaveSum>>3 ;
Tcon = 0 ;
R_SaveSum = 0 ;
}
}
}
//***************************************
// 函数名称:CheckTouch1
// 函数功能:检测触摸按键
// 入口参数:无
// 出口参数:无
//***************************************
void CheckTouch1(void)
{
uint8 a[3];
uint8 Tmp1 ;
uint8 TmpAD ; //临时参考值
AdcSwitch(V_ADCH_tch1) ; //读按键电压
a[0] = ADDH ;
_nop_();_nop_();_nop_();_nop_();_nop_();
AdcSwitch(V_ADCH_tch1) ; //读按键电压
a[1] = ADDH ;
_nop_();_nop_();_nop_();_nop_();_nop_();
AdcSwitch(V_ADCH_tch1) ; //读按键电压
a[2] = ADDH ;
//----以下为三次AD值的取中间值处理-----
TmpAD = C3MidVal(a) ;
#ifdef DEF_WATCH_TKREFER
KTVal1 = TmpAD ; //当前按键AD值 -- 用于测试 ^^^^^^^^^^^^^^^^^^^^
#endif
if(!(TKSTB & SETB0)) //此按键此时处于抬起状态 --更改参考值
{
if(TmpAD < KRefer1)
{
Tmp1 = KRefer1 - TmpAD ;
}
else
{
Tmp1 = TmpAD - KRefer1 ;
}
if(Tmp1 >= V_REFER) //更新参考门槛值
{
KTc1 -- ;
if(KTc1 == 0)
{
KTc1 = VT_KTc ;
if(KRefer1 == TmpAD) //KRefer1 = TmpAD ;
{}
else if(KRefer1 < TmpAD)
{
KRefer1 ++ ; //更新参考 每次加减1
}
else
{
KRefer1 -- ;
}
}
}
else
{
KTc1 = VT_KTc ;
}
}
else //if(TKSTB & SETB0) //此按键此时处于被按下状态
{
KTc1 = VT_KTc ;
}
Tmp1 = KRefer1 + V_PRESS ;
if(TmpAD >= Tmp1) //大于参考值的门槛 认为按下
{
TKeyStatu |= SETB0 ;
}
else
{
TKeyStatu &= ~SETB0 ;
}
}
//***************************************
// 函数名称:CheckTouch2
// 函数功能:检测触摸按键
// 入口参数:无
// 出口参数:无
//***************************************
void CheckTouch2(void)
{
uint8 a[3];
uint8 Tmp1 ;
uint8 TmpAD ; //临时参考值
AdcSwitch(V_ADCH_tch2) ; //读按键电压
a[0] = ADDH ;
_nop_();_nop_();_nop_();_nop_();_nop_();
AdcSwitch(V_ADCH_tch2) ; //读按键电压
a[1] = ADDH ;
_nop_();_nop_();_nop_();_nop_();_nop_();
AdcSwitch(V_ADCH_tch2) ; //读按键电压
a[2] = ADDH ;
//----以下为三次AD值的取中间值处理-----
TmpAD = C3MidVal(a) ;
#ifdef DEF_WATCH_TKREFER
KTVal2 = TmpAD ; //当前按键AD值 -- 用于测试 ^^^^^^^^^^^^^^^^^^^^
#endif
if(!(TKSTB & SETB1)) //此按键此时处于抬起状态 --更改参考值
{
if(TmpAD < KRefer2)
{
Tmp1 = KRefer2 - TmpAD ;
}
else
{
Tmp1 = TmpAD - KRefer2 ;
}
if(Tmp1 >= V_REFER) //更新参考门槛值
{
KTc2 -- ;
if(KTc2 == 0)
{
KTc2 = VT_KTc ;
if(KRefer2 == TmpAD) //KRefer1 = TmpAD ;
{}
else if(KRefer2 < TmpAD)
{
KRefer2 ++ ; //更新参考 每次加减1
}
else
{
KRefer2 -- ;
}
}
}
else
{
KTc2 = VT_KTc ;
}
}
else //if(TKSTB & SETB0) //此按键此时处于被按下状态
{
KTc2 = VT_KTc ;
}
Tmp1 = KRefer2 + V_PRESS ;
if(TmpAD >= Tmp1) //大于参考值的门槛 认为按下
{
TKeyStatu |= SETB1 ;
}
else
{
TKeyStatu &= ~SETB1 ;
}
}
//文件maic.c
//======简易例程===========
//*************************************
// 函数名称:Init_TKey
// 函数功能:读取触摸按键的参考值
// 入口参数:无
// 出口参数:无
//***************************************
void Init_TKey(void) //
{
uint8 i ;
for(i=250;i>0;i--) //等待约250MS 让触摸电压稳定
{
Nopt(250) ;
Nopt(250) ;
Nopt(250) ;
Nopt(250) ;
Nopt(250) ;
}
ReadTKRefer(V_ADCH_tch1,&KRefer1) ;
ReadTKRefer(V_ADCH_tch2,&KRefer2) ;
ReadTKRefer(V_ADCH_tch3,&KRefer3) ;
ReadTKRefer(V_ADCH_tch4,&KRefer4) ;
}
//--------------------
void CmdTK1(void)
{
if(!(TKAVL & K_TKON)) return ;
TKAVL &= ~K_TKON ;
//处理按键1按下程序
}
//--------------------
void CmdTK2(void)
{
if(!(TKAVL & K_TKBL)) return ;
TKAVL &= ~K_TKBL ;
//处理按键2按下程序
}
//--------------------------------------
void main(void)
{
Init_TKey() ; //上电读取触摸按键的参考值
while(1)
{
if(F_20MS) //20MS 跑一次
{
F_20MS = 0 ;
CheckTouch1() ; //检测按键1并更新参考值
CheckTouch2() ; //检测按键2并更新参考值
CheckTKey() ;
CmdTK1() ; //处理按键1
CmdTK2() ; //处理按键2
}
}
}
//电路参考如下 PAN2为AD检测口 此图为例,当有按键按下时,PAN2端口的电压会抬高
原文地址:http://blog.csdn.net/libiaojs/article/details/40984889