打印
[STM32]

立创商城STM32F系列——STM32f4按键输入实验代码(01)

[复制链接]
877|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
小乐Tzz|  楼主 | 2018-8-31 10:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32f4————按键输入实验代码(01)
/*******************************************************/
我们首先打开 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。   
/*******************************************************/


【立创商城】STM32F103CBT6 托盘  https://item.szlcsc.com/8796.html

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

70

主题

70

帖子

0

粉丝