标题: 如何将按键按下一次作为一次输入 [打印本页]

作者: 骓风    时间: 2016-10-31 22:36
标题: 如何将按键按下一次作为一次输入
我用的是扫描法检测按键  但是按下一次就会扫描很多次  如何更改函数使得按下抬起一次作为一次的输入

char keyScan(void)
{
    char key = 0;
    char row,col;
//    char key_now ;
//    char key_past;

    P9DIR = 0XF0;
    P9REN = 0X0F;
    P9OUT = 0X0F;         
    if((P9IN & 0X0f) != 0X0f)   //判断是否有有键按下(检测输入是否全部为高),若有 往下执行
    {
        delays();
        if((P9IN&0x0f)!=0x0f)     //再次判断列中是否是干扰信号,不是则向下执行
        {         
            row = P9IN&0x0f;

            P9DIR = 0X0F;
            P9REN = 0XF0;
            P9OUT = 0XF0;
            col = P9IN&0xf0;
//            if((key_past==0)&&(key_now==1))
            {   key = row|col;
//                key_past = key_now;
//                key_now = 0;
            }
        }        
    }   
    return key;
}

作者: zl2168    时间: 2016-11-1 08:05
本帖最后由 zl2168 于 2016-11-1 08:07 编辑

实例5  4种不同方式键控信号灯


按键按能否锁定可分为有锁按键和无锁按键。有锁按键是按下即能锁定闭合状态,只有再次按一下才能解除闭合状态,回归断开状态。无锁按键不能锁定闭合状态,除非按住键不予释放,典型的例子就是电脑键盘上的按键。


单片机应用系统中,根据按键闭合和释放状态,有多种不同的键控方式,可编写不同的程序予以实现。本例要求按以下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, 下载次数: 9)

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


作者: 骓风    时间: 2016-11-1 10:30
zl2168 发表于 2016-11-1 08:05
实例5  4种不同方式键控信号灯

你发的东西不错 但是我的电脑打不开这些文件
作者: zl2168    时间: 2016-11-1 12:17
骓风 发表于 2016-11-1 10:30
你发的东西不错 但是我的电脑打不开这些文件

在proteus中打开,可仿真演示,有实效。但程序在书中,要自己去看。
作者: 刘海龙    时间: 2016-11-1 16:12
加入while((P9IN & 0X0f) != 0X0f);到执行按键程序之后
作者: 骓风    时间: 2016-11-1 22:48
刘海龙 发表于 2016-11-1 16:12
加入while((P9IN & 0X0f) != 0X0f);到执行按键程序之后

已经解决了  谢谢
作者: lmmy    时间: 2021-7-22 15:54
刘海龙 发表于 2016-11-1 16:12
加入while((P9IN & 0X0f) != 0X0f);到执行按键程序之后

为什么呢

作者: lkc8210    时间: 2021-7-23 00:10
lmmy 发表于 2021-7-22 15:54
为什么呢

等待放开按键




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