打印
[其他ST产品]

关于STM32F单片机举例按键学习分析

[复制链接]
839|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cr315|  楼主 | 2023-6-8 10:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在前面学习了LED点灯实验,虽说实现灯工作的状态可以使亮灭,或者流水灯,以及未来的呼吸灯模式。关于呼吸灯模式需要将GPIO口采用定时器引脚,并且配置为PWM功能才能实现呼吸灯模式,这里暂不讲解。
      控制灯点亮需要将GPIO口配置为输出模式,但是采集按键事件则需将按键配置成输入模式。关于输入模式一般有模拟输入,浮空输入,上拉输入和下拉输入。关于这些输入怎么选择呢。一般模拟输入一般用作模拟量信号的采集,诸如ADC引脚需要配置为模拟输入。浮空输入一般应用在通信的接收端,如I2C和USART的RX。上拉输入和下拉输入一般应用在一般的输入引脚。常见的如时钟信号,按键信号等等。
     在这里,我们将按键信号配置为外部上拉模式。也就是说,在按键不导通的情况下,按键的连接引脚为高电平,按键导通的情况下,按键连接的引脚为低电平。这里选择PB12配置为按键的输入引脚。我们可以新建两个文件,KEY.C和KEY.H文件其中KEY.C文件中进行GOIO口初始化配置,具体如下:
    void KEY_GPIO_Config(void)
{
  //定义结构体
  GPIO_InitTypeDef GPIO_InitStructure;
  //开启外设时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  //配置GPIO口引脚
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
  //配置引脚模式为上拉输入
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
          //配置引脚速率
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  //调用库函数
  GPIO_Init(GPIOB, &GPIO_InitStructure);      
}
    在KEY.H文件中包含void KEY_GPIO_Config(void)即可。
    随后在main函数中需要写入使用按键的函数。一般在使用按键函数时,需要写一个KEY_Scan函数,该函数的作用是一个是进行按键延时消抖(俗称去抖动)和检测按键按下和确认按键按下,一般函数为:
uint8_t Key_Scan(GPIO_TypeDef* GPIOx,u16 GPIO_Pin)
//该函数将返回一个unsigned char型变量,输入参数为GPIO寄存器结构体
{
    if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON );
    //利用单个位读取函数读取按键的值
     {   
       Key_Delay(10000); //延时,消抖
       if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON )  //再次确认按键按下
        {  
          while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON);//等待按键释放
          return  KEY_ON;  
        }
       else
       return KEY_OFF;
   }
   else
   return KEY_OFF;
}
其中有两个宏定义#define KEY_ON 0和#define KEY_OFF 1可以定义也可以不定义,只要能表述按键按下或者没有按下信息就好。
      一般在主函数中我们采用if( Key_Scan(GPIOB,GPIO_Pin_12) == KEY_ON )来判断按键是否按下。
       在学习这篇中,我们主要是了解按键怎么判断和怎么去抖,尤其是是要关注KEY_SCAN函数。

使用特权

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

本版积分规则

1392

主题

4500

帖子

0

粉丝