按鍵實驗和前面的跑馬燈、蜂鳴器主要的區別就是這個是讀取外部的輸入信號,之前的實驗都是對外部輸出信號。 一、硬體設計 本實驗的硬體為三個按鍵、兩個lED(LED0、LED1)、一個蜂鳴器(BEEP)。 KEY0控制LED0和LED1開,KEY1控制LED0和LED1關,按鍵WK_UP控制BEEP。 二 ...
按鍵實驗和前面的跑馬燈、蜂鳴器主要的區別就是這個是讀取外部的輸入信號,之前的實驗都是對外部輸出信號。
一、硬體設計
本實驗的硬體為三個按鍵、兩個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 }