微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 如何将按键按下一次作为一次输入

如何将按键按下一次作为一次输入

时间:10-02 整理:3721RD 点击:
我用的是扫描法检测按键  但是按下一次就会扫描很多次  如何更改函数使得按下抬起一次作为一次的输入
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;
}

按键扫描很多次是你没有做按键抬起处理,程序执行快了就会识别好几次。这不是你消不消抖的问题,
在程序里加 while(按键抬起判断);
这样就可以一抬起才会执行后面程序。

程序里带延迟判断按键,估计是延迟时间过短所致。你把延迟再适当延长一些试试看。

我的意思是检测按键抬起

分享大家一个学习单片机与嵌入式的地方,可以关注一下微信公众号【玩转单片机与嵌入式】,每天都会分享三篇有价值的文章,通过碎片化的学习时间,提高自己的水平。

是这么回事  但是不知道 如何检测抬起

第二个if语句里加上这句话
while((P9IN&0x0f)==0x0f);//等待按键抬起

加中断或者读按键用IO口状态,赋给变量

把变量带进判断,触发就好了

我加的是  while((P9IN&0xf0)!=0xf0);//等待按键抬起
多谢指点

我用的端口没有中断  已经解决  谢谢指点

学习学习。

这个中断的确容易忘记 我都是先用笔记在本子上 编完后再对照着找一下 看看有没有忘记

受教了

我也是菜鸟  不会了才来发帖提问的

做一个按键松开检测,按键松开后再将数据写入

学习学习。

好,,,,,,,

都是菜鸟,我也不懂太多

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top