打印

在请教个问题:怎样完成用74HC165做键盘输入的消抖呢?

[复制链接]
4500|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yuanquan12345|  楼主 | 2011-2-25 07:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
跟直接进单片机的I/O口的消抖方法不一样?
if(yy==0xef)
{
       delay(5);                //延时,用于消抖动
        if(yy==0xef)                //延时后再次确认按键按下
       {
          key1n++;
          if(key1n==5)
                  key1n=0;
          while(!yy);        //检测键盘是否松手
        }
}
试了好多种方法还不行。
如:while(!(yy==0xef));
while(yy!=0xef);
怎么都不行。
请指点。
谢谢。

相关帖子

沙发
coody| | 2011-2-25 12:53 | 只看该作者
间隔一定时间读一次,比较相邻两次相等,键状态就有效

使用特权

评论回复
板凳
chunfeng12| | 2011-2-25 16:09 | 只看该作者
本帖最后由 chunfeng12 于 2011-2-25 16:16 编辑
if(yy==0xef)
{
       delay(5);                //延时,用于消抖动
        if(yy==0xef)                //延时后再次确认按键按下
       {
          key1n++;
          if(key1n==5)
                  key1n=0;
          while(!yy);        //检测键盘是否松手
        }
}

如果在(yy!=0xef)时key1n不清零
假如每次抖动仅能维持key1n++;操作一次,抖动5次就会有一次误操作
另外whie(!yy);这句话不能检测键盘是否松手。

使用特权

评论回复
地板
yuanquan12345|  楼主 | 2011-2-26 06:42 | 只看该作者
谢谢大家。我再试试。

使用特权

评论回复
5
yuanquan12345|  楼主 | 2011-2-27 09:00 | 只看该作者
请用过165键盘扫描的高手多指点。谢谢大家。

使用特权

评论回复
6
yuanquan12345|  楼主 | 2011-2-28 07:33 | 只看该作者
还是没成功。等待指点。
谢谢。

使用特权

评论回复
7
yuanquan12345|  楼主 | 2011-2-28 07:48 | 只看该作者
chunfeng12:我的理解, key1n++;完成后,
     如果              while(yy!=0xef); 的条件成立是不是程序应该在这儿停住了。
为什么用了几种方法都不行。
请大家指点。
谢谢。

使用特权

评论回复
8
liumapple| | 2011-2-28 09:05 | 只看该作者
yy = key_scan();  //读取键值
if(yy != key_temp) //按键值不等于上次值
{
     kye_temp =yy;
}
else  //等于上次值
{
    if (yy  ==key_null) //无健压下
   {
    }
    if (yy == key1) //按键1压下
    {
    }
    ......
}

不能写这种程序吧
while(!yy);        //检测键盘是否松手
如果键盘一直不松手,那不是单片机一直死在这不运行了?
实时性基本没有了。

使用特权

评论回复
9
yuanquan12345|  楼主 | 2011-2-28 15:40 | 只看该作者
谢谢。我再试试。

使用特权

评论回复
10
lkf123010| | 2011-2-28 21:25 | 只看该作者
最好用中断来防抖,这样才不至于让CPU瞎白等、、、

使用特权

评论回复
11
yuanquan12345|  楼主 | 2011-3-1 09:02 | 只看该作者
中断来防抖,还是用来起延时作用。
if (yy == key1) //按键1压下
    {
    }
    ......
}

在此还得判断按键按下或松手。
对吧?
请指点。

使用特权

评论回复
12
ZGM左光敏123| | 2011-3-1 10:45 | 只看该作者
while(!yy);        //检测键盘是否松手

请你在上面这一句的后面加下面这两句试试。
delay(5);              
  while(!yy);

使用特权

评论回复
13
明天及以后| | 2011-3-3 16:49 | 只看该作者
while(yy==0xef)
{
     a++;
    if(a>b&&yy==0xef)
    {
        a=0;
        这里写你要处理的程序;
       break;
    }
}
a=0;

使用特权

评论回复
14
yuanquan12345|  楼主 | 2011-3-3 21:14 | 只看该作者
明天及以后:没看明白您的程序。能说明一下吗?
谢谢。

使用特权

评论回复
15
yuanquan12345|  楼主 | 2011-3-4 06:22 | 只看该作者
已经解决,下面是源程序:
void key()
{
        //INT8U TK=0;           
        uchar xx=0,yy=0,TK=0;
        hc165pl=1;                 //165移位负跳变
        xx=w165();
        yy=w165();
        hc165pl=0;
        TK=yy&0xff;
        if(TK==0xef)
   {  
                   DTime=0;
                while(DTime!=10);
                DTime=0;
                hc165pl=1;                 //165移位负跳变
                xx=w165();
                yy=w165();
                hc165pl=0;
                TK=yy;               
          if(TK==0xef)  
       {
                     
                  do  
                  {  
                        hc165pl=1;                 //165移位负跳变
                        xx=w165();
                        yy=w165();
                        hc165pl=0;
                        TK=yy;                 
                       
                  }
                  while(TK==0xef);
     
                 fm=0;
                 delay(40);
                 fm=1;          //蜂鸣器短鸣

               
                        key1n++;
                 if(key1n==5)
                        key1n=0;

                        switch(key1n)
                        {
                                case 1:
                                               
                                                //adc0804();
                                                xianshi();         
                                            lcd_wcmd(0x80);           // 在80处显示一个笑脸
                                                lcd_wdat(0x02);
                                                lcd_wcmd(0x81);                //光标在81处显示
                                                lcd_wcmd(0x0e);
                                                   break;
                                case 2:
                                                xianshi();                                                         
                                            lcd_wcmd(0x83);            // 在83处显示一个笑脸
                                                lcd_wdat(0x02);
                                                lcd_wcmd(0x84);                //光标在84处显示
                                                lcd_wcmd(0x0e);                               
                                                 break;
                                case 3:  
                                                xianshi();                                                         
                                            lcd_wcmd(0x86);            // 在86处显示一个笑脸
                                                lcd_wdat(0x02);
                                                lcd_wcmd(0x87);                //光标在87处显示
                                                lcd_wcmd(0x0e);
                                                   break;
                                case 4 :
                                       
                                                xianshi();
                                                break;
                        }
                 }
        }
}04

使用特权

评论回复
16
yuanquan12345|  楼主 | 2011-3-4 06:22 | 只看该作者
谢谢大家。

使用特权

评论回复
17
yuanquan12345|  楼主 | 2011-3-4 07:00 | 只看该作者
另外请大家帮忙看看,此程序还需要怎样改进。
先谢谢了。

使用特权

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

本版积分规则

75

主题

1155

帖子

3

粉丝