zoukankan      html  css  js  c++  java
  • 嵌入式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 }

      

  • 相关阅读:
    配置 L3 agent
    Why Namespace?
    虚拟 ​router 原理分析
    创建 router 连通 subnet
    用 config drive 配置网络
    cloud
    写在最前面
    使用apktool工具遇到could not decode arsc file的解决办法
    php-fpm优化
    解决官网下载jdk只有5k大小的错误
  • 原文地址:https://www.cnblogs.com/ksht-wdyx/p/11608376.html
Copyright © 2011-2022 走看看