按键引脚图led.c
#include"key.h"
#include"delay.h"
//按键初始化函数
void KEY_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE|RCC_AHB1Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN;//普通输入
//GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_DOWN;//下拉
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN;//普通输入
//GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;//上拉
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
GPIO_Init(GPIOE,&GPIO_InitStructure);
}
/*
按键处理函数
返回按键值
mode=0,不支持连按;mode=1;支持连按
return 0:没有按键按下
return 1:KEY0按下
return 2:KEY1按下
return 3:KEY2按下
return 4:WK_UP按下
注意:此函数有优先级
*/
u8 KEY_Scan(u8 mode)
{
static u8 key_up=1;//按键松开标志
if(mode)key_up=1;//支持连按
if(key_up==1&&(KEY0==0||KEY1==0||KEY2==0||WK_UP==1))
{
delay_ms (10);//去抖动
key_up =0;
if(KEY0==0)return 1;
else if(KEY1==0)return 2;
else if(KEY2==0)return 3;
else if(WK_UP==0)return 4;
}
else if(KEY0==1||KEY1==1||KEY2==1||WK_UP==0)
key_up =1;
return 0;//无按键按下
}
- KEY_Init是用来初始化按键输入的 IO口的。实现 PA0、PE2~4的输入设置。
- KEY_Scan函数,则是用来扫描这 4个 IO口是否有按键按下。 KEY_Scan函数,支持两种扫描方式,通过 mode参数来设置。
led.h
#ifndef __KEY_H
#define __KEY_H
#include"sys.h"
/*读取IO*/
#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 WK_UP GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)
#define KEY0_PRES 1
#define KEY1_PRES 2
#define KEY2_PRES 3
#define WKUP_PRES 4
void KEY_Init(void);//IO初始化
u8 KEY_Scan(u8);//按键扫描函数
#endif
宏定义部分也可以用位带操作
主函数main.c
#include"sys.h"
#include"delay.h"
#include"usart.h"
#include"led.h"
#include"beep.h"
#include"key.h"
int main(void)
{
u8 key; //保存按键
delay_init (168); //初始化延时函数
KEY_Init (); //初始化与按键连接的硬件接口
LED_Init (); //初始化LED端口
BEEP_Init (); //初始化蜂鸣器端口
LED0=0; //先点亮LED0
while(1)
{
key=KEY_Scan(0);//得到按键值
if(key)
{
switch(key)
{
case WKUP_PRES:
BEEP=!BEEP;
break;
case KEY0_PRES:
LED0!=LED0;
break;
case KEY1_PRES:
LED1!=LED1;
break;
case KEY2_PRES:
LED0!=LED0;
LED1!=LED1;
break;
}
}
else
delay_ms (10);
}
}
在写这个实验代码的时候我遇到很多问题,分享给大家
- 定义变量必须在初始化之前;
- KEY0、KEY1、KEY2必须上拉(低电平有效)、WK_UP必须下拉(高电平有效)。