key.h :
#ifndef _key_H #define _key_H #include "system.h" #define KEY0_PIN GPIO_Pin_4 //定义KEY0管脚 #define KEY1_PIN GPIO_Pin_3 //定义KEY1管脚 #define KEY2_PIN GPIO_Pin_2 //定义KEY2管脚 #define KEY_UP_PIN GPIO_Pin_0 //定义KEY_UP管脚 #define KEY_PORT GPIOE //定义端口 #define KEY_UP_PORT GPIOA //定义端口 //使用位操作定义 #define KEY_UP PAin(0) #define KEY0 PEin(4) #define KEY1 PEin(3) #define KEY2 PEin(2) //定义各个按键值 #define KEY_UP_PRESS 1 #define KEY0_PRESS 2 #define KEY1_PRESS 3 #define KEY2_PRESS 4 void KEY_Init(void); u8 KEY_Scan(u8 mode); #endif
key.c :
#include "key.h"
#include "SysTick.h"
//初始化
void KEY_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);
GPIO_InitStructure.GPIO_Pin=KEY_UP_PIN; //选择你要设置的IO口
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;//下拉输入
GPIO_Init(KEY_UP_PORT,&GPIO_InitStructure); /* 初始化GPIO */
GPIO_InitStructure.GPIO_Pin=KEY0_PIN|KEY1_PIN|KEY2_PIN;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; //上拉输入
GPIO_Init(KEY_PORT,&GPIO_InitStructure);
}
//按键消抖
u8 KEY_Scan(u8 mode)
{
static u8 key=1;
if(mode==1) //连续按键按下
key=1;
if(key==1&&(KEY_UP==1||KEY0==0||KEY1==0||KEY2==0)) //任意一个按键按下
{
delay_ms(10); //消抖
key=0;
if(KEY_UP==1)
return KEY_UP_PRESS;
else if(KEY0==0)
return KEY0_PRESS;
else if(KEY1==0)
return KEY1_PRESS;
else if(KEY2==0)
return KEY2_PRESS;
}
else if(KEY_UP==0&&KEY0==1&&KEY1==1&&KEY2==1) //无按键按下
key=1;
return 0;
}
main.c :
#include "system.h"
#include "SysTick.h"
#include "led.h"
#include "beep.h"
#include "key.h"
int main()
{
u8 key,i=0;
SysTick_Init(72);
LED_Init();
BEEP_Init();
KEY_Init();
while(1)
{
key=KEY_Scan(0); //扫描按键
switch(key)
{
case KEY_UP_PRESS: LED2=0;break; //点亮D2指示灯
case KEY1_PRESS: LED2=1;break; //熄灭D2指示灯
case KEY2_PRESS: BEEP=1;break; //蜂鸣器开
case KEY0_PRESS: BEEP=0;break; //蜂鸣器关
}
i++;
if(i%20==0)
{
LED1=!LED1; //LED1状态取反
}
delay_ms(10);
}
}