#申请原创#
多功能按键的思路是通过计算按键按下的时间来实现多个功能,按照我的测试,一个按键可以轻松地实现三种以上的状态,即:点按(按下后迅速释放)、正常(按下后稍等片刻释放)、长按(按下约2秒后释放)、超长按(按下3秒后释放)。实现的办法是在主循环中轮询按键状态,当按键按下时让定时器进行计数,按键释放时停止计数,此时根据计数值就可以分辨出按键动作的状态。
我使用的是TMR2,定时时间为25毫秒:
除了核心板上的用户Key0外,我在扩展板上还增加了一个按键,接在RC2引脚上,同样也是下拉触发:
每个按键定义两个全局变量,如Key0ok表示按键状态,Key0s用于定时器计数。在定时器中断函数中根据Key0ok和Key1ok的标志勾确定是否进行计数,代码如下图:
在主循环中对按键状态进行判断和对按键结果进行处理,代码如下:
Key0_SetDigitalInput();
Key1_SetDigitalInput();
while (1)
{
// Add your application code
if(0==Key0_GetValue()){
DELAY_microseconds(20); //延时消抖
Key0s = 0;
if(0==Key0_GetValue()){
Key0ok = 1;
while(!Key0_GetValue());
Key0ok = 0;
}
}
if(0==Key1_GetValue()){
DELAY_microseconds(20); //延时消抖
Key1s = 0;
if(0==Key0_GetValue()){
Key1ok = 1;
while(!Key1_GetValue());
Key1ok = 0;
}
}
//显示按键长短值
if(Key0s>0){
LCD_write_value(150,4,3,0,0,Key0s);
Key0s = 0;
}
if(Key1s>0){
LCD_write_value(150,5,3,0,0,Key1s);
Key1s = 0;
}
测试过程的动画如下,按键数值显示的屏幕右部:
|