野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11738|回复: 16

有关按键的问题

[复制链接]
发表于 2015-11-6 08:31:14 | 显示全部楼层 |阅读模式
不好意思,刚开始学习,C语言编程又不是很熟,把例程中的两个按键程序合在一起,
while(1)                           
{   
  if( Key_Scan(GPIOA,GPIO_Pin_0,1) == KEY_ON  )  //按下key1
   LED2_TOGGLE;                                                  //LED2亮灭
  if ( Key_Scan(GPIOC,GPIO_Pin_13,1) == KEY_ON  )   //按下key2
   LED3_TOGGLE;                                                   //LED3亮灭
}
为什么只有第2个if语句被执行?而按下key1,LED2没反应?怎样改程序才能支持?
回复

使用道具 举报

发表于 2015-11-6 08:40:57 | 显示全部楼层
if ( Key_Scan(GPIOC,GPIO_Pin_13,0) == KEY_ON  )   //按下key2
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-6 09:13:30 | 显示全部楼层
亽亼 发表于 2015-11-6 08:40
if ( Key_Scan(GPIOC,GPIO_Pin_13,0) == KEY_ON  )   //按下key2

再请教一下,这里的1和0是用来区分两个按键的,和ISO的按键接法(有按键时GPIO口为低电平)无关是么?
这段代码是不是只能支持最多2个按键的情况?
回复 支持 反对

使用道具 举报

发表于 2015-11-6 10:25:04 | 显示全部楼层
这里的0或者1是由硬件电路决定的,你可以去看原理图,key1接在PA0上,当key1按下时PA0是高电平即是1
而key2按下时PC13是低电平
代码不会只支持两个按键而已啊,可以添加很多的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-6 10:38:21 | 显示全部楼层
本帖最后由 自动铅笔 于 2015-11-6 10:40 编辑
亽亼 发表于 2015-11-6 10:25
这里的0或者1是由硬件电路决定的,你可以去看原理图,key1接在PA0上,当key1按下时PA0是高电平即是1
而key ...

我看硬件图了啊,这两个按键接法一模一样啊?(零死角玩转stm32- V2.pdf 第153页)
为啥key1按下是高电平,key2按下是低电平?而且给的例程里,PC13也是1啊?
int main(void)
{        
        /* config the led */
        LED_GPIO_Config();
        LED1_ON;

        /*config key*/
        Key_GPIO_Config();        
        
        while(1)                           
        {           
                if( Key_Scan(GPIOC,GPIO_Pin_13,1) == KEY_ON  )
                {
                        /*LED1·´×ª*/
                        LED1_TOGGLE;
                }   
        }
}
我试过了,这个例程单独下载到板子里是好用的。
但把两个按键程序合在一起,按你的改完就好用了。所以糊涂了。
回复 支持 反对

使用道具 举报

发表于 2015-11-6 13:34:45 | 显示全部楼层
不要以零死角玩转stm32为主,原理图需要以ISO-V2.pdf文件为主
回复 支持 反对

使用道具 举报

发表于 2015-11-8 11:02:28 | 显示全部楼层
你好,我也遇到了同样的问题。看了ISO-V2的原理图确实是你所说的那样:“这里的0或者1是由硬件电路决定的,你可以去看原理图,key1接在PA0上,当key1按下时PA0是高电平即是1,而key2按下时PC13是低电平”
那么为什么单独两个程序的时候, if( Key_Scan(GPIOC,GPIO_Pin_13,1) == KEY_ON  ),这里Pin_13也会设置为1呢?
谢谢

ISO-v2图

ISO-v2图
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-9 08:52:48 | 显示全部楼层
测试按键程序:
把两个单独例程中都改为0,即
if(Key_Scan(GPIOC,GPIO_Pin_13,0) == KEY_ON)
if(Key_Scan(GPIOA,GPIO_Pin_0,0) == KEY_ON),两个按键也都好用。
两个单独例程合在一起时:
PA0=0,PC13=0,PA0按键好用,PC13按键不好用;
PA0=0,PC13=1,PA0、PC13轮流按下好用,每个都连续按下时只有第一次好用;
PA0=1,PC13=0,PA0和PC13按键都好用;
PA0=1,PC13=1,PA0按键不好用,PC13按键好用;
看硬件图,PA0按下为1,PC13按下为0。
为什么会这样啊?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-9 10:00:37 | 显示全部楼层
本帖最后由 自动铅笔 于 2015-11-9 10:25 编辑

试了一下中断按键方式,可以同时使用。
回复 支持 反对

使用道具 举报

发表于 2015-11-9 10:44:44 | 显示全部楼层
crossroadstage 发表于 2015-11-8 11:02
你好,我也遇到了同样的问题。看了ISO-V2的原理图确实是你所说的那样:“这里的0或者1是由硬件电路决定的, ...

正确使用是:if ( Key_Scan(GPIOC,GPIO_Pin_13,0) == KEY_ON  )   //按下key2
至于单独例程时候使用if ( Key_Scan(GPIOC,GPIO_Pin_13,1) == KEY_ON  ) 也可以达到按键效果是因为Key_Scan()函数问题,你可以看看这个函数编写,特别理解其中while函数的作用就明白了
回复 支持 反对

使用道具 举报

发表于 2015-11-9 10:45:30 | 显示全部楼层
自动铅笔 发表于 2015-11-9 08:52
测试按键程序:
把两个单独例程中都改为0,即
if(Key_Scan(GPIOC,GPIO_Pin_13,0) == KEY_ON)

正确使用是:if ( Key_Scan(GPIOC,GPIO_Pin_13,0) == KEY_ON  )   //按下key2
至于单独例程时候使用if ( Key_Scan(GPIOC,GPIO_Pin_13,1) == KEY_ON  ) 也可以达到按键效果是因为Key_Scan()函数问题,你可以看看这个函数编写,特别理解其中while函数的作用就明白了
回复 支持 反对

使用道具 举报

发表于 2015-11-9 10:49:12 | 显示全部楼层
自动铅笔 发表于 2015-11-9 10:00
试了一下中断按键方式,可以同时使用。

实际上中断的话也是存在一个问题,一般我们设置中断要不为下降沿触发或者上升沿触发中断,而按键是个特殊期间,不管按键原先是高电平或者低电平,我们按下按键再弹开按键这整个过程都会有上升沿和下降沿的存在,所以基本上不管你中断是设置哪种模式都有触发中断的条件
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-9 13:08:37 | 显示全部楼层
亽亼 发表于 2015-11-9 10:49
实际上中断的话也是存在一个问题,一般我们设置中断要不为下降沿触发或者上升沿触发中断,而按键是个特殊 ...

明白了,谢谢!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-9 14:58:23 | 显示全部楼层
亽亼 发表于 2015-11-9 10:45
正确使用是:if ( Key_Scan(GPIOC,GPIO_Pin_13,0) == KEY_ON  )   //按下key2
至于单独例程时候使用if ( ...

单步走了下程序,如果设置为1,一直停在while()函数处,直到按下该键才能往下走程序。是这样吗?
回复 支持 反对

使用道具 举报

发表于 2015-11-13 20:11:31 | 显示全部楼层
亽亼 发表于 2015-11-9 10:44
正确使用是:if ( Key_Scan(GPIOC,GPIO_Pin_13,0) == KEY_ON  )   //按下key2
至于单独例程时候使用if ( ...

你好,我尝试了这种写法,为什么软件会有这样的提示的呢?
谢谢!
QQ截图20151113200818.jpg
回复 支持 反对

使用道具 举报

发表于 2015-11-14 08:34:11 | 显示全部楼层
你的Key_Scan函数原本就只有两个参数,软件版本不同
你是哪个版本的板子啊
回复 支持 反对

使用道具 举报

发表于 2015-11-15 23:02:06 | 显示全部楼层
软件用的是Keil4,硬件是F1系列的103ZE型号的
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-24 19:47 , Processed in 0.036145 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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