yang_alex 发表于 2019-8-3 18:30

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

<div class='showpostmsg'> 本帖最后由 yang_alex 于 2019-8-3 18:30 编辑

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

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

<p>&nbsp; &nbsp; &nbsp; CH549支持16通道触摸按键,CH0~CH15 分别对应引脚 P1.0~P1.7 和 P0.0~P0.7。目前CH549评估板中使用了的4个触摸按键对应CH549引脚如下图,使用了 P0.0~P0.3引脚,对应着CH8~CH11通道。<br />
&nbsp; &nbsp; &nbsp; &nbsp;沁恒CH549的底层驱动做的很好,很方便调用。我们一起来看一下触摸按键是怎么用起来的。</p>

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

<pre>
<code>#include "..\Interface\TouchKey\TouchKey.H"</code></pre>

<p>&nbsp; &nbsp; &nbsp; &nbsp;接下来在主程序中先定义后面触摸按键要用到的变量。</p>

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

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

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

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

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

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

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

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

<p>&nbsp; &nbsp; &nbsp; &nbsp;再接下来就是主循环或定时中断里的按键处理程序了:</p>

<pre>
<code>    // 按键处理 //               
    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;                               
    }
                                </code></pre>

<p>&nbsp; &nbsp; &nbsp; 至于按键效果,比如说长按、短按、按下、抬起等就要靠自己编程了。</p>

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

<p>&nbsp; &nbsp; &nbsp; 最后,看一下触摸按键实现的触摸效果吧:</p>

<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</p>

<p><b><font color="#5E7384">此内容由EEWORLD论坛网友<font size="3">yang_alex</font>原创,如需转载或用于商业用途需征得作者同意并注明出处</font></b></p>
</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                                                                                (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

lising 发表于 2019-8-3 22:41

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

yang_alex 发表于 2019-8-4 11:00

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

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

yang_alex 发表于 2019-8-6 07:03

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

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

lising 发表于 2019-8-8 10:08

本帖最后由 lising 于 2019-8-8 10:09 编辑

<div class="quote">
<blockquote><font size="2"><a href="forum.php?mod=redirect&amp;goto=findpost&amp;pid=2892031&amp;ptid=1084454" target="_blank"><font color="#999999">yang_alex 发表于 2019-8-6 07:03</font></a></font> 你用什么做隔空?我想做个实验,东西不好找啊!</blockquote>
</div>

<p>没及时回复,非常抱歉!</p>

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

<p></p>

<p>&nbsp; &nbsp; &nbsp; &nbsp;由于没有足够的理论知识支撑,调试就中止了。于是就准备使用笨办法,费了很大劲找了三颗老式的按钉替代进行触摸,结果忙了半天旧台灯被老婆收拾房间给处理了<img height="50" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/red/Animaux-Renard 2-5.gif" width="50" /></p>

<p></p>

我芯永恒 发表于 2019-8-26 14:12

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


没及时回复,非常 ...

<p>哈哈,就是想做触摸台灯嘛。要想实现你的功能的话,可能是要专门的触摸检测装置吧。<img height="50" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/onion/Onion--2.gif" width="50" />可以和官方技术沟通下,多学习多了解。</p>

albertsou 发表于 2021-11-23 12:11

<p>我最近就在用549开发一款触摸数字键盘,现在就快给客户逼死了,16个键的触摸,加了个2.5mm的亚克力后触摸灵敏度下降了太多了,原来1000差值,现在需在调至30,还是有几些健不灵敏,再低就很多误触,抗干扰极差!已经折腾了2天了!哎!要不是看到它是一颗芯片的方案,价格又挺好,也不至于现在,卡这里不上不下的!</p>
页: [1]
查看完整版本: 【CH549评测】第4篇 底层驱动软件评测-触摸按键驱动