野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 9425|回复: 2

一个简单的按键扫描两种写法,有一个总是出错

[复制链接]
发表于 2016-4-23 23:51:02 | 显示全部楼层 |阅读模式
两种写法,应该是一样的,但有一种不起作用,求大神解答,谢谢!
第一种:
unsigned char scanKey(void)
{
    unsigned char ret=0x00;
    if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==1)
    {
        while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0));
        ret= 0x01;    //这个返回值意思是亮第一个灯
    }
    if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13)==1)
    {
        while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13));
        ret= 0x10;    //这个返回值意思是亮第二个灯
    }
    return ret;
}

第二种:  
unsigned char scanKey(void)
{
    unsigned char ret=0x00;
    if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==1)
    {
        ret= 0x01;    //这个返回值意思是亮第一个灯
    }
    if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13)==1)
    {
        ret= 0x10;    //这个返回值意思是亮第二个灯
    }
//下面两句是等待按键释放的意思
    while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13));
    while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0));
    return ret;
}

main函数里面死循环:检测此函数返回值是0x01还是0x10,点亮不同的灯,并延时0.5s,进入下一次循环。

事实情况是第一种写法完全没问题;第二种写法,有时候按下去按键没反应,该亮的灯不亮。

求大神解答,这个问题一直想不通,很困惑。谢谢!!

回复

使用道具 举报

发表于 2016-4-25 08:27:54 | 显示全部楼层
1、第一种表示按键按下之后,这时是高电平,然后等待按键松手,松开后是低电平(按键默认在硬件上接地),这个时候灯才亮,即保证是低电平点亮,这个低电平是硬件直接拉低,并不是通过按键按下来接GND,不存在因为按键抖动或者接触不良的影响。

2、第二种方法是按键按下,高电平点亮,受按键抖动或者接触不良的影响。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-4-28 17:35:33 | 显示全部楼层
fire 发表于 2016-4-25 08:27
1、第一种表示按键按下之后,这时是高电平,然后等待按键松手,松开后是低电平(按键默认在硬件上接地), ...

谢谢您的回复!

可能我还没有表达清楚意思。灯亮不亮,完全是另外一个函数操纵的。在main() 里面,如果这个按键扫描函数反回了0x01,那么main()里面的if语句,就调用使A灯亮的函数,如果返回0x10,main里面的if语句就调用使B灯亮的函数,如果返回0x00,main里面不会点亮任何一个灯,并继续扫描按键。

现在的面临的问题是:这两种写法,连if条件都完全相同,唯一的不同就在于 “检测按键是否释放” 这个while语句的位置不同。具体来说,一个想法是,先等按键释放,再设置返回值变量(ret);另一个想法是,先设置返回值变量(ret),再等待按键释放。

我觉得这两个方法效果理应是完全相同的。但事实是第一种100%可以,第二种方法,有时候会失灵,而且我发现它并不是卡在 “等待按键释放的while()语句” 里,而是返回了一个不应返回的值(推测应该是进入了错误的if分支),这一点实在是极其困惑,还希望大神详细指点!!
谢谢!!

PS.并没有考虑去抖,因为第一种写法也没有去抖,但是几乎100%正确执行。
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-5 13:59 , Processed in 0.031003 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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