标题:按键时间长短问题
只看楼主
mingzxcv
Rank: 2
等 级:论坛游民
帖 子:11
专家分:17
注 册:2009-8-6
结帖率:100%
已结贴  问题点数:20 回复次数:6 
按键时间长短问题
假设RA4引脚有一按键,按一下,输入一个低电平,Count ++
   if(RA4)
    {
    if(!PreRA4)
       {
       Count ++;
       }
      PreRA4 = 1;
    }
    else
    {
    PreRA4 = 0;
    }
那要是RA4引脚输入的低电平持续超过比如2S,会发生A事,那这段程序改怎么写?就是需要判断低电平持续时间的那段程序

[ 本帖最后由 mingzxcv 于 2009-8-17 14:33 编辑 ]
搜索更多相关主题的帖子: TAG 
2009-08-15 09:00
mingzxcv
Rank: 2
等 级:论坛游民
帖 子:11
专家分:17
注 册:2009-8-6
得分:0 
谁帮我看看这个问题,谢谢大家……
2009-08-17 10:57
RockCarry
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:13
帖 子:662
专家分:58
注 册:2005-8-5
得分:20 
这个很容易
 
// 按键常量定义
#define KEY_NO_PRESSED    0
#define KEY_SHORT_PRESSED (1 << 0)
#define KEY_LONG_PRESSED  (1 << 1)
 
// 取得按键值
int getkey(void)
{
    int  timeout;
    BOOL flag;
 
    // a while loop to check if there is a key or not
    timeout = 100;   // 检测 100 次去抖动
    flag    = FALSE; // FALSE means no key pressed
    while (timeout--)
    {
        if (!RA4)
        {
            flag = TRUE;
            break;
        }
        delay_us(10); // delay_us 为 us 级的延时函数
    }
 
    // there is no key pressed
    if (!flag) return 0;
 
    // 判断按键是长按还是短按
    timeout = 2000;
    flag    = FALSE; // FALSE means long pressed
    while (timeout--)
    {
        if (RA4)
        {
            flag = TRUE;
            break;
        }
        delay_us(1000);
    }
 
    if (flag) return KEY_SHORT_PRESSED;
    else return KEY_LONG_PRESSED;
}
 
 
2009-08-17 11:55
mingzxcv
Rank: 2
等 级:论坛游民
帖 子:11
专家分:17
注 册:2009-8-6
得分:0 
明白了,谢谢
2009-08-17 12:22
mingzxcv
Rank: 2
等 级:论坛游民
帖 子:11
专家分:17
注 册:2009-8-6
得分:0 
还是不行啊…………
2009-08-17 14:07
RockCarry
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:13
帖 子:662
专家分:58
注 册:2005-8-5
得分:0 
// 按键常量定义
#define KEY_NO_PRESSED    0
#define KEY_SHORT_PRESSED (1 << 0)
#define KEY_LONG_PRESSED  (1 << 1)

// 取得按键值
int getkey(void)
{
    int  timeout;
    BOOL flag;

    // there is no key pressed
    if (RA4) return 0;

    // 判断按键是长按还是短按
    timeout = 2000;
    flag    = FALSE; // FALSE means long pressed
    while (timeout--)
    {
        if (RA4)
        {
            flag = TRUE;
            break;
        }
        delay_us(1000);
    }

    if (flag) return KEY_SHORT_PRESSED;
    else return KEY_LONG_PRESSED;
}

void main(void)
{
    int key;

    while (1)
    {
        /* wait for key press event */
        do { key = getkey(); } while (key == KEY_NO_PRESSED);

        /* handle key press event */
        switch (key)
        {
        case KEY_SHORT_PRESSED:
            /* handle key short pressed */
            /* todo.. */
            break;

        case KEY_LONG_PRESSED:
            /* handle key long pressed */
            /* todo.. */
            break;
        }
    }
}

当然这个代码是不考虑操作系统的存在,采用 IO 口查询的方式来做的。如果你选用了 OS 再加上一个下降沿的中断,效率会更加高一些。

[ 本帖最后由 RockCarry 于 2009-8-17 14:49 编辑 ]
2009-08-17 14:46
mingzxcv
Rank: 2
等 级:论坛游民
帖 子:11
专家分:17
注 册:2009-8-6
得分:0 
Thanks for RockCarry.
2009-08-18 09:25



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-282710-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.028512 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved