找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7160|回复: 13
打印 上一主题 下一主题
收起左侧

单片机松手检测问题,如何实现松手检测,这里的有点问题

[复制链接]
跳转到指定楼层
楼主
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;
        }
      }
    }
  }
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

使用道具 举报

板凳
ID:142559 发表于 2018-9-29 10:40 | 只看该作者
KEY = 0xf0;你这是打算四个按键一起按吗?
回复

使用道具 举报

地板
ID:213173 发表于 2018-9-29 14:41 | 只看该作者
松手检测写错了
错误:while(KEY != 0xf0);
正确:while(KEY != 0x0f);
回复

使用道具 举报

5#
ID:384090 发表于 2018-9-29 18:03 | 只看该作者
wulin 发表于 2018-9-29 14:41
松手检测写错了
错误:while(KEY != 0xf0);
正确:while(KEY != 0x0f);

这样写也不行,我之前就是这样写的!
回复

使用道具 举报

6#
ID:150530 发表于 2018-9-29 19:11 来自手机 | 只看该作者
松手检测可以通过简单延时来实现,不过感觉有点浪费资源
回复

使用道具 举报

7#
ID:213173 发表于 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;
        }
}




回复

使用道具 举报

8#
ID:111634 发表于 2018-9-30 06:44 | 只看该作者
什么叫单片机松手检测?

评分

参与人数 1黑币 +5 收起 理由
yousunny + 5 很给力!

查看全部评分

回复

使用道具 举报

9#
ID:308437 发表于 2018-9-30 09:17 | 只看该作者
其实想问的应该是  怎么检查按键是否弹起吧?(上升沿)而不是松手检测?
回复

使用道具 举报

10#
ID:279667 发表于 2018-9-30 09:28 | 只看该作者
这个和物理按键消抖原理不是一样的么?如果松开按键为高电平的话,那就判断1秒钟,如果还是高电平的话不就是松手了?同理按下为低电平的话,那判断1秒,如果还是低电平不就是松手了?
回复

使用道具 举报

11#
ID:404329 发表于 2018-9-30 11:13 | 只看该作者
主程序做检测,做好标记,用定时器测量时间和释放即可
回复

使用道具 举报

12#
ID:384090 发表于 2018-9-30 21:14 | 只看该作者
wulin 发表于 2018-9-29 20:12
是你的程序还有其它问题,这在你的程序基础上完善后的仿真。
#include
#define KEY P1

数组好像写的有点问题,仿真结果确定正确吗
回复

使用道具 举报

13#
ID:111634 发表于 2018-10-1 11:59 | 只看该作者
实例5  4种不同方式键控信号灯
回复

使用道具 举报

14#
ID:111634 发表于 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.书中电路和程序设计有详细说明,程序语句条条有注解。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表