×
单片机 > 单片机程序设计 > 详情

STM32f4按键输入实验代码(01)

发布时间:2020-05-19 发布时间:
|

我们首先打开 key.c文件,关键代码如下:

#include "key.h"

#include "delay.h"  

 

//按键初始化函数

void KEY_Init(void)

{

GPIO_InitTypeDef  GPIO_InitStructure;

 

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOE,  

ENABLE);//使能 GPIOA,GPIOE 时钟

   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;

  //KEY0 KEY1 KEY2对应引脚

   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通输入模式

   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100M

   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉

   GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE2,3,4

  

   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//WK_UP 对应引脚PA0

   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN ;//下拉

   GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化 GPIOA0

  

}  

//按键处理函数

//返回按键值

//mode:0,不支持连续按;1,支持连续按;

//0,没有任何按键按下

//1,KEY0按下 2,KEY1按下3,KEY2按下  4,WKUP 按下  WK_UP

//注意此函数有响应优先级,KEY0>KEY1>KEY2>WK_UP!!

u8 KEY_Scan(u8 mode)

{    

  static u8 key_up=1;//按键按松开标志

  if(mode)key_up=1;  //支持连按       

  if(key_up&&(KEY0==0||KEY1==0||KEY2==0||WK_UP==1))

  {

    delay_ms(10);//去抖动  

    key_up=0;

    if(KEY0==0)return 1;

    else if(KEY1==0)return 2;

    else if(KEY2==0)return 3;

    else if(WK_UP==1)return 4;

  }else if(KEY0==1&&KEY1==1&&KEY2==1&&WK_UP==0)key_up=1;  

return 0;// 无按键按下

}

这段代码包含2个函数,void KEY_Init(void)和u8 KEY_Scan(u8 mode),KEY_Init是用来初始化按键输入的IO 口的。实现 PA0、PE2~4 的输入设置,这里和第六章的输出配置差不多,只是这里用来设置成的是输入而第六章是输出。

KEY_Scan函数,则是用来扫描这4个 IO 口是否有按键按下。KEY_Scan函数,支持两种扫描方式,通过mode参数来设置。

当mode为0的时候,KEY_Scan函数将不支持连续按,扫描某个按键,该按键按下之后必须要松开,才能第二次触发,否则不会再响应这个按键,这样的好处就是可以防止按一次多次触发,而坏处就是在需要长按的时候比较不合适。

当 mode为 1的时候,KEY_Scan函数将支持连续按,如果某个按键一直按下,则会一直返回这个按键的键值,这样可以方便的实现长按检测。

有了 mode 这个参数,大家就可以根据自己的需要,选择不同的方式。这里要提醒大家,因为该函数里面有static变量,所以该函数不是一个可重入函数,在有OS 的情况下,这个大家要留意下。 同时还有一点要注意的就是,该函数的按键扫描是有优先级的,最优先的是KEY0,第二优先的是KEY1,接着 KEY2,最后是KEY3(KEY3 对应KEY_UP 按键) 。该函数有返回值,如果有按键按下,则返回非 0值,如果没有或者按键不正确,则返回0。  


关键字:STM32f4  按键输入  实验代码 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
8051单片机的函数发生器的设计