网站首页 全球最实用的IT互联网站!

人工智能P2P分享Wind搜索发布信息网站地图标签大全

当前位置:诺佳网 > 电子/半导体 > 控制/MCU >

STM32按键控制LED的亮灭

时间:2023-12-11 14:19

人气:

作者:admin

标签:

导读:使用一个按键控制LED的亮灭,按键按下时LED亮起,按键松开时LED熄灭。通过按键控制实验来介绍下 IO 口作为输入的使用。本例中用到了GPIOE的PE3管脚。...

使用一个按键控制LED的亮灭,按键按下时LED亮起,按键松开时LED熄灭。通过按键控制实验来介绍下 IO 口作为输入的使用。本例中用到了GPIOE的PE3管脚。

LED和按键的电路图。

454bebfa-97ec-11ee-8b88-92fbcf53809c.png

455c27d6-97ec-11ee-8b88-92fbcf53809c.png

按键 K_LEFT、K_DOWN、K_RIGHT 分别连接在 STM32F1 芯片的 PE2、PE3、PE4引脚上。

按键另一端是全部接在 GND 上,这个和我们学习 51单片机是一样的,采用独立式按键接法,按下时输入到芯片管脚即为低电平。

整个程序实现的流程步骤如下:

初始化按键使用的端口及时钟

按键检测处理

按键控制处理

工程文件目录如下。

4573208a-97ec-11ee-8b88-92fbcf53809c.png

IO口初始化程序代码在key.c文件中。

/***************************************************************
* 函 数 名 : KEY_Init
* 函数功能 : 按键初始化
* 输 入 : 无
* 输 出 : 无
*****************************************************************/
void KEY_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);
GPIO_InitStructure.GPIO_Pin=KEY_UP_Pin;//选择你要设置的IO口
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;//下拉输入
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//设置传输速率
GPIO_Init(KEY_UP_Port,&GPIO_InitStructure);/*初始化GPIO*/
GPIO_InitStructure.GPIO_Pin=KEY_DOWN_Pin|KEY_LEFT_Pin|KEY_RIGHT_Pin;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//上拉输入
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(KEY_Port,&GPIO_InitStructure);
}

要知道哪个按键被按下,就需要编写按键检测函数,具体代码如下:

/****************************************************************
* 函 数 名 : KEY_Scan
* 函数功能 : 按键扫描检测
* 输 入 : mode=0:单次按下按键
 mode=1:连续按下按键
* 输 出 : 0:未有按键按下
KEY_UP:K_UP 键按下
KEY_DOWN:K_DOWN 键按下
KEY_LEFT:K_LEFT 键按下
KEY_RIGHT:K_RIGHT 键按下
*****************************************************************/
u8 KEY_Scan(u8 mode)
{
  static u8 key=1;
  if(key==1&&(K_UP==1||K_DOWN==0||K_LEFT==0||K_RIGHT==0))//任意一个按键按下
  {
delay_ms(10);//消除抖动
    key=0;
    if(K_UP==1)
    {
      return KEY_UP;
    }
    else if(K_DOWN==0)
    {
      return KEY_DOWN;
    }
    else if(K_LEFT==0)
    {
      return KEY_LEFT;
    }
    else
    {
      return KEY_RIGHT;
    }
  }
elseif(K_UP==0&&K_DOWN==1&&K_LEFT==1&&K_RIGHT==1)//无按键按下
{
  key=1;
}
if(mode==1)//连续按键按下
{
  key=1;
}
  return 0;
}

主函数,代码如下:

#include "system.h"
#include "SysTick.h"
#include "led.h"
#include"key.h"
int main()
{
  u8 key;
  SysTick_Init(72);
  LED_Init();
  KEY_Init();


while(1)
  {
    key=KEY_Scan(1);   //Á¬ÐøÉ¨Ãè°´¼ü
if(key)
    {
      led2=0;
      delay_ms(5);//每隔5ms灭一次
if(KEY_Scan(1)!=key)
      {
        led2=!led2;
        delay_ms(5);
      }
    }    
  }
}

审核编辑:汤梓红
温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信