新型的按键扫描程序能不能支持多按键啊

2020-01-19 19:35发布

在网上论坛经常看到这个新型的按键扫描程序,
新型的按键扫描程序

核心算法:
unsigned char Trg;

unsigned char Release;

unsigned char Cont;

void KeyRead( void )

{

    unsigned char ReadData = PINB^0xff;      // 1  读键值

Trg = ReadData & (ReadData ^ Cont);      // 2  得到按下触发值

Release=(ReadData^Trg^Cont);            //3   得到释放触发值

    Cont = ReadData;                       //4   得到所有未释放的键值

}
(1)       没有按键的时候 ReadData = 0x00;Trg = 0x00;Cont = 0x00;
(2)       第一次PB0按下的情况 ReadData = 0x01;Trg = 0x01;Cont = 0x01;
(3)       PB0按着不松(长按键)的情况 ReadData = 0x01;Trg = 0x00;Cont = 0x01;
(4)       按键松开的情况 ReadData = 0x00;Trg = 0x00;Cont = 0x00;

数码之家贴子在http://bbs.mydigit.cn/read.php?tid=584859,利用状态机思想扫描按键,感觉很有用,就想移植。但是移植过程中就发现问题了:理论是支持多个按键的扫描,但是我实验时怎么就只能实现一个按键的扫描呢?而且有点诡异现象!
我的实验部分代码:
#define        KEY1        =0x01
#define        KEY2        =0x02
#define        KEY3        =0x04
uchar Trg=0,Cont=0;
uchar num;

void keyscan(){                                
        unsigned char ReadData=(P2|0xf8)^0xff;//~(P2|0xf8);//(P2|0xf8)^0xff;//P2^0,1,2组需要处理,其他屏蔽
        Trg=ReadData &(ReadData^Cont);//判断是否点动,异或:不同就1
        Cont=ReadData;//判断是否长按
}
void tiem1(void) interrupt 3{
         keyscan();
        if(Trg&KEY1){               
                num++;
                if(num>15)
                        num=0;
        }
        if(Trg&KEY2){
                num--;
                if(num<1)
                        num=15;
        }
        if(Trg&KEY3){
                num=0;
        }
        display();
    TH1 = 0x63;              //20ms扫描一次
    TL1 = 0xc0;  
}
我的实验结果:
1、         void tiem1(void) interrupt 3{
         keyscan();
        if(Trg&KEY1){               
                num++;
                if(num>15)
                        num=0;
        }
        if(Trg&KEY2){
                num--;
                if(num<1)
                        num=15;
        }
        if(Trg&KEY3){
                num=0;
        }
        display();
    TH1 = 0x63;              //20ms扫描一次
    TL1 = 0xc0;  
}
则只有KEY1起作用,可以短按,长按。其他按键无效。
2、         keyscan();
        if(Trg&KEY2){
        }

        if(Trg&KEY3){
        }
        if(Trg&KEY1){               
        }
则只有KEY2起作用,其他按键无效。
3、keyscan();
        if(Trg&KEY3){
        }

        if(Trg&KEY1){               
        }
        if(Trg&KEY2){
        }
则只有KEY3起作用,其他按键无效。
结论:谁在前,谁起作用,不能多按键扫描。

这就是上面我所说的诡异了。搞了很久都没搞明白我实在是菜啊

请各位亲指点下迷津

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
20条回答
xiaobendan001
1楼-- · 2020-01-21 15:11
barryliu 发表于 2013-6-25 13:53
矩阵键盘在没有加二极管隔离的情况下是肯定不支持多键同时按下的,这一点根本不需发讨论。
如果两个键或 ...

我感觉不是这样吧,我没看上面的程序,但是我感觉应该可以实现没有二极管的情况下识别非同列或者同行的多个按键吧,至少两个应该没有问题吧。
barryliu
2楼-- · 2020-01-21 21:02
xiaobendan001 发表于 2013-6-25 14:26
我感觉不是这样吧,我没看上面的程序,但是我感觉应该可以实现没有二极管的情况下识别非同列或者同行的多 ...

两个和100个没区别,只要不在同一行也不在同一列上,就会误识别。
Excellence
3楼-- · 2020-01-21 22:38
只用到短按键和长按键。
geliang2008
4楼-- · 2020-01-22 00:44
还是用不好啊!
Playboy_xixi
5楼-- · 2020-01-22 02:17
 精彩回答 2  元偷偷看……
longfeixue
6楼-- · 2020-01-22 05:35
记录一下

一周热门 更多>