5555|6

1305

帖子

0

TA的资源

纯净的硅(高级)

楼主
 

【CH549评测】第4篇 底层驱动软件评测-触摸按键驱动 [复制链接]

本帖最后由 yang_alex 于 2019-8-3 18:30 编辑

【CH549评测】第4篇 底层驱动软件评测-触摸按键驱动

        在上一篇帖子《底层驱动软件对比评测-SPI接口LCD驱动》中我完成了SPI接口的LCD的显示。因为后续DIY项目中要用到按键,以便对相关参数进行设置,以及人机交互时输入。正好CH549评估板上有4个触摸按键可以用到,所以接下来评测一下沁恒CH549评估板的触摸按键驱动。

      CH549支持16通道触摸按键,CH0~CH15 分别对应引脚 P1.0~P1.7 和 P0.0~P0.7。目前CH549评估板中使用了的4个触摸按键对应CH549引脚如下图,使用了 P0.0~P0.3引脚,对应着CH8~CH11通道。

       沁恒CH549的底层驱动做的很好,很方便调用。我们一起来看一下触摸按键是怎么用起来的。

       首先是把触摸按键TouchKey的底层驱动代码的头文件TouchKey.H加入自己的主程序中:

#include "..\Interface\TouchKey\TouchKey.H"

       接下来在主程序中先定义后面触摸按键要用到的变量。

#pragma  NOAREGS
UINT16 PowerValue[16];          //保存触摸按键上电未触摸值
UINT8 PressedKey;  
volatile UINT16 Press_Flag = 0;                         //按下标志位
UINT8C CPW_Table[16] = { 30,30,30,30, 30,30,30,30,      //与板间电容有关的参数,分别对应每个按键
                         30,30,30,30, 30,30,30,30,}                       };

     由于要比较检测触摸前后的检测值的大小,所以需要一个绝对值函数(沁恒例子程序中已经有了,拿来用就可以了)

/*******************************************************************************
* Function Name  : ABS
* Description    : 求两个数差值的绝对值
* Input          : a,b
* Output         : None
* Return         : 差值绝对值
*******************************************************************************/
UINT16 ABS(UINT16 a,UINT16 b)
{
    if(a>b)
    {
        return (a-b);
    }
    else
    {
        return (b-a);
    }
}

     接下来在主程序中定义一些存储通道数、按键按下标志、触摸通道检测值、比较差值等临时变量,同时对触摸按键做初始化,检测按键未触摸时的初值并存储,以便后续比较。

    UINT8 ch;
    UINT16 value;
    UINT16 err;
    //触摸按键初始化	
    TouchKey_Init();
    Press_Flag = 0;                                                //无按键按下
    /* 获取按键初值 */
    for(ch = 8; ch!=12; ch++)
    {
        PowerValue[ch] = TouchKeySelect( ch,CPW_Table[ch] );
    }	

接下来就是主循环或定时中断里的按键检测程序了:

  // 按键检测 //
  for(ch = 8; ch!=12; ch++)
  {
    value = TouchKeySelect( ch,CPW_Table[ch] );
    err = ABS(PowerValue[ch],value);
    if( err > DOWM_THRESHOLD_VALUE )            //差值大于阈值,认为按下
    {
        if((Press_Flag & (1<<ch)) == 0)         //说明是第一次按下
        {
            // 按键按下处理程序 //
        }
        Press_Flag |= (1<<ch);

    }
    else if( err < UP_THRESHOLD_VALUE )         //说明抬起或者未按下
    {
        if(Press_Flag & (1<<ch))                //刚抬起
        {
            Press_Flag &= ~(1<<ch);
            // 按键释放处理程序  //
            PressedKey = ch;
        }
    }
  }

       再接下来就是主循环或定时中断里的按键处理程序了:

    // 按键处理 //		
    switch (PressedKey) 
    {
        case 8:
                    LCD_ShowNum(145,70,1,16,0);
                    PressedKey=0;
                    break;
        case 9:
                    LCD_ShowNum(145,70,2,16,0);
                    PressedKey=0;					
                    break;
        case 10:
                    LCD_ShowNum(145,70,3,16,0);
                    PressedKey=0;					
                    break;				
        case 11:
                    LCD_ShowNum(145,70,4,16,0);
                    PressedKey=0;					
                    break;				
    }
				

      至于按键效果,比如说长按、短按、按下、抬起等就要靠自己编程了。

      总的来说,沁恒CH549的触摸按键驱动还是让开发人员很容易上手的,大家只需专注在自己要实现的功能上就好了。

      最后,看一下触摸按键实现的触摸效果吧:

                                     

此内容由EEWORLD论坛网友yang_alex原创,如需转载或用于商业用途需征得作者同意并注明出处

此帖出自单片机论坛

最新回复

我最近就在用549开发一款触摸数字键盘,现在就快给客户逼死了,16个键的触摸,加了个2.5mm的亚克力后触摸灵敏度下降了太多了,原来1000差值,现在需在调至30,还是有几些健不灵敏,再低就很多误触,抗干扰极差!已经折腾了2天了!哎!要不是看到它是一颗芯片的方案,价格又挺好,也不至于现在,卡这里不上不下的!   详情 回复 发表于 2021-11-23 12:11
点赞 关注
 

回复
举报

821

帖子

0

TA的资源

一粒金砂(高级)

沙发
 

我试了一下隔空检测触摸按键没有成功。

此帖出自单片机论坛

点评

你用什么做隔空?我想做个实验,东西不好找啊!  详情 回复 发表于 2019-8-6 07:03
这个是要触摸的呀。隔空的话,电容量变化达不到检测门槛。要不你把检测门槛降低试试?  详情 回复 发表于 2019-8-4 11:00
 
 

回复

1305

帖子

0

TA的资源

纯净的硅(高级)

板凳
 
lising 发表于 2019-8-3 22:41 我试了一下隔空检测触摸按键没有成功。

这个是要触摸的呀。隔空的话,电容量变化达不到检测门槛。要不你把检测门槛降低试试?

此帖出自单片机论坛
 
 
 

回复

1305

帖子

0

TA的资源

纯净的硅(高级)

4
 
lising 发表于 2019-8-3 22:41 我试了一下隔空检测触摸按键没有成功。

你用什么做隔空?我想做个实验,东西不好找啊!

此帖出自单片机论坛

点评

没及时回复,非常抱歉!        当时考虑改制触摸台灯,想着是将触摸部分放在台灯壳体内,表面看不到按键,只是在壳体表面做个标识,壳体厚度估计在2~4mm。于是在开发板触摸按键上覆盖了一张  详情 回复 发表于 2019-8-8 10:08
 
 
 

回复

821

帖子

0

TA的资源

一粒金砂(高级)

5
 
本帖最后由 lising 于 2019-8-8 10:09 编辑
yang_alex 发表于 2019-8-6 07:03 你用什么做隔空?我想做个实验,东西不好找啊!

没及时回复,非常抱歉!

       当时考虑改制触摸台灯,想着是将触摸部分放在台灯壳体内,表面看不到按键,只是在壳体表面做个标识,壳体厚度估计在2~4mm。于是在开发板触摸按键上覆盖了一张卡片(见下图),检测不到;调整了DEMO中的一些参数依然没成功,随后又尝试在手指上套个塑料袋,隔着一层塑料薄膜触摸也没有成功。

       由于没有足够的理论知识支撑,调试就中止了。于是就准备使用笨办法,费了很大劲找了三颗老式的按钉替代进行触摸,结果忙了半天旧台灯被老婆收拾房间给处理了

此帖出自单片机论坛

点评

哈哈,就是想做触摸台灯嘛。要想实现你的功能的话,可能是要专门的触摸检测装置吧。可以和官方技术沟通下,多学习多了解。  详情 回复 发表于 2019-8-26 14:12
 
 
 

回复

46

帖子

0

TA的资源

一粒金砂(中级)

6
 
lising 发表于 2019-8-8 10:08 yang_alex 发表于 2019-8-6 07:03 你用什么做隔空?我想做个实验,东西不好找啊! 没及时回复,非常 ...

哈哈,就是想做触摸台灯嘛。要想实现你的功能的话,可能是要专门的触摸检测装置吧。可以和官方技术沟通下,多学习多了解。

此帖出自单片机论坛
 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(中级)

7
 

我最近就在用549开发一款触摸数字键盘,现在就快给客户逼死了,16个键的触摸,加了个2.5mm的亚克力后触摸灵敏度下降了太多了,原来1000差值,现在需在调至30,还是有几些健不灵敏,再低就很多误触,抗干扰极差!已经折腾了2天了!哎!要不是看到它是一颗芯片的方案,价格又挺好,也不至于现在,卡这里不上不下的!

此帖出自单片机论坛
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表