本帖最后由 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原创,如需转载或用于商业用途需征得作者同意并注明出处