单片机处理触摸按键例程

发布者:脑力激荡最新更新时间:2017-08-17 来源: eefocus关键字:单片机  触摸  按键 手机看文章 扫描二维码
随时随地手机看文章
//文件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端口的电压会抬高

单片机处理触摸按键例程0


关键字:单片机  触摸  按键 引用地址:单片机处理触摸按键例程

上一篇:单片机低功耗设计小结
下一篇:MCU如何协同单片机进行仿真?

推荐阅读最新更新时间:2024-03-16 15:35

PIC单片机的特点及应用
    摘要: 介绍了Microchip公司的PIC单片机PIC16C73的结构特点和工作原理,给出了用PIC16C73设计智能售电系统中PIC通信通道的硬件系统电路和系统软件的设计方法。     关键词: 单片机 哈佛结构 通信 PIC16C73 1 概述 Microchip公司生产的PIC16C72是一款基于EPROM的8位高性能微控制器。与其它价格相当的微控制器相比,它在执行速度和代码压缩方面都有很大的改进。由于随时可以买到需要的OPT(一次性编程)产品,因而缩短了利用PIC16C73进行产品设计开发的周期。 PIC16C73微控制器所具有的优越性能主要归功于它的精简指令集(RISC)和所采用的
[工业控制]
如何正确选择低功耗MCU
嵌入式微控制器 (MCU)的功耗在当今电池供电应用中正变得越来越举足轻重。大多 MCU 芯片厂商都提供低功耗产品,但是选择一款最适合您自己应用的产品并非易事,并不像对比数据表前面的数据那么简单。我们必须详细对比 MCU 功能,以便找到功耗最低的产品,这些功能包括:   断电模式   定时系统   事件驱动功能   片上外设   掉电检测与保护   漏电流   处理效率   在低功耗设计中,平均电流消耗往往决定电池寿命。例如,如果某个应用采用额定电流为 400mAh 的 Eveready 高电量 9V 1222 型电池的话,要提供一年的电池寿命其平均电流消耗必须低于 400mAh/8760h,即45.7uA。图
[单片机]
如何正确选择低功耗<font color='red'>MCU</font>
89C51单片机内部结构深度解析二
P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。一个TTL门电流为16mA,当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的低八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。 P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为低八位地址接收。 P2口:P2口为一个内部上拉电阻的8位双向I/O
[单片机]
基于单片机的脉冲快速充电系统的设计
采用的是反激式的开关电源电路,反激式开关电源比正激式开关电源少用了一个大的储能滤波电感,以及一个续流二极管,因此,反激式开关电源的电路比较简单,且体积小、成本低。此外,反激式开关电源输出电压受占空比的调制幅度,相对于正激式开关电源来要高很多,因此,反激式开关电源要求调控占空比的误差信号幅度要比较低,误差信号放大器的增益和动态范围也要较小。正是由于这些优点,反激式开关电源在目前家电领域中被广泛的使用。其电源电路如图1所示。 UC3842是目前比较理想的新型的脉宽调制器,因此开关电源电路控制芯片采用UC3842。由该集成电路构成的开关稳压电源与电压控制型脉宽调制开关稳压电源相比具有以下特点:1)微调的振荡器放电电流,可精确控制占空比;2
[单片机]
基于<font color='red'>单片机</font>的脉冲快速充电系统的设计
金融危机下的MCU技术发展趋势
全球金融风暴吹到了 MCU 市场了, 2008 年全球 MCU 市场增长缓慢,欧美市场发展动力不足,一直引领全球增长的中国 MCU 市场,由于出口不畅,中国电子产品制造增长放缓,预计 2009 年中国 MCU 市场增速进一步放缓。最近赛迪顾问的数据显示 2008 年中国市场的增长只有 5.8% , 国际半导体行业中的MCU巨头处境不容乐观, iSuppli 公司资料显示 2007 年中国市场中排名前 10 大 MCU 供应商是瑞萨科技 、飞思卡尔半导体、 Microchip Technology 、 NEC 电子 、英飞凌、东芝、 Atmel 、三星 、恩智浦半导体 (NXP) 和意法半导体。金融危机后这些企业多数都
[单片机]
单片机典型论文竞赛题精华集锦(七)
单片机论文十三 频率特性测试仪   一、题目   频率特性测试仪   二、任务   设计并制作一个频率特性测试系统,包含测试信号源、被测网络、检波及显示三部分。      三、要求   1.基本要求   (1)制作幅频特性测试仪   a、频率范围:100Hz~100kHz;   b、频率步进:10Hz;   c、频率稳定度:10-4;   d、测量精度:5% ;   e、能在全频范围和特定频率范围内自动步进测量,可手动预置测量范围及步进频率值;   f、LED显示,频率显示为5位,电压显示为3位,并能打印输出。   (2)制作一被测网络   a、电路型式:阻容双T网络;   b、中心频率:5kHz
[模拟电子]
<font color='red'>单片机</font>典型论文竞赛题精华集锦(七)
单片机+CPLD结构体系在电子设计中的应用
自20世纪80年代单片机引入我国以来,学习和应用单片机的热潮始终不减,特别是MCS51系列。这是由单片机的特点决定的。实际上,从单片机/CPLD应用通用数字集成电路系统,到广泛应用单片机,是我国电子设计在智能化应用水平上质的飞跃。据统计分析,单片机的销量单片机/CPLD到目前为止依然逐年递增,而且在很长一段的时间内,单片机依然会是电子设计的主角(虽然这一地址已经受到了CPLD的挑战)。 1 纯单片机系统优缺点 ①大量单片机/CPLD的外围芯片和接口电路使得单片机应用系统的设计变得简单而且快捷,新型单片机的上市和高级语言的支持(如C51)进一步延长了单片机的寿命。 ②长期稳定的发展和使单片机性价比非常高,而且单片机/CPL
[嵌入式]
<font color='red'>单片机</font>+CPLD结构体系在电子设计中的应用
使用STM32单片机点亮LED
有一人,登场于金庸先生的《神雕侠侣》,以大理段氏“一阳指”自成一派,武学修为登峰造极,“天下五绝”之一,号称“南帝”,他就是“一灯大师”。如今,武林中逐渐被遗忘的“一灯大师”,却活跃在另一个行业——嵌入式开发中。 传说,每一个成功的MCU(俗称单片机)开发组中,都有一名“一灯大师”,他精通所有开发板的点灯方法,对于企业引入的新开发板,总是勤学苦练,从点灯开始,快速掌握新开发板的编程要点,带领团队走向胜利。 成为“一灯大师”,离不开持续的修行,离不开对一招一式的勤学苦练。本文将讲解如何通过编程来控制STM32点亮一个LED。 学习环境: 1.软件:Keil5 2.硬件:STM32开发板(笔者使用信盈达公司的M4开发板,芯片型
[单片机]
使用STM32<font color='red'>单片机</font>点亮LED
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved