OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4186|回复: 7

按键输入连按问题???

[复制链接]

13

主题

26

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
288
金钱
288
注册时间
2018-10-30
在线时间
26 小时
发表于 2018-11-15 15:05:58 | 显示全部楼层 |阅读模式
按键输入实验中:
疑问:程序中,按键是不支持连按的,出现的问题是,当我按下按键KEY时,LED持续翻转,没有起到不支持连按的作用。在后续一些用到按键的实验中也出现同样的问题,检查了自己的代码,没找出问题出在哪里?大神求解!!
我的代码如下:
key.h文件:
#ifndef __KEY_H
#define __KEY_H
#include "sys.h"
//#define u8 unsigned char
//通过库函数读取按键
//定义按键
#define KEY0 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)
#define KEY1 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)
#define KEY2 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)
#define KEY_UP GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)
//定义常量
#define KEY0_PRES 1
#define KEY1_PRES 2
#define KEY2_PRES 3
#define KEYUP_PRES 4
//按键初始化函数声明
void KEY_Init(void);
//按键扫描函数声明
u8 KEY_Scan(u8);
#endif

key.c文件:
#include "key.h"
#include "delay.h"

//初始化IO函数的定义
void KEY_Init(void){
GPIO_InitTypeDef GPIO_InitStructure;
   
//时钟使能
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE|RCC_AHB1Periph_GPIOA,ENABLE);

//IO口模式设置
GPIO_InitStructure.GPIO_Pin=(GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;

//初始化IO
GPIO_Init(GPIOE,&GPIO_InitStructure);
//IO口模式设置
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_DOWN;

//初始化IO
GPIO_Init(GPIOA,&GPIO_InitStructure);

}

//按键扫描函数定义
u8 KEY_Scan(u8 mode){
  static u8 vk_up=1;//按键松开标志
if(mode)vk_up=1;//支持连按
if(vk_up&&(KEY1==0||KEY2==0||KEY0==0||KEY_UP==1)){
   delay_ms(10);//去抖动
     vk_up=0;
  if(KEY0==0)return 1;
     else if(KEY1==0)return 2;
  else if(KEY2==0)return 3;
  else if(KEY_UP==1)return 4;

}else if(KEY1==1||KEY2==1||KEY0==1||KEY_UP==0)
   vk_up=1;
   return 0;
}

main.c文件:
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "beep.h"
#include "key.h"
int main(void)
{

u8 key;//用于保存键值的变量
delay_init(168);//初始化延时函数
LED_Init();//初始化LED端口
BEEP_Init();//初始化蜂鸣器端口
KEY_Init();//初始化按键接口

  while(1){
  key=KEY_Scan(0);//不支持连续按
if(key==KEY0_PRES){
   PFout(9)=!LED0;
  }else
if(key==KEY1_PRES){
   PFout(10)=!LED1;
  }else
if(key==KEY2_PRES){
   PFout(10)=!LED1;
   PFout(9)=!LED0;
  }else
    if(key==KEYUP_PRES){
   PFout(8)=!BEEP;
   GPIO_SetBits(GPIOF,GPIO_Pin_9|GPIO_Pin_10);
   delay_ms(500);
   GPIO_ResetBits(GPIOF,GPIO_Pin_9|GPIO_Pin_10);
   delay_ms(500);

  }else{
  delay_ms(50);
  }
   
}
}




正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2018-10-21
在线时间
14 小时
发表于 2018-11-15 15:18:11 | 显示全部楼层

回帖奖励 +5 金钱

是不是延迟函数没起到效果。

回复 支持 反对

使用道具 举报

13

主题

26

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
288
金钱
288
注册时间
2018-10-30
在线时间
26 小时
 楼主| 发表于 2018-11-15 15:23:17 | 显示全部楼层
雁天丶韩 发表于 2018-11-15 15:18
是不是延迟函数没起到效果。

延时函数在main函数中是起作用的。这个代码跟原子哥的代码一样,原子哥的源码下载后按键操作之后实验现象正常,我的不知道为啥就不一正常了.......求解
回复 支持 反对

使用道具 举报

13

主题

633

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1331
金钱
1331
注册时间
2016-8-1
在线时间
229 小时
发表于 2018-11-15 15:24:03 | 显示全部楼层
帮顶到底
回复 支持 反对

使用道具 举报

13

主题

26

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
288
金钱
288
注册时间
2018-10-30
在线时间
26 小时
 楼主| 发表于 2018-11-19 17:15:27 | 显示全部楼层
已解决
回复 支持 反对

使用道具 举报

2

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2018-12-17
在线时间
14 小时
发表于 2018-12-26 18:42:26 | 显示全部楼层

您好 问下怎么解决的呢
回复 支持 反对

使用道具 举报

0

主题

14

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2019-1-25
在线时间
6 小时
发表于 2019-3-13 21:56:07 | 显示全部楼层
大涛jjt 发表于 2018-12-26 18:42
您好 问下怎么解决的呢

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);
回复 支持 反对

使用道具 举报

13

主题

26

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
288
金钱
288
注册时间
2018-10-30
在线时间
26 小时
 楼主| 发表于 2019-4-16 11:23:59 | 显示全部楼层
大涛jjt 发表于 2018-12-26 18:42
您好 问下怎么解决的呢

}else if(KEY1==1||KEY2==1||KEY0==1||KEY_UP==0)
   vk_up=1;
   return 0;
}
红色标注代码处的||改成了&&
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-10 13:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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