打印

矩阵键盘增加延时去抖,为什么只有最后一个键可用?

[复制链接]
3055|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
thanksgiving|  楼主 | 2009-7-20 11:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
不消抖,直接检测显示正常,一旦增加延时去抖,第一排显示正常,2,3,4排都只有最后一位可用了。
高手能帮我解释解释吗?
键盘扫描程序(增加延时去抖后的)如下:

uchar scanf_key()
{

    P3=0xfe;
    temp=P3;
    if(temp!=0xfe)
    {                                   //
        delay(5);                  //
        temp2=P3;                  //
        if(temp==temp2)            //
        {                 //
            switch(temp)
            {
                case 0xee: i=1;
                break;
                case 0xde: i=2;
                break;
                case 0xbe: i=3;
                break;
                case 0x7e: i=4;
                break;
            }
            while(temp!=0xfe)
            {
                temp=P3;
            }
            delay(5);
            while(temp!=0xfe)
            {
                temp=P3;
            }
        }
    }
    P3=0xfd;
    temp=P3;
    if(temp!=0xfd)
    {
        delay(5);
        temp2=P3;
        if(temp==temp2)
        {        
            switch(temp)
            {
                case 0xed: i=5;
                break;
                case 0xdd: i=6;
                break;
                case 0xbd: i=7;
                break;
                case 0x7d: i=8;
                break;
            }
            while(temp!=0xfd)
            {
                temp=P3;
            }
            delay(5);
            while(temp!=0xfd)
            {
                temp=P3;
            }
        }
    }

    P3=0xfb;
    temp=P3;
    if(temp!=0xfb)
    {
        delay(5);
        temp2=P3;
        if(temp==temp2)
        {        
            switch(temp)
            {
                case 0xeb: i=9;
                break;
                case 0xdb: i=10;
                break;
                case 0xbb: i=11;
                break;
                case 0x7b: i=12;
                break;
            }
            while(temp!=0xfb)
            {
                temp=P3;
            }
            delay(5);
            while(temp!=0xfb)
            {
                temp=P3;
            }
        }
    }
    P3=0xf7;
    temp=P3;
    if(temp!=0xf7)
    {
        delay(5);
        temp2=P3;
        if(temp==temp2)
        {        
            switch(temp)
            {
                case 0xe7: i=13;
                break;
                case 0xd7: i=14;
                break;
                case 0xb7: i=15;
                break;
                case 0x77: i=16;
                break;
            }
            while(temp!=0xf7)
            {
                temp=P3;
            }
            delay(5);
            while(temp!=0xf7)
            {
                temp=P3;
            }
        }
    }

    return(i);     

}

相关帖子

沙发
qwe70007| | 2009-8-6 01:39 | 只看该作者
关注中!

使用特权

评论回复
板凳
kanke100| | 2009-8-6 14:39 | 只看该作者
网上有很多键盘的实例,你找一个改改就行了,干嘛有自己从头写呢?

使用特权

评论回复
地板
虾军师| | 2009-8-6 15:19 | 只看该作者
/*四行四列的按键要写这么多?*/
/*硬件:有键按下,所在的行列为低电平。*/
//****反转法扫描****//
IO口置0xf0;
检查IO口没有变化则无键按下,退出扫描;
IO口状态有变,貌似有键按下?
消抖;//方法经各路专家讨论过多次
IO口是0xf0?刚才的貌似是假的,则退出;
记下IO口行状态;//0xe0 0xd0 0xb0 0x70
置IO口为0x0f;
读取IO口列状态;//0x0e 0x0d 0x0b 0x07
结合行列的状态,确定出16个键值;
等待按键释放(给IO口置行高或列高或行列全高等状态。。然后检查IO口状态,其他类似消抖);
行了,扫描结束;

使用特权

评论回复
5
thanksgiving|  楼主 | 2009-8-6 16:38 | 只看该作者
我从网上下了别人的试验也不行,难道跟硬件电路有关?为什么不延时就正常呢?
谢谢你们的回答,我回头再试试看

使用特权

评论回复
6
thanksgiving|  楼主 | 2009-8-6 16:50 | 只看该作者
4楼的方法不错,赞个,等下试验下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

31

主题

153

帖子

0

粉丝