矩阵键盘扫描时遇到了问题

2019-07-15 19:55发布

C语言编程,利用51单片机控制一些东西,矩阵键盘扫描时遇到了问题,可以计算出键值号,比如key=1,但是如果我再按一下1号键,key还是等于1,那么我该怎么判断同一个键被连续按了多少次呢?热心人帮帮我,谢谢了!!!作为奖励给大家一本很好的电子书,《世界是平的--21世纪简史》
The World is Flat.pdf 下载积分: 积分 -1 分
1.6 MB, 下载次数: 48, 下载积分: 积分 -1 分
世界是平的(完整).pdf 下载积分: 积分 -1 分
1.31 MB, 下载次数: 50, 下载积分: 积分 -1 分
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
13条回答
bj2008wyou
2019-07-16 18:08
本帖最后由 bj2008wyou 于 2014-5-4 21:34 编辑

平时的按键大多数也是你说的按一下松开就会弹起来啊。你可以在被按下的时候不触发,只有松开的时候才触发按键,这是就可以计数+1,同一个键按多少次就是会加多少啊,你只需要定义好一个时间间隔阈值,明确要按多快才会加1,又在超过多久后计数会清零,

贴个供参考,但注意,该程序是人家的,你可以搜索MS3看,摘自里面,但有经过小部分修改,这只为说明不用delay()的。
对于一些有按下处理和释放处理的按键扫描程序,本程序可能不太适用

void KeyScan(void)
{
    static  INT16U  keyCounter = 0u;
    static  INT08U  keyOldVal = KEY_NONE;
    static  bool    isLongKeyPress = FALSE;
    INT08U          keyNewVal;

    keyNewVal = KeyRead();
    if (keyNewVal == KEY_NONE)
    {
        if (keyCounter == KEY_LONG_TIME)
        {
            isLongKeyPress = FALSE;
        }
        else if (keyCounter >= KEY_SHORT_TIME)
        {
            keyActionVal = KeyMap(SHORT_KEY_MODE, keyOldVal);
        }
        keyCounter = 0u;
        keyOldVal = keyNewVal;
    }
    else
    {
        keyCounter++;
        if (keyCounter <= KEY_DEBOUNCE_TIME)
        {
            if (keyOldVal != keyNewVal)
            {
                keyOldVal = keyNewVal;
                keyCounter = 0u;
             }
        }
        else if (keyCounter >= KEY_LONG_TIME)
        {
            keyCounter = KEY_LONG_TIME;
            if (isLongKeyPress == FALSE)
            {
                isLongKeyPress = TRUE;                                                               
                keyActionVal = KeyMap(LONG_KEY_MODE, keyOldVal);
            }            
        }
    }
}

一周热门 更多>