#申请原创#
多功能按键的思路是通过计算按键按下的时间来实现多个功能,按照我的测试,一个按键可以轻松地实现三种以上的状态,即:点按(按下后迅速释放)、正常(按下后稍等片刻释放)、长按(按下约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;
- }
-
测试过程的动画如下,按键数值显示的屏幕右部:
|