按键输入实验中:
疑问:程序中,按键是不支持连按的,出现的问题是,当我按下按键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);
}
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
vk_up变量就是检测松手标志的
一周热门 更多>