前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >物联网-GPIO输入—按键检测

物联网-GPIO输入—按键检测

原创
作者头像
会洗碗的CV工程师
发布2024-02-07 22:44:04
2800
发布2024-02-07 22:44:04
举报
文章被收录于专栏:LongJava学习资料

1. 实验目的

通过按键控制三个LED灯的关灭,按下按键k2,LED显示流水灯样式,按下按键k3,LED从新开始显示流水灯。

2. 实验原理

按键机械触点断开、闭合时,由于触点的弹性作用,按键开关不会马上稳定接通或一下子断开,使用按键时会产生图 6-1 中的带波纹信号,需要用软件消抖处理滤波,不方便输入检测。本实验板连接的按键带硬件消抖功能,见图 6.1.1,它利用电容充放电的延时,消除了波纹,从而简化软件的处理,软件只需要直接检测引脚的电平即可。

GPIO(General Purpose Input/Output)输入在按键检测中起着关键作用。以下是使用GPIO输入进行按键检测的一般步骤:

  1. 初始化GPIO:首先,需要配置GPIO引脚作为输入。这通常涉及设置引脚的模式(例如,上拉、下拉或浮空)以及配置相关的寄存器。
  2. 使能GPIO端口时钟:在大多数微控制器中,需要使能(即启用)GPIO端口的时钟,以便能够访问和控制该端口上的引脚。
  3. 读取引脚状态:一旦GPIO引脚被配置为输入,就可以读取其状态了。这通常是通过读取相应的寄存器来完成的。如果引脚被配置为上拉或下拉模式,那么可以通过读取该引脚的电平来确定按键是否被按下。
  4. 去抖动:在读取按键状态时,可能需要进行去抖动处理,以消除由于机械开关的固有特性(如接触弹跳)引起的噪声。
  5. 实现按键检测逻辑:在读取到按键状态后,可以实现相应的逻辑来处理按键事件。例如,可以设置一个中断处理程序来响应按键按下或释放事件。

具体的实现细节可能会因微控制器的型号和开发环境的不同而有所差异。因此,建议查阅相关的硬件文档和软件开发工具包(SDK)以获取更详细的信息。

此外,为了通过LED灯的亮灭状态来间接完成按键检测,可以配置一个LED灯连接的GPIO引脚作为输出。当检测到按键按下时,将LED灯对应的引脚设置为高电平(或低电平,取决于电路设计),从而点亮LED灯。再次按下按键时,将LED灯对应的引脚设置为低电平(或高电平),从而熄灭LED灯。这样,就可以通过LED灯的亮灭状态来直观地反映按键的状态了。

图 6.1.1 按键抖动说明图

从按键的原理图可知,这些按键在没有被按下的时候,GPIO 引脚的输入状态为高电平(按键所在的电路不通,引脚接地),当按键按下时,GPIO 引脚的输入状态为低电平(按键所在的电路导通,引脚接到电源)。只要我们检测引脚的输入电平,即可判断按键是否被按下。若您使用的实验板按键的连接方式或引脚不一样,只需根据我们的工程修改引脚即可,程序的控制原理相同。

3. 主要仪器设备

GEC-STM32F429开发板和keil 5软件

4. 实验内容及步骤

1,首先用keil软件打开实验项目,确保可编译之后。

2,开发板使用usb连接线连接上电脑

3,然后使用点击load加载到开发板上。

4,修改代码,实例代码如下

代码语言:c
复制
#include "stm32f4xx.h"
#include "./led/bsp_led.h"
#include "./key/bsp_key.h" 
/**
 * @brief  主函数
 * @param  无
 * @retval 无
 */
u8 interruptDelay(__IO uint32_t nCount, u8* ledSwitch);
void Delay(__IO uint32_t nCount);
int main(void)
{
 u8 ledSwitch = 1;  // 灯开关标志, 1开0灭
 /* LED 端口初始化 */
 LED_GPIO_Config();  
 /*初始化按键*/
 Key_GPIO_Config();
 /* 轮询按键状态,若按键按下则反转LED */ 
 while(1) {  
  if(ledSwitch == 0){
   LED1( OFF );
   LED2( OFF ); 
   LED3( OFF );
   while( Key_Scan(KEY2_GPIO_PORT,KEY2_PIN) != KEY_ON );
   ledSwitch = 1;
  }
  LED1( ON );    // 亮 
  //Delay(0xFFFFFF);
  interruptDelay(0xAFFFF, &ledSwitch);
  LED1( OFF );   // 灭
  LED2( ON );   // 亮 
  //Delay(0xFFFFFF);
  interruptDelay(0xAFFFF, &ledSwitch);
  LED2( OFF );   // 灭
  LED3( ON );    // 亮 
  //Delay(0xFFFFFF);
  interruptDelay(0xAFFFF, &ledSwitch);
  LED3( OFF );   // 灭 
 }
}
u8 interruptDelay(__IO uint32_t nCount, u8* ledSwitch){
 if(*ledSwitch == 0){
  return 1;
 }
 for(; nCount != 0; nCount--){
  if(Key_Scan(KEY1_GPIO_PORT,KEY1_PIN) == KEY_ON){
   *ledSwitch = 0;
   return 1;
  }
 }
 return 0;
}
void Delay(__IO uint32_t nCount)  //简单的延时函数
{
 for(; nCount != 0; nCount--);
}
/*********************************************END OF FILE**********************/

我正在参与2024腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档