stm32--------按键控制点亮LED灯

1.GPIO结构学习

大概了解
大概了解

2.stm32的基本认知(开启时钟)------>为什么

人活着一直在变的是时间,它伴随着人的心脏跳动,那么RCC_APB2PeriphClockCmd(时钟)就是stm32的心脏,每当用时必定要开启时钟。

3.按键学习

这些是常见的按键设计方案

在我的代码用的是第2张图(属于上拉模式)

Key.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
void  Key_Init()
{
 /**
    * 函    数:按键初始化
	* 参    数:GPIO_Mode_IPU(上拉输入)
    * 返 回 值:无
  */
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//开启GPIOB的时钟
	/*GPIO初始化*/
	GPIO_InitTypeDef GPIO_InitStructure;//配置结构体
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1 |GPIO_Pin_11;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStructure);
}
uint8_t Key_GetNum(void)
{
	uint8_t KeyNum=0;   //每次调用进行返回值初始化
	if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0)//读PB1输入寄存器的状态,如果为0,则代表按键1按下(上拉输入)
	{
		Delay_ms(20);//延时消抖
		while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0);//等待按键松手
		Delay_ms(20);//延时消抖
		KeyNum = 1;//置键码为1	
	}
	
	if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)==0)//读PB1输入寄存器的状态,如果为0,则代表按键1按下(上拉输入)
	{
		Delay_ms(20);//延时消抖
		while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0);//等待按键松手
		Delay_ms(20);//延时消抖
		KeyNum = 2;//置键码为2	
	}
	return KeyNum;//返回键码值
}

Key.h

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

4.LED学习

LED:发光二极管,正向通电点亮,反向通电不亮

常见的LED设计图

在代码中使用的是推挽输出图4

LED.c

#include "stm32f10x.h"                  // Device header
/**
  * 函    数:LED初始化
  * 参    数:无
  * 返 回 值:无
  */
void LED_Init()
{
	/*开启时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//开启GPIOA的时钟
	/*GPIO初始化*/
	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);						//将PA1和PA2引脚初始化为推挽输出
	
	/*设置GPIO初始化后的默认电平*/
	GPIO_SetBits(GPIOA,GPIO_Pin_1 | GPIO_Pin_2|GPIO_Pin_3 | GPIO_Pin_4|GPIO_Pin_5);				//设置PA1和PA2引脚为高电平
	
}
/**
  * 函    数:LED1开启
  * 参    数:GPIO_ResetBits函数解释:对io管脚进行复位(输出低电平)。
  *           这个函数使用GPIOx_BSRR寄存器来实现原子读或者修改操作。
  *           在这种情况下,在读和修改访问时发生一个IRQ中断是没有危险的。
  * 返 回 值:无
  */
void LED_open1(void)
{
	GPIO_ResetBits(GPIOA,GPIO_Pin_1);  //LED1高脚接正极
}


/**
  * 函    数:LED2开启
  * 参    数:GPIO_ResetBits函数解释:对io管脚进行复位(输出低电平)。
  *           这个函数使用GPIOx_BSRR寄存器来实现原子读或者修改操作。
  *           在这种情况下,在读和修改访问时发生一个IRQ中断是没有危险的。
  * 返 回 值:无
  */
void LED_open2(void)
{
	GPIO_ResetBits(GPIOA,GPIO_Pin_2);  //LED2高脚接正极
}

/**
  * 函    数:LED1关闭
  * 参    数:GPIO_SetBits对io管脚进行置位(输出高电平)。
  *           这个函数使用GPIOx_BSRR寄存器来实现原子读或者修改操作。
  *           在这种情况下,在读和修改访问时发生一个IRQ中断是没有危险的。
  * 返 回 值:无
  */
void LED1_OFF(void)
{
	GPIO_SetBits(GPIOA, GPIO_Pin_1);		//设置LED1底引脚为高电平
}

void LED2_OFF(void)
{
	GPIO_SetBits(GPIOA, GPIO_Pin_2);		//设置LED2底引脚为高电平
}

LED.h

#ifndef __KEY_H
#define __KEY_H
void LED_Init();
void LED_open1(void);
void LED_open2(void);
void LED1_OFF(void);
void LED2_OFF(void);
#endif

5.main.c 完成

#include "stm32f10x.h"   // Device header
#include "Delay.h"
#include "LED.h"
#include "Key.h"


uint8_t KeyNum;    //定义用于接收按键键码的变量


int main(void)
{
	/*模块初始化*/
	LED_Init();//LED初始化
	
	Key_Init();//按键初始化
	
	while(1)
	{
		KeyNum = Key_GetNum();//获取按键键码
		
		if (KeyNum == 1)//按键1按下
		{
			Delay_ms(20);//延迟
			LED_open1();//LED1打开
			Delay_ms(20);
			LED1_OFF();//LED关闭
		}
		
		if (KeyNum == 2)//按键2按下
		{
			Delay_ms(20);//延迟
			LED_open2();//LED2打开
			Delay_ms(20);
			LED2_OFF();//LED关闭
		}
	}
}

Delay可以根据自己习惯定义

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32单片机是一种常见的微控制器,在嵌入式系统中常用于控制硬件设备。如果你想用STM32控制LED通过按键操作,通常会涉及以下几个步骤: 1. **初始化**:首先对GPIO(通用输入输出)模块进行配置,将LED连接到相应的GPIO引脚,并设置为推挽输出模式。 2. **按键检测**:使用中断的方式监听按键信号。当按键按下时,GPIO的状态会发生变化,我们可以读取这个状态并触发相应操作。 3. **LED控制**:当检测到按键事件时,根据按键的状态(通常是高电平代表按下)来切换LED点亮状态。例如,可以将GPIO设置为低电平来点亮LED,设置为高电平来熄灭LED。 4. **中断服务函数**:编写一段处理按键中断的服务程序,负责处理按键状态的变化以及LED的切换。 下面是一个简单的伪代码示例: ```c void KEY_Init(void) { GPIO_InitStructure.GPIO_Pin = LED_Pin; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; HAL_GPIO_Init(LED_PORT, &GPIO_InitStructure); } // 按键中断处理函数 void EXTI0_IRQHandler(void) { if (HAL_GPIO_ReadPin(KEY_PIN) == GPIO_PIN_SET) { // 按键按下,LED点亮 HAL_GPIO_WritePin(LED_PORT, LED_Pin, GPIO_PIN_RESET); } else { // 按键松开,LED熄灭 HAL_GPIO_WritePin(LED_PORT, LED_Pin, GPIO_PIN_SET); } } int main(void) { KEY_Init(); HAL_NVIC_EnableIRQ(EXTI0_IRQn); // 开启按键中断 while (1) {} } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值