标题: 单片机松手检测问题,如何实现松手检测,这里的有点问题 [打印本页]

作者: LPY_1997    时间: 2018-9-28 21:54
标题: 单片机松手检测问题,如何实现松手检测,这里的有点问题
unsigned char key_scan(void)
{
   char  row;//DD
   char list;//áD
   char i;
   char val;
   unsigned char keyvalue[] = {0x77,0x7b,0x7d,0x7e,0xb7,0xbb,0xbd,0xbe,0xd7,0xdb,0xdd,0xde,0xe7,0xeb,0xed,0xee,};

  KEY = 0xf0;

  if(KEY != 0xf0)
  {
    delay();
    if(KEY != 0xf0)
    {
      row      = KEY&0xf0;
      KEY = 0x0f;
      list     = KEY&0x0f;
      val = row|list;
      for(i = 0; i < 16; i++)
      {
        if(val == keyvalue[i])
        {
         while(KEY != 0xf0);//松手检测
          return i;
        }
      }
    }
  }
}


作者: HC6800-ES-V2.0    时间: 2018-9-29 08:26
看了你的程序,确实,松手检测太简单了,它的最大问题,就是不松手,则程序“死”在这个检测语句处。
我是这样写的(不是我的首创,学习的时候,老师就是这样教的)
  while((i<50)&&(k1==0))
   {
    Delay10ms(1);
                                    i++;
                            }
                            i=0;

作者: 归依龙井    时间: 2018-9-29 10:40
KEY = 0xf0;你这是打算四个按键一起按吗?
作者: wulin    时间: 2018-9-29 14:41
松手检测写错了
错误:while(KEY != 0xf0);
正确:while(KEY != 0x0f);
作者: LPY_1997    时间: 2018-9-29 18:03
wulin 发表于 2018-9-29 14:41
松手检测写错了
错误:while(KEY != 0xf0);
正确:while(KEY != 0x0f);

这样写也不行,我之前就是这样写的!
作者: 梦不虚存    时间: 2018-9-29 19:11
松手检测可以通过简单延时来实现,不过感觉有点浪费资源
作者: wulin    时间: 2018-9-29 20:12
LPY_1997 发表于 2018-9-29 18:03
这样写也不行,我之前就是这样写的!

是你的程序还有其它问题,这在你的程序基础上完善后的仿真。
#include<reg52.h>
#define KEY P1
unsigned char j;
unsigned char i;
unsigned char  code table[]={
        0x01,0x02,0x03,0x04,
        0x05,0x06,0x07,0x08,
        0x09,0x0a,0x0b,0x0c,
        0x0d,0x0e,0x0f,0x10};
void delay(unsigned int x)
{
        unsigned char i;
        while(x--)
        {
                for(i=123;i>0;i--);
        }
}
void key_scan(void)
{
   char  row;//DD
   char list;//áD

   char val;
   unsigned char keyvalue[] = {0x77,0x7b,0x7d,0x7e,0xb7,0xbb,0xbd,0xbe,0xd7,0xdb,0xdd,0xde,0xe7,0xeb,0xed,0xee,};

        KEY = 0xf0;
        if(KEY != 0xf0)
        {
                delay(20);
                if(KEY != 0xf0)
                {
                        row = KEY&0xf0;
                        KEY = 0x0f;
                        list= KEY&0x0f;
                        val = row|list;
                        for(i = 0; i < 16; i++)
                        {
                                if(val == keyvalue)
                                {
                                        j=table;
                                        while(KEY != 0x0f);//松手检测
                                        break;
                                }
                        }
                }
        }
}

void main()
{

    while(1)
    {
                key_scan();
                P3=j;
        }
}





作者: zl2168    时间: 2018-9-30 06:44
什么叫单片机松手检测?
作者: yousunny    时间: 2018-9-30 09:17
其实想问的应该是  怎么检查按键是否弹起吧?(上升沿)而不是松手检测?
作者: mrhan1992    时间: 2018-9-30 09:28
这个和物理按键消抖原理不是一样的么?如果松开按键为高电平的话,那就判断1秒钟,如果还是高电平的话不就是松手了?同理按下为低电平的话,那判断1秒,如果还是低电平不就是松手了?
作者: ljh2688    时间: 2018-9-30 11:13
主程序做检测,做好标记,用定时器测量时间和释放即可
作者: LPY_1997    时间: 2018-9-30 21:14
wulin 发表于 2018-9-29 20:12
是你的程序还有其它问题,这在你的程序基础上完善后的仿真。
#include
#define KEY P1

数组好像写的有点问题,仿真结果确定正确吗
作者: zl2168    时间: 2018-10-1 11:59
实例5  4种不同方式键控信号灯
作者: zl2168    时间: 2018-10-1 12:00
本帖最后由 zl2168 于 2018-10-1 16:07 编辑

给你介绍上升沿、上升沿延迟、下降沿、下降沿延迟等多种按键触发状态
单片机应用系统中,根据按键闭合和释放状态,有多种不同的键控方式,可编写不同的程序予以实现。
本例要求按以下4种不同方式分别键控VD0~ VD3。
① 无锁按键:S0按下,VD0亮;S0释放,VD0暗;
② 无锁按键(前沿有效):S1按下,VD1亮;S1释放,VD1延时2s后暗。
③ 无锁按键(后沿有效):S2按下,VD2不亮;S2释放,VD2亮,并延时2s后暗。
④ 模拟有锁按键:S3按第一次,VD3亮,并继续保持;按第二次,VD3才暗。

Proteus仿真一下,确认有效。
实例5 不同方式键控灯.rar (31.72 KB, 下载次数: 7)

以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil CProteus》清华大学出版社ISBN 978-7-302-41682-1.书中电路和程序设计有详细说明,程序语句条条有注解。





欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1