嵌入式02 STM32 实验06 按键

时间:2019-09-30
本文章向大家介绍嵌入式02 STM32 实验06 按键,主要包括嵌入式02 STM32 实验06 按键使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

  按键实验和前面的跑马灯、蜂鸣器主要的区别就是这个是读取外部的输入信号,之前的实验都是对外部输出信号。

 一、硬件设计

  本实验的硬件为三个按键、两个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 }

  

原文地址:https://www.cnblogs.com/ksht-wdyx/p/11608376.html