【CH549评测】第4篇 底层驱动软件评测-触摸按键驱动
<div class='showpostmsg'> 本帖最后由 yang_alex 于 2019-8-3 18:30 编辑<p>【CH549评测】第4篇 底层驱动软件评测-触摸按键驱动</p>
<p> 在上一篇帖子《底层驱动软件对比评测-SPI接口LCD驱动》中我完成了SPI接口的LCD的显示。因为后续DIY项目中要用到按键,以便对相关参数进行设置,以及人机交互时输入。正好CH549评估板上有4个触摸按键可以用到,所以接下来评测一下沁恒CH549评估板的触摸按键驱动。</p>
<p> CH549支持16通道触摸按键,CH0~CH15 分别对应引脚 P1.0~P1.7 和 P0.0~P0.7。目前CH549评估板中使用了的4个触摸按键对应CH549引脚如下图,使用了 P0.0~P0.3引脚,对应着CH8~CH11通道。<br />
沁恒CH549的底层驱动做的很好,很方便调用。我们一起来看一下触摸按键是怎么用起来的。</p>
<p> 首先是把触摸按键TouchKey的底层驱动代码的头文件TouchKey.H加入自己的主程序中:</p>
<pre>
<code>#include "..\Interface\TouchKey\TouchKey.H"</code></pre>
<p> 接下来在主程序中先定义后面触摸按键要用到的变量。</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> 由于要比较检测触摸前后的检测值的大小,所以需要一个绝对值函数(沁恒例子程序中已经有了,拿来用就可以了)</p>
<pre>
<code>/*******************************************************************************
* 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);
}
}</code></pre>
<p> 接下来在主程序中定义一些存储通道数、按键按下标志、触摸通道检测值、比较差值等临时变量,同时对触摸按键做初始化,检测按键未触摸时的初值并存储,以便后续比较。</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 > 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;
}
}
}</code></pre>
<p> 再接下来就是主循环或定时中断里的按键处理程序了:</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> 至于按键效果,比如说长按、短按、按下、抬起等就要靠自己编程了。</p>
<p> 总的来说,沁恒CH549的触摸按键驱动还是让开发人员很容易上手的,大家只需专注在自己要实现的功能上就好了。</p>
<p> 最后,看一下触摸按键实现的触摸效果吧:</p>
<p> </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> <p>我试了一下隔空检测触摸按键没有成功。</p>
lising 发表于 2019-8-3 22:41
我试了一下隔空检测触摸按键没有成功。
<p>这个是要触摸的呀。隔空的话,电容量变化达不到检测门槛。要不你把检测门槛降低试试?</p>
lising 发表于 2019-8-3 22:41
我试了一下隔空检测触摸按键没有成功。
<p>你用什么做隔空?我想做个实验,东西不好找啊!</p>
本帖最后由 lising 于 2019-8-8 10:09 编辑
<div class="quote">
<blockquote><font size="2"><a href="forum.php?mod=redirect&goto=findpost&pid=2892031&ptid=1084454" target="_blank"><font color="#999999">yang_alex 发表于 2019-8-6 07:03</font></a></font> 你用什么做隔空?我想做个实验,东西不好找啊!</blockquote>
</div>
<p>没及时回复,非常抱歉!</p>
<p> 当时考虑改制触摸台灯,想着是将触摸部分放在台灯壳体内,表面看不到按键,只是在壳体表面做个标识,壳体厚度估计在2~4mm。于是在开发板触摸按键上覆盖了一张卡片(见下图),检测不到;调整了DEMO中的一些参数依然没成功,随后又尝试在手指上套个塑料袋,隔着一层塑料薄膜触摸也没有成功。</p>
<p></p>
<p> 由于没有足够的理论知识支撑,调试就中止了。于是就准备使用笨办法,费了很大劲找了三颗老式的按钉替代进行触摸,结果忙了半天旧台灯被老婆收拾房间给处理了<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>
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>
<p>我最近就在用549开发一款触摸数字键盘,现在就快给客户逼死了,16个键的触摸,加了个2.5mm的亚克力后触摸灵敏度下降了太多了,原来1000差值,现在需在调至30,还是有几些健不灵敏,再低就很多误触,抗干扰极差!已经折腾了2天了!哎!要不是看到它是一颗芯片的方案,价格又挺好,也不至于现在,卡这里不上不下的!</p>
页:
[1]