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

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
1楼-- · 2019-07-16 13:32
 精彩回答 2  元偷偷看……
blueli
2楼-- · 2019-07-16 16:18
bj2008wyou 发表于 2014-5-3 19:31
不是可以定义变量来计数吗?
如果不支持连按,或者你可以等按键释放以后才加1,这样的实现不难吧……
另外 ...

是那种按一下就又弹起来的按键,这个程序是用来判断键号值的,十个按键依次对应0到9 ,你写的“不是这样的用delay()”是什么意思?
bj2008wyou
3楼-- · 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);
            }            
        }
    }
}
BBOYBL
4楼-- · 2019-07-16 19:46
呵呵楼主的键盘扫描是通过先读行值在读列值 然后在通过算法返回键值的!!至于如何判断按键被按了几次容我再想想!
BBOYBL
5楼-- · 2019-07-16 23:23
这样吧 麻烦点
unsigned cha A[9]={};//定义一个全局变量记录KEY被按的次数
这里加这个
   while(P2!=0X0F);
   key=hang*4+lie;
SWITCH(KEY)
{
        CASE 1://判断KEY值
        A[0]=A[0]+1;
        break;
        ''''''''
        ''''''''
        //写9个
}
//要知道哪个键被按了多少次 读数组A[]的元素
blueli
6楼-- · 2019-07-16 23:31
 精彩回答 2  元偷偷看……

一周热门 更多>