请教按键连按问题

2019-07-20 05:00发布

按键输入实验中:
疑问:程序中,按键是不支持连按的,出现的问题是,当我按下按键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);
  }
   
}
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
77smile
1楼-- · 2019-07-20 10:55
xlong_06 发表于 2018-11-15 16:44
加个松手检测就完事了

vk_up变量就是检测松手标志的
xlong_06
2楼-- · 2019-07-20 12:58
 精彩回答 2  元偷偷看……
77smile
3楼-- · 2019-07-20 15:25
 精彩回答 2  元偷偷看……
2018Dog
4楼-- · 2019-07-20 20:00
你通过轮询方式实现,中断方式更通用

一周热门 更多>