打印

按键输入连按问题???

[复制链接]
350|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
棋王高手|  楼主 | 2018-7-10 21:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
pi, IO, GPIO, gp, ni
按键输入实验中:
疑问:程序中,按键是不支持连按的,出现的问题是,当我按下按键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);
  }
   
}
}

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

378

主题

378

帖子

0

粉丝