OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5247|回复: 4

触摸按键实验,触摸按键驱动代码不太理解求解释

[复制链接]

11

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2013-6-13
在线时间
5 小时
发表于 2013-6-19 17:37:47 | 显示全部楼层 |阅读模式

 驱动代码:#define TPAD_ARR_MAX_VAL  0XFFFF //最大的ARR (为什么设最大)               //触摸驱动
vu16 tpad_default_val=0;//空载的时候(没有手按下),计数器需要的时间


//初始化触摸按键
//获得空载的时候触摸按键的取值.
//返回值:0,初始化成功;1,初始化失败

 

u8 TPAD_Init()
{
 u16 buf[10];  (定义这个数组什么原理
 u16 temp;
 u8 j,i;
 TIM5_CH2_Cap_Init(TPAD_ARR_MAX_VAL,SystemCoreClock/1000000-1);//以1Mhz的频率计数
 for(i=0;i<10;i++)//连续读取10次(为什么读10次

 {    
  buf=TPAD_Get_Val();
  delay_ms(10);    
 }       
 for(i=0;i<9;i++)//排序
 {
  for(j=i+1;j<10;j++)
  {
   if(buf>buf[j])//升序排列  (为什么要重新排序
   {
    temp=buf;
    buf=buf[j];
    buf[j]=temp;
   }
  }
 }
 temp=0;
 for(i=2;i<8;i++)temp+=buf;//取中间的8个数据进行平均 去中间值做平均数为什么
 tpad_default_val=temp/6;
 printf("tpad_default_val:%d\r\n",tpad_default_val); 
 if(tpad_default_val>TPAD_ARR_MAX_VAL/2)return 1;//初始化遇到超过TPAD_ARR_MAX_VAL/2的数值,不正常! (为什么要与最大的平均值作比较
 return 0;                   
}
//复位一次
void TPAD_Reset(void)
{
   GPIO_InitTypeDef  GPIO_InitStructure;
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //使能PA端口时钟
 
 //设置GPIOA.1为推挽使出
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;     //PA1 端口配置
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;    //推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  GPIO_ResetBits(GPIOA,GPIO_Pin_1);       //PA.1输出0,放电

 delay_ms(5);

 TIM_SetCounter(TIM5,0);  //归0
 TIM_ClearITPendingBit(TIM5, TIM_IT_CC2|TIM_IT_Update); //清除中断标志
 //设置GPIOA.1为浮空输入
 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;  //浮空输入
 GPIO_Init(GPIOA, &GPIO_InitStructure);

   
}
//得到定时器捕获值
//如果超时,则直接返回定时器的计数值.
u16 TPAD_Get_Val(void)
{      
 TPAD_Reset();
 while(TIM_GetITStatus(TIM5, TIM_IT_CC2) != RESET)//等待溢出
 {
  if(TIM_GetCounter(TIM5)>TPAD_ARR_MAX_VAL-500)return TIM_GetCounter(TIM5);//超时了,直接返回CNT的值(为什么要减去500
 }; 
 return TIM_GetCapture2(TIM5);  
}   
//读取n次,取最大值
//n:连续获取的次数
//返回值:n次读数里面读到的最大读数值
u16 TPAD_Get_MaxVal(u8 n)
{
 u16 temp=0;
 u16 res=0;
 while(n--)
 {
  temp=TPAD_Get_Val();//得到一次值
  if(temp>res)res=temp;
 };
 return res;

//扫描触摸按键
//mode:0,不支持连续触发(按下一次必须松开才能按下一次);1,支持连续触发(可以一直按下)
//返回值:0,没有按下;1,有按下;           
#define TPAD_GATE_VAL  80 //触摸的门限值,也就是必须大于tpad_default_val+TPAD_GATE_VAL,才认为是有效触摸.(为什么定义成80
u8 TPAD_Scan(u8 mode)
{
 static u8 keyen=0; //0,可以开始检测;>0,还不能开始检测 
 u8 res=0;
 u8 sample=3;  //默认采样次数为3次 
 u16 rval;
 if(mode)
 {
  sample=6; //支持连按的时候,设置采样次数为6次
  keyen=0; //支持连按  
 }
 rval=TPAD_Get_MaxVal(sample);
 if(rval>(tpad_default_val+TPAD_GATE_VAL))//大于tpad_default_val+TPAD_GATE_VAL,有效
 {      
    rval=TPAD_Get_MaxVal(sample);  
  if((keyen==0)&&(rval>(tpad_default_val+TPAD_GATE_VAL)))//大于tpad_default_val+TPAD_GATE_VAL,有效
  {
   res=1;
  }   
  //printf("r:%d\r\n",rval);                    
  keyen=5;    //至少要再过5次之后才能按键有效  
 }else if(keyen>2)keyen=2;  //如果检测到按键松开,则直接将次数将为2,以提高响应速度
 if(keyen)keyen--;                                  
 return res;

谢谢 能帮我 解释下检测是否有触摸的原理吗?软件如何检测的,下图看懂,但是软件设计是怎样的原理呢?

 


谢谢

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

42

主题

173

帖子

0

精华

高级会员

Rank: 4

积分
549
金钱
549
注册时间
2013-6-18
在线时间
59 小时
发表于 2013-6-19 19:09:29 | 显示全部楼层
u16 buf[10];  (定义这个数组什么原理)减少误差,就好比裁判打分,去掉最高分和最低分求平均值
只为摆正你的倒影,我倾倒了整个世界。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-6-19 19:23:24 | 显示全部楼层
所谓实践得出,你可以理解为实验数据。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

11

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2013-6-13
在线时间
5 小时
 楼主| 发表于 2013-6-20 08:52:12 | 显示全部楼层
回复【2楼】菜鸟鸡哥:
谢谢
回复 支持 反对

使用道具 举报

11

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2013-6-13
在线时间
5 小时
 楼主| 发表于 2013-6-20 08:52:30 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
谢谢
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-18 14:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表