搜索
写经验 领红包
 > 科技

按键可靠性测试标准(按键的检测方法)

导语:按键可靠性设计及按键检测原理实现

作为宇亚高科UNITEC第二篇文章,是与第一篇文章相互呼应的,在第一篇文章提到了程序任务定时轮询执行,此篇文章我们就讨论如何在程序任务定时轮询执行情况下进行按键检测;

按键电路比较多,很多是直接连接在单片机IO口上,这种方式可靠性是不高的,当雷击或其他从按键引人浪涌电压的时候,很容易击坏单片机IO口,为此以下按键电路方案我们可以使用(如图1),这个在工控类行业性价比适中的,基本原理为:按键KEY1上拉并接入PNP三极管的基极,电容C2的上端KEY_1接入单片机的IO口,IO口应设为上拉,当没有按键按下时(KEY1未按下),三极管基极为高电平,其为截至状态,即KEY_1为高电平;当有按键按下时(KEY1按下),三极管基极为低电平,三极管导通,即KEY_1为低电平,此时通过检测IO口,就能知道按键是否按下;

图1 按键硬件原理

上述为硬件原理,下面重点讨论通过定时任务轮询程序架构下,如何构建按键检测程序:

1、按键IO口初始化

按键应设置为输入上拉,在STM32下面为:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA ,ENABLE);// 使能PORTA时钟GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure);

以上用GPIOA0作为一个检测口的初始化程序段;

2、按键检测源程序如下(void Key_Scan())

/////////////////////////////////

//

//函数名:Key_Scan

//输入: void

//输出:键值

//功能:按键扫描,无按键按下,返回 ALL_KEY_RELEASE,有按键返回键值,未释放按键时连续返回按键值

//

//////////////////////////////////

u8 Key_Val =ALL_KEY_RELEASE ;

u8 Key_Scan(void)

{

static u8 key_state,temp_key;

u8 key_press;

key_press = Key_Press_Value;

switch( key_state )

{

//- 去抖延时

case 0:

if ( key_press < ALL_KEY_RELEASE )

{

key_state = 1;

temp_key = key_press;

}

break;

//- 开关踩下确认

case 1:

if ( key_press == temp_key )

{

key_state = 2;

Key_Val = key_press;

//return key_val;

}

else {

key_state = 0;

}

break;

//- 开关释放

case 2:

if ( key_press == ALL_KEY_RELEASE )

{

key_state = 0;

Key_Val = ALL_KEY_RELEASE ; //所有按键释放

Key_Press_Duration_Cnt = 0;

}

else if( key_press < ALL_KEY_RELEASE )

{

if(Key_Val != key_press)

key_state = 0;

}

break;

}

return Key_Val;

}

按键扫描原理为:程序中每隔10ms进行一次按键扫描,三次扫描确认一次有效按键按下,时间片轮询法程序架构在按键识别时能有效消抖且不会占用整个系统太多时间(相较于delay等待延时消抖);

程序过程如下:在程序第一次启动时,由于无按键按下,Key_Scan()函数无法初始化Key_Val的值,无法满足按键扫描函数返回值要求:无按键时,返回“ALL_KEY_RELEASE”,这个值为无按键按下时键值;此时我们在定义Key_Val这个全局变量时,要赋初值ALL_KEY_RELEASE;当按键按下时,第一次进入按键扫描函数,把键值key_press赋给中间变量temp_key,key_state = 1,10ms后第二次进入按键扫描函数,如果

此次读到键值与上次读到键值一致,说明这是个有效按键,由于是10ms时间进入一次,所以就相当于加入了10ms时间消抖,key_state变为2, Key_Val = key_press,Key_Val装载的为有效按键值;如果第二次读到键值与第一次读到不一致,说明这是个抖动,无有效按键值,Key_Val为“ALL_KEY_RELEASE”,key_state清0;

在第二次按键扫描获得按键按下有效按键时,第三次进入按键会等待按键释放过程,如果按键未释放,在以后每次按键扫描中,都会进入等待按键释放过程,并不断返回有效按键值,当检测到按键值等于“ALL_KEY_RELEASE”时,说明按键释放,key_state = 0; Key_Val = ALL_KEY_RELEASE ,进入新一轮按键检测接收;但还有一种情况,第二次按键扫描已经获得有效按键,在等待按键释放过程中,发现记录有效按键与新读入按键值不等,说明此时有多个按键按下,为进行消抖检测,key_state = 0,再进入新一轮对此次按键值检测判断;

程序流程图如下:

图2 按键扫描程序流程图

总结:以上为按键检测原理,在任务轮询执行情况下,经过三次进入函数检测,已经实现了消抖功能,而不是在按键检测后,加入一个Delay_10ms, 这样MCU停止工作10ms进行等待,这种是不推荐使用的,因为篇幅问题,先讲这么多,下一篇我们重点讲述按键采集回来如何处理、多按键检测以及组合功能键如何实现,大家敬请期待,谢谢大家!

本文内容由小德整理编辑!