按鍵實驗和前面的跑馬燈、蜂鳴器主要的區別就是這個是讀取外部的輸入信號,之前的實驗都是對外部輸出信號,
一、硬體設計
本實驗的硬體為三個按鍵、兩個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 112 #define KEY1_DOWN 213 #define WK_UP_DOWN 314 15 void KEY_Init(void); //按鍵初始化16 u8 Key_Value(u8 mode); //獲取鍵值 17 18 #endif19 20 21 //key.c22 #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.434 GPIO_Structure_KEY.GPIO_Speed = GPIO_Speed_50MHz; //頻率為50MHz35 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.039 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和LED124 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); //關閉所有LED33 GPIO_SetBits(GPIOB, GPIO_Pin_5);34 break;35 } 36 }37 else38 delay_ms(10); 39 }40 }
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/38492.html
標籤:嵌入式
