STM32-GPIO按键输入-按键控制LED

本文介绍如何使用STM32固件库通过GPIO控制LED灯的亮灭及检测按键状态。主要内容包括配置GPIO端口时钟、初始化GPIO引脚、编写测试程序等步骤。同时提供了一个简单的示例程序,演示如何实现按键控制LED。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、软件设计

与固件库点亮LED相同,我们需要一个工程模板详情可以用看(1条消息) STM32固件库点亮LED灯_学c入门到入土的博客-CSDN博客

1、编程要点

1)使能GPIO端口时钟。

2)初始化GPIO目标引脚,并设置为输入模式(浮空输入模式)如果想要知道底层逻辑详情可以看(1条消息) STM32-GPIO外设详解_学c入门到入土的博客-CSDN博客

3)编写简单测试程序,检测KEY按键的状态,实现按键控制LED 。

LED头文件

#ifndef _LED_H_         //判断标号_LED_H_是否被定义,如果没有则#ifndef到#endif代码有效
#define _LED_H_
 
#include <stm32f10x.h>
 
#define LED_GPIO_PORT        GPIOA                   //LED的GPIO端口
#define LED_GPIO_CLK         RCC_APB2Periph_GPIOA    //LED相对应的时钟端口开启
#define LED_GPIO_PIN         GPIO_Pin_0              //LED的GPIO引脚号
 
void LED_GPIO_Config(void);                             //LEDGPIO端口初始化函数
 
#endif

LED.C文件

#include "led.h"
 
void LED_GPIO_Config(void)
{
   RCC_APB2PeriphClockCmd(LED_GPIO_CLK,ENABLE);
        /*开启LED相关的GPIO外设时钟*/
    
   GPIO_InitTypeDef GPIO_InitStructure;
        /*定义一个GPIO_InitTypeDef类型的结构体*/
 
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
        /*设置引脚模式为通用推挽输出*/
 
	GPIO_InitStructure.GPIO_Pin=LED_GPIO_PIN;
        /*选择要控制的引脚*/
 
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        /*设置引脚速率为50MHz*/
 
	GPIO_Init(LED_GPIO_PORT,&GPIO_InitStructure);
        /*调用库函数初始化GPIO*/
 
}

KEY头文件

#ifndef _KEY_H_         //判断标号_KEY_H_是否被定义,如果没有则#ifndef到#endif代码有效
#define _KEY_H_
 
#include <stm32f10x.h>
 
#define KEY_GPIO_PORT        GPIOB                   
//KEY的GPIO端口

#define KEY_GPIO_CLK         RCC_APB2Periph_GPIOB    
//KEY相对应的时钟端口开启

#define KEY_GPIO_PIN         GPIO_Pin_0              
//KEY的GPIO引脚号

#define KEY_ON               0   //不一定低电平就是按下,这样可以根据自己需要所更改
//KEY按键状态:按下

#define KEY_OFF              1
//KEY按键状态:按键未按下
 
void KEY_GPIO_Config(void);                                
 //KEY GPIO端口初始化函数

void delay_ms(unsigned int ms);
//延时函数

uint8_t KEY_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin);
/*功能:检查是否有按键被按下
 *输入参数1:GPIOx:具体的端口,x可以是(A~G)
 *输入参数2:GPIO_Pin:具体的端口:GPIO_Pin_x(x可以是0~15)
 *返回值:按键状态
        *KEY_ON:按键按下
        *KEY_OFF:按键未按下
 */

 
#endif

KEY.C文件

#include "KEY.h"
 
void KEY_GPIO_Config(void)
{
    RCC_APB2PeriphClockCmd(KEY_GPIO_CLK,ENABLE);
        /*开启KEY相关的GPIO外设时钟*/
    
    GPIO_InitTypeDef GPIO_InitStructure;
        /*定义一个GPIO_InitTypeDef类型的结构体*/
 
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
        /*设置引脚模式为浮空输入模式*/
 
	GPIO_InitStructure.GPIO_Pin=KEY_GPIO_PIN;
        /*选择要控制的引脚*/
 
	GPIO_Init(KEY_GPIO_PORT,&GPIO_InitStructure);
        /*调用库函数初始化GPIO*/
 
}
void delay_ms(unsigned int ms)  //延时函数
{
	unsigned int i,j;
	for(i=ms;i>0;i--)
		for(j=110;j>0;j--);
}
uint8_t KEY_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)
{
    /*检测按键是否被按下*/
    if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin)==KEY_ON)
	{
        /*按键去抖动*/  //如果你使用的是硬件有按键去抖处理那么这部分可以去掉
		delay_ms(50);
        /*再次确定按键是真的被按下去了*/
		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;
     
}

main.C文件

#include "led.h"
#include "key.h"

int main()
{
	LED_GPIO_Config();
	//调用LED初始化函数
	KEY_GPIO_Config();
	//调用KEY初始化函数

	while(1)
	{
		//调用按键判断函数,使用固件库函数拉高LED引脚电平
		if(KEY_Scan(KEY_GPIO_PORT,KEY_GPIO_PIN)==KEY_ON)
		{
			GPIO_SetBits(LED_GPIO_PORT,LED_GPIO_PIN);
		}
		//调用按键判断函数,使用固件库函数拉低LED引脚电平
		if(KEY_Scan(KEY_GPIO_PORT,KEY_GPIO_PIN)==KEY_ON)
		{
			GPIO_ResetBits(LED_GPIO_PORT,LED_GPIO_PIN);
		}
	}
}

这个小程序就完了,没有什么特别介绍的,只是吧我们前面所学的知识组合了一下 这里面使用到了一个新的固件库函数

函数名GPIO_ReadInputDataBit()
函数原型u8 GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, u16 GPIO_Pin)
功能描述读取指定端口引脚的输入
输入参数 1GPIOx:x可以是A,B,C,D,来选择GPIO外设
输入参数 2

GPIO_Pin:待读取端口位

该参数可以取GPIO_Pin_x(x可以是0到15的任意组合)

返回值输入端口引脚值

函数基本原理就是读取GPIO-IDR(端口输入数据寄存器)的状态并进行返回值处理。

关注我下面我会继续更新GPIO外设输入输出的实际小程序,来帮助大家更好的理解GPIO外设的功能,后面还会更新STM32的所有特色外设。 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值