按键实验和前面的跑马灯、蜂鸣器主要的区别就是这个是读取外部的输入信号,之前的实验都是对外部输出信号。
一、硬件设计
本实验的硬件为三个按键、两个lED(LED0、LED1)、一个蜂鸣器(BEEP)。
KEY0控制LED0和LED1开,KEY1控制LED0和LED1关,按键WK_UP控制BEEP。
二、软件设计
1、子函数
1 //key.h 2 #ifndef __KEY_H 3 #define __KEY_H 4 5 #include "sys.h" 6 7 #define KEY0 GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_4) //读取按键输入 8 #define KEY1 GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_3) //读取按键输入 9 #define WK_UP GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) //读取按键输入 10 11 #define KEY0_DOWN 1 12 #define KEY1_DOWN 2 13 #define WK_UP_DOWN 3 14 15 void KEY_Init(void); //按键初始化 16 u8 Key_Value(u8 mode); //获取键值 17 18 #endif 19 20 21 //key.c 22 #include "key.h" 23 #include "stm32f10x.h" 24 #include "delay.h" 25 26 void KEY_Init(void) 27 { 28 GPIO_InitTypeDef GPIO_Structure_KEY; //定义结构体 29 30 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOA, ENABLE); //使能时钟 31 32 GPIO_Structure_KEY.GPIO_Mode = GPIO_Mode_IPU; //上拉输入 33 GPIO_Structure_KEY.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4; //PE.3和PE.4 34 GPIO_Structure_KEY.GPIO_Speed = GPIO_Speed_50MHz; //频率为50MHz 35 GPIO_Init(GPIOE, &GPIO_Structure_KEY); //初始化端口 36 37 GPIO_Structure_KEY.GPIO_Mode = GPIO_Mode_IPD; //下拉输入 38 GPIO_Structure_KEY.GPIO_Pin = GPIO_Pin_0; //PA.0 39 GPIO_Init(GPIOA, &GPIO_Structure_KEY); //初始化端口 40 } 41 42 u8 Key_Value(u8 mode) 43 { 44 static u8 key_up = 1; //mode为1表示支持连续按,0不支持连续按 45 46 if(mode)key_up = 1; 47 if(key_up&&(KEY0==0||KEY1==0||WK_UP==1)) 48 { 49 key_up = 0; 50 delay_ms(10); //延时消抖 51 if(KEY0==0) 52 return KEY0_DOWN; 53 else if(KEY1==0) 54 return KEY1_DOWN; 55 else if(WK_UP==1) 56 return WK_UP_DOWN; 57 } 58 else if(KEY0==1&&KEY1==1&&WK_UP==0) 59 key_up = 0; 60 return 0; 61 }
2、主函数
1 #include "stm32f10x.h" 2 #include "sys.h" 3 #include "delay.h" 4 #include "key.h" 5 #include "led.h" 6 #include "beep.h" 7 8 int main() 9 { 10 u8 key; 11 LED_Init(); //LED初始化 12 delay_init(); //延时初始化 13 BEEP_Init(); //蜂鸣器初始化 14 KEY_Init(); //按键初始化 15 while(1) 16 { 17 key = Key_Value(1); //获取键值,支持连续按 18 if(key) 19 { 20 switch(key) 21 { 22 case KEY0_DOWN: 23 GPIO_ResetBits(GPIOB, GPIO_Pin_5); //打开LED0和LED1 24 GPIO_ResetBits(GPIOE, GPIO_Pin_5); 25 break; 26 case KEY1_DOWN: 27 GPIO_SetBits(GPIOB, GPIO_Pin_8); //打开蜂鸣器 28 delay_ms(100); 29 GPIO_ResetBits(GPIOB, GPIO_Pin_8); //关闭蜂鸣器 30 break; 31 case WK_UP_DOWN: 32 GPIO_SetBits(GPIOE, GPIO_Pin_5); //关闭所有LED 33 GPIO_SetBits(GPIOB, GPIO_Pin_5); 34 break; 35 } 36 } 37 else 38 delay_ms(10); 39 } 40 }