当前位置: 首页 > article >正文

STM32 - 按键控制LED灯

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

两个按键:PE3和PE2

两个LED:PE5和PB5

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

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

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

LED.c:

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

#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:

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

#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:

#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:

#ifndef __KEY_H
#define __KEY_H

void Key_Init(void);

uint8_t Key_GetNum(void);

#endif


http://www.kler.cn/news/282859.html

相关文章:

  • 在centos中安装 --nmon性能系统监控工具
  • 【实战场景】敏感词过滤如何实现?
  • 阿里最新发布Qwen2-VL:看视频的AI到底能干些什么惊人的事?
  • gui.js可视化插件的使用
  • 前端需调用后端数据作为判断条件
  • spring揭秘14-JdbcTemplate概述与使用操作对象访问数据
  • CSS 嵌套元素的隐藏规则
  • Spring Boot DevTools:简化开发,实现热部署
  • 棱镜七彩参编的又一国家标准正式发布!
  • 探索音视频SDK在软件集成与私有化部署中的技术难题与解决策略
  • JAVA基础:文件字符流
  • C#高效异步文件监控与日志记录工具
  • Apache RocketMQ 中文社区全新升级丨阿里云云原生 7 月产品月报
  • 解决IDEA 控制台中文乱码及无法输入中文
  • MacOS通过Docker部署MySQL数据库,以及Docker Desktop进行管理
  • C++ 快速输入的优化与缓冲区管理(竞赛必用)
  • 使用requests库发起post请求处理json的两种方式
  • ROS 2 Jazzy和QT组合开发教程
  • 音频PCM的能量dB计算
  • 一个符合软件开发工程师认知的思考框架简单了解下
  • 1899. 最满意的方案
  • 盛元广通高等级生物安全实验室管理系统2.0
  • 【私有云场景案例分享②】批量装包与冒烟测试的自动化实现
  • Linux——进程管理
  • 嵌入式Linux学习笔记-Linux基础操作
  • Elasticsearch 8.13.4 LocalDateTime类型转换问题
  • 使用seamless-scroll-v3 实现无缝滚动,自动轮播平滑的滚动效果
  • Linux系统——服务器长时间训练不间断指令(nohup的简单用法)
  • PsConvertToGuiThread函数调用前传
  • 力扣第二阶段Days34