GPIO按键输入实验学习笔记

按键输入实验

1.首先,按键实验是GPIO口的另一应用,上一次的跑马灯实验是将GPIO口作为输出,此次按键实验是将GPIO口作为输入。
2.GPIO作为输入时和输入的不同:

(1)首先,上拉电阻是为了保证在没有信号输入的时候,IO口保持高电平,若按键为低电平有效,则没有信号的时候,IO应呈现高电平,所以,此处应设置为上拉输入。

同理,下拉电阻是为了保证在没有信号输入的时候,IO口保持低电平,若按键为高电平有效,则没有信号的时候,IO应呈现低电平。

然后再配置一下IO口引脚,初始化PA0即可。作为输入时,不需要配置速度。

(2)GPIO口各项功能配置完毕之后就是编写按键函数。库函数操作为:GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0);若是很简单要实现按键控制LED灯的功能,只需如下的代码:

 

这里led灯的转换是通过位带操作的,具体操作是在LED.h里写如下代码:#define LED0 PAout(0)即可

考虑道按键防抖,写了如下的按键扫描函数:

 

一.STM32 IO 口简介

STM32 的 IO 口 做输入使用的时候,是通过调用函数 GPIO_ReadInputDataBit()来读取 IO 口的状态的。 这一节,我们将通过 MiniSTM32 开发板上载有的 3 个按钮(KEY0/KEY1/WK_UP),来控 制板上的 2 个 LED,其中 KEY0 控制 DS0,按一次亮,再按一次,就灭。KEY1 控制 DS1,效 果同 KEY0。WK_UP 按键则同时控制 DS0 和 DS1,按一次,他们的状态就翻转一次。

二.硬件设计

本实验用到的硬件资源有: 1) 指示灯 DS0、DS1 2) 3 个按键:KEY0、KEY1 和 KEY_UP。 DS0、DS1 和 STM32 的连接在上一节跑马灯已经介绍了,在 MiniSTM32 开发板上的按键 KEY0连接在 PC5 上、KEY1 连接在 PA15 上、WK_UP 连接在 PA0 上。如下图所示:

 

三.软件设计

        打开我们的按键实验工程可以看到,我们引入了key.c文件以及头文件key.h。下面我们首先打开key.c文件,代码如下:

    #include "key.h"
    #include "delay.h"
    //按键初始化函数  
    //PA15和 PC5 设置成输入
    void KEY_Init(void)
    {  
        GPIO_InitTypeDefGPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC, ENABLE);//使能 PORTA,PORTC时钟
        GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); //关闭 jtag,使能 SWD,可以用 SWD模式调试
        GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_15;//PA15  
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入  
        GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化 GPIOA15    
        GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_5;//PC5  
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入   
        GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化
        GPIOC5    
        GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;//PA0  
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0设置成输入,默认下拉     
        GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化 GPIOA.0  
    }
    //按键处理函数
    //返回按键值
    //mode:0,不支持连续按;1,支持连续按;
    //返回值:
    //0,没有任何按键按下
    //KEY0_PRES,KEY0按下
    //KEY1_PRES,KEY1按下
    //WKUP_PRES,WK_UP按下  
    //注意此函数有响应优先级,KEY0>KEY1>WK_UP!!
    u8 KEY_Scan(u8 mode)
    {    static u8 key_up=1;//按键按松开标志  
         if(mode)key_up=1;  //支持连按      
         if(key_up&&(KEY0==0||KEY1==0||WK_UP==1))
         {   
           delay_ms(10);//去抖动    
           key_up=0;   
           if(KEY0==0)return KEY0_PRES;   
           else if(KEY1==0)return KEY1_PRES;   
           else if(WK_UP==1)return WKUP_PRES;   
         }else if(KEY0==1&&KEY1==1&&WK_UP==0)key_up=1;         
         return 0;// 无按键按下
    }
     
                    

这段代码包含2个函数,void KEY_Init(void)和u8 KEY_Scan(u8 mode),KEY_Init是用来初始化按键输入的IO口的。实现PA0、PA15和PC5的输入设置。接下来我们看看头文件key.h里面的代码。

 

    #ifndef __KEY_H
    #define __KEY_H   
    #include "sys.h"
    #define KEY0  GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)//读取按键 0
    #define KEY1  GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15)//读取按键 1
    #define WK_UP  GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)//读取按键 2    
    #define KEY0_PRES 1  //KEY0   
    #define KEY1_PRES 2  //KEY1  
    #define WKUP_PRES 3  //WK_UP

#endif这段代码里面最关键就是3个宏定义:  

    #define KEY0    GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)//读取按键 0
    #define KEY1    GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15)//读取按键 1
    #define WK_UP   GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)//读取按键 2

 

main.c里面编写的主函数代码如下:

    #include "led.h"
    #include "delay.h"
    #include "sys.h"
    #include "key.h"
    //按键输入实验      
    int main(void)  
    {   u8 t;     
        delay_init();       //延时函数初始化     
        LED_Init();      //初始化与 LED连接的硬件接口
        KEY_Init();           //初始化与按键连接的硬件接口
        LED0=0;     //点亮 LED  
        while(1)  
        {   
          t=KEY_Scan(0);  //得到键值   
          switch(t)   
          {         
            case KEY0_PRES:     
            LED0=!LED0;     
            break;    
            case KEY1_PRES:     
            LED1=!LED1;     
            break;    
            case WKUP_PRES:        
            LED0=!LED0;    
            LED1=!LED1;     
            break;    
            default:     
            delay_ms(10);    
            }   
        }    
    }

最后编程运行程序出现下图表示没有错误:

 

物联沃分享整理
物联沃-IOTWORD物联网 » GPIO按键输入实验学习笔记

发表评论