STM-32:按键控制LED灯 程序详解

一、基本原理

在这里插入图片描述
左边是STM322里电路每一个端口均可以配置的电路部分,右边部分是外接设备 电路图。

配置为 上拉输入模式的意思就是,VDD开关闭合,VSS开关断开。

浮空输入模式的意思就是,VDD开关断开,VSS开关断开。

下拉输入模式的意思就是,VDD开关断开,VSS开关闭合。

在 按键控制LED灯亮灭 中,必须要求配置为上拉输入模式。在按键开k1断开,及不操作的时候,上拉输入模式有VDD上拉电阻将引脚电平上拉,保证了不会出现浮动的现象。

配置好了上拉输入模式,VSS开关就已经断开了, 通过K1按键开关的通断来实现的。所以在这种方式下,按下K1为低电平,松开K1位高电平。

如果外部元件如下图加上一个电阻R1(下图),就可以将端口 配置为浮空模式。R1电阻充当了上拉模式中的VDD的作用。
在这里插入图片描述

二、接线图

在这里插入图片描述

三、程序思路

3.1库函数

RCC_APB2PeriphClockCmd    :使能或者失能APB2外设时钟。

GPIO_SetBits  :设置指定的数据端口位。置高1。

GPIO_ResetBits       :清除指定的数据端口位。置低0。

GPIO_ReadOutputDataBit     :读取指定端口管脚的输出。

GPIO_ReadInputDataBit                  :读取指定端口管脚的输入。

3.2程序代码

LED.c

#include "stm32f10x.h"                  // Device header
void LED_Init(void)						//初始化
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	GPIO_SetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2); //由于初始化后默认是为低电平,SetBits为了让端口置高。设定为了让LED开始是熄灭的状态。
}
 
void LED1_ON(void)		//LED1点亮程序
{
	GPIO_ResetBits (GPIOA, GPIO_Pin_1);
}
 
void LED1_OFF(void)		//LED1熄灭程序
{
	GPIO_SetBits(GPIOA, GPIO_Pin_1);
}
 
void LED1_Turn(void)		//状态取反。实现按下松开LED亮,按下送开LED熄灭
{
	if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1) == 0)
	{
		GPIO_SetBits(GPIOA, GPIO_Pin_1);
	}
	else
	{
		GPIO_ResetBits(GPIOA, GPIO_Pin_1);
	}
}
 
 
void LED2_ON(void)		//LED2点亮程序
{
	GPIO_ResetBits(GPIOA, GPIO_Pin_2);
}
 
void LED2_OFF(void)		//LED2熄灭程序
{
	GPIO_SetBits(GPIOA, GPIO_Pin_2);
}
 
void LED2_Turn(void)		//状态取反。
{
	if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_2) == 0)	//读取指定端口管脚的输出。If读取的管脚(GPIO_Pin_2)输出为0。
	{
		GPIO_SetBits(GPIOA, GPIO_Pin_2);	//就将GPIO_Pin_2置高(置1)
	}
	else
	{
		GPIO_ResetBits(GPIOA, GPIO_Pin_2);	//否则置底(置0)
	}
}

LED.h

#ifndef __LED_H
#define __LED_H
 
void LED_Init(void);
void LED1_ON(void);
void LED1_OFF(void);
void LED1_Turn(void);
void LED2_ON(void);
void LED2_OFF(void);
void LED2_Turn(void);
 
#endif

Key.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
 
void Key_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;	//这里需要读取按键K1,用的上拉输入。
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_11;	//K1按键引脚接在了,PB1和PB11两个接口上。
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
}
 
uint8_t Key_GetNum(void)					//右键查询:uint8_t是typedef unsigned char
{
	uint8_t KeyNum = 0;
	if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0)	//if判断按键1按下没有松手。
	{
		Delay_ms(20);		//消抖动
		while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0);		//还没有松手,在while里面循环。
		Delay_ms(20);		//松手,跳出while,延时消抖动。
		KeyNum = 1;	        //按键1返回1
	}
	if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0)   //if判断按键2按下没有松手。
	{
		Delay_ms(20);
		while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0);
		Delay_ms(20);
		KeyNum = 2;
	}
	
	return KeyNum;	    
}

Key.h

#ifndef __KEY_H
#define __KEY_H
 
void Key_Init(void);
uint8_t Key_GetNum(void);
 
#endif

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "LED.h"
#include "Key.h"
 
uint8_t KeyNum;
 
int main(void)
{
	LED_Init();
	Key_Init();
	
	while (1)
	{
		KeyNum = Key_GetNum();    //将 Key_GetNum() 返回值给KeyNum 
		if (KeyNum == 1)
		{
			LED1_Turn();
		}
		if (KeyNum == 2)
		{
			LED2_Turn();
		}
	}
}

注:

上拉下拉的选择:
如果按键按下是高电平有效的话,我们就下拉,让该IO口在默认状态下处于低电平(即没有按键按下时IO口检测到的总是低电平,只有按键按下的时候IO口才会检测到高电平);

如果按键按下是低电平有效的话,我们就上拉,让该IO口在默认状态下处于高电平(即没有按键按下时IO口检测到的总是高电平,只有按键按下的时候IO口才会检测到低电平)

if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0)

    uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);这个函数是用来读取输入寄存器(图)某一个端口的输入值的

    uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx); 这个函数是用来读取整个输入寄存器的,返回值是一个16位的数据,每一位代表一个端口值

    uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); 这个函数是用来读取输出寄存器(图)某一个端口的输出值的,用来看一下自己输出了什么

    uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx); 这个函数是用来读取整个输出寄存器的,返回值是一个16位的数据,每一位代表一个端口值。

按下按键一端接B1端口,按键按下为低电平,if 判断 当B1端口为低电平时(按下按键),消抖之后返回值。

  • 4
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
您可以通过以下步骤来实现stm32按键控制的亮灭: 1. 配置GPIO引脚:选择要用于控制的GPIO引脚,并将其配置为输出模式。 2. 配置按键GPIO引脚:选择要用于接收按键输入的GPIO引脚,并将其配置为输入模式。 3. 在主程序中,使用while循环来读取按键输入状态。 4. 如果按键被按下,将GPIO引脚设置为高电平,从而点亮LED。 5. 如果按键未被按下,将GPIO引脚设置为低电平,从而关闭LED。 以下是示例代码: ``` #include "stm32f10x.h" void LED_Init(void); void KEY_Init(void); int main(void) { LED_Init(); KEY_Init(); while(1) { if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) == 0) GPIO_SetBits(GPIOC,GPIO_Pin_13); else GPIO_ResetBits(GPIOC,GPIO_Pin_13); } } void LED_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); } void KEY_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOA, &GPIO_InitStructure); } ``` 在这个例子中,我们将PA0配置为输入模式,并在PC13上控制LED。如果按下PA0上的按键,PC13输出高电平,从而点亮LED,否则PC13输出低电平,关闭LED

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hello xiǎo lěi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值