STM32 - 按键控制LED灯

功能:按键控制LED的亮灭。

两个按键:PE3和PE2

两个LED:PE5和PB5

按键PE3控制LED2 - PE5;按键PE2控制LED3 - PB5

main.c:

cs 复制代码
#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();
		   if(KeyNum == 1)   //按键2按下
			 {
				 LED2_Turn();
			 }
			 if(KeyNum == 2)   //按键3按下
			 {
				 LED3_Turn();
			 }
	}
	
}
 

下面是LED的函数功能实现:

LED.c:

cs 复制代码
//用来存放驱动程序的主体代码

#include "stm32f10x.h"                  // Device header

void LED_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_5  ;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	GPIO_Init(GPIOE, &GPIO_InitStructure);
	
	GPIO_SetBits(GPIOE, GPIO_Pin_5);
	GPIO_SetBits(GPIOB, GPIO_Pin_5);
	
}

void LED2_ON(void)    //打开和关闭LED2
{
	GPIO_ResetBits(GPIOE, GPIO_Pin_5);
}


void LED2_OFF(void)
{
	GPIO_SetBits(GPIOE, GPIO_Pin_5);
}

void LED2_Turn(void)	
{ 
	//如果当前输出为0,就置1;否则,就置0.这样可以实现端口的电平翻转
	if  (GPIO_ReadOutputDataBit(GPIOE, GPIO_Pin_5) == 0) 
	{
		GPIO_SetBits(GPIOE, GPIO_Pin_5);     //把PE5置1
	}
	else
	{
		GPIO_ResetBits(GPIOE, GPIO_Pin_5);   //把PE5置0
	}
}
void LED3_ON(void)    //打开和关闭LED3
{
	GPIO_ResetBits(GPIOB, GPIO_Pin_5);
}

void LED3_OFF(void)
{
	GPIO_SetBits(GPIOB, GPIO_Pin_5);
}

void LED3_Turn(void)	
{ 
	//如果当前输出为0,就置1;否则,就置0.这样可以实现端口的电平翻转
	if  (GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_5) == 0) 
	{
		GPIO_SetBits(GPIOB, GPIO_Pin_5);     //把PE5置1
	}
	else
	{
		GPIO_ResetBits(GPIOB, GPIO_Pin_5);   //把PE5置0
	}
}

LED.h:

cs 复制代码
//用来存放这个驱动程序可有对外提供的函数或变量的声明

#ifndef __LED_H
#define __LED_H

void LED_Init(void);

void LED2_ON(void);
void LED2_OFF(void);
void LED2_Turn(void);

void LED3_ON(void);
void LED3_OFF(void);
void LED3_Turn(void);



#endif

下面是按键函数的实现:

Key.c:

cs 复制代码
#include "stm32f10x.h"                  // Device header
#include "Delay.h"

void Key_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;    //上拉输入
	GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_3 | GPIO_Pin_2;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOE, &GPIO_InitStructure);
}

uint8_t Key_GetNum(void)   //调用这个函数,就可以返回按下按键的键码
{
	 uint8_t KeyNum = 0;
	 if (GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3) == 0)
	 {
		 Delay_ms(20);
		 while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3) == 0);
		 Delay_ms(20);
		 
		 KeyNum = 1;
	 }
	 if (GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2) == 0)
	 {
		 Delay_ms(20);
		 while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2) == 0);
		 Delay_ms(20);
		 
		 KeyNum = 2;
	 }
	
	 return KeyNum;     //将这个变量作为返回值
}

Key.h:

cs 复制代码
#ifndef __KEY_H
#define __KEY_H

void Key_Init(void);

uint8_t Key_GetNum(void);

#endif
相关推荐
BreezeJuvenile17 分钟前
外设模块学习(5)——DS18B20温度传感器(STM32)
stm32·嵌入式硬件·学习·温度传感器·ds18b20
hollq3 小时前
STM32F103RCT6+STM32CubeMX+keil5(MDK-ARM)+Flymcu实现串口重定向
arm开发·stm32·嵌入式硬件
小鱼儿电子5 小时前
17-基于STM32的宠物饲养系统设计与实现
stm32·嵌入式硬件·物联网·宠物·宠物饲养系统
小莞尔6 小时前
【51单片机】【protues仿真】基于51单片机四层电梯系统
单片机·嵌入式硬件
CFZPL6 小时前
使用江科大串口发送函数发送freertos的vTaskList出现跑飞
单片机
F133168929577 小时前
WD5030A,24V降5V,15A 大电流,应用于手机、平板、笔记本充电器
stm32·单片机·嵌入式硬件·51单片机·硬件工程·pcb工艺
易享电子8 小时前
基于单片机电器断路器保护器系统Proteus仿真(含全部资料)
单片机·嵌入式硬件·fpga开发·51单片机·proteus
爱倒腾的老唐10 小时前
01、如何学习单片机
单片机·嵌入式硬件·学习
点灯小铭10 小时前
基于单片机的夹具压力控制系统设计
单片机·嵌入式硬件·mongodb·毕业设计·课程设计
雾削木16 小时前
stm32解锁芯片
javascript·stm32·单片机·嵌入式硬件·gitee