STM32独立按键控制LED亮灭---软键篇(内置代码+注释解析+部分库函数代码)

简介: STM32独立按键控制LED亮灭---软键篇(内置代码+注释解析+部分库函数代码)

1.LED独立按键代码部分:

a:LED.c代码


#include "stm32f10x.h" // Device header
void LED_Init(void)//LED初始化函数
{
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);//此行代码是使默认变为高电平,灯不亮的情况
}
void LED1_ON(void)//打开LED1
{
GPIO_ResetBits(GPIOA,GPIO_Pin_1);
}
void LED1_OFF(void)//关闭LED1
{
GPIO_SetBits(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 LED1_Turn(void)//反转GPIO按键,按下LED1熄灭,再按点亮
{
if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_1)==0)//如果GPIO输出0,
{
GPIO_SetBits(GPIOA,GPIO_Pin_1);//则使用SetBits使之变为1
}
else//如果GPIO输出1,
{
GPIO_ResetBits(GPIOA,GPIO_Pin_1);//则使用SetBits使之变为0
}
}
void LED2_Turn(void)//反转GPIO按键,按下LED2熄灭,再按点亮
{
if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_2)==0)//如果GPIO输出0,
{
GPIO_SetBits(GPIOA,GPIO_Pin_2);//则使用SetBits使之变为1
}
else//如果GPIO输出1,
{
GPIO_ResetBits(GPIOA,GPIO_Pin_2);//则使用SetBits使之变为0
}
}

c376b21092d8418f8bbbe7cfebe5f2e4.png

fcea2f7812ff4261a65b8e4f2c687713.png


b:LED.h代码


#ifndef __LED_H
#define __LED_H
void LED_Init(void);
void LED1_ON(void);//按下点亮,再按熄灭
void LED1_OFF(void);
void LED1_Turn(void);//反转LED1,按下熄灭,再按点亮
void LED2_ON(void);//按下点亮,再按熄灭
void LED2_OFF(void);
void LED2_Turn(void);//反转LED2,按下熄灭,再按点亮
#endif

007560697fd0428e99fc5472e7ae9a38.png


2.独立按键Key代码部分:

a:key.c部分


#include "stm32f10x.h" // Device header
#include "Delay.h"
void Key_Init(void)//初始化按键
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//按键连接在GPIOB上,使能管脚
GPIO_InitTypeDef GPIO_InitStucture;
GPIO_InitStucture.GPIO_Mode=GPIO_Mode_IPU;//读取按键需要上拉输入,GPIO_Mode_IPU
GPIO_InitStucture.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_11;//接在GPIO1和GPIO11
GPIO_InitStucture.GPIO_Speed=GPIO_Speed_50MHz;//GPIO的输出速度(输入速度没用)
GPIO_Init(GPIOB,&GPIO_InitStucture);
}
uint8_t Key_GetNum(void)//独立按键---1管脚的控制---按下点亮,再按,熄灭
{
uint8_t Key_Num=0;
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0)
{
Delay_ms(20);
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0);
Delay_ms(20);
Key_Num=1;
}
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)==0)//独立按键---11管脚的控制---按下点亮,再按,熄灭
{
Delay_ms(20);
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)==0);
Delay_ms(20);
Key_Num=2;
}
return Key_Num;
}

34a0a1e0253541a4a9020d92f13dcdf9.png


b:Key.h部分


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

907b3db12c8449219249f73676e6cfc3.png


3.主函数main代码部分:


#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "LED.h"
#include "Key.h"
int main(void)
{
uint8_t KeyNum=0;
LED_Init();//初始化LED之后灯就亮了,说明默认为低电平
Key_Init();//初始化按键
while(1)
{
KeyNum=Key_GetNum();
if(KeyNum==1)
LED1_Turn();//按键按下,LED1熄灭点亮
if(KeyNum==2)
LED2_Turn();//按键松开,LED1熄灭
}
}

d563fd8713334a428bedffff3991fc22.png


4.部分库函数补充:


//注:


//GPIO_ReadInputDataBit---读取输入数据寄存器的某一位(第二个参数)


//GPIO_ReadInputData------读取整个输入数据寄存器


//GPIO_ReadOutputDataBit--读取输入数据寄存器的某一位


//GPIO_ReadOutputData------读取整个输出数据寄存器


相关文章
|
10月前
|
算法 PyTorch 算法框架/工具
昇腾 msmodelslim w8a8量化代码解析
msmodelslim w8a8量化算法原理和代码解析
789 5
|
12月前
|
搜索推荐 UED Python
实现一个带有昼夜背景切换的动态时钟:从代码到功能解析
本文介绍了一个使用Python和Tkinter库实现的动态时钟程序,具有昼夜背景切换、指针颜色随机变化及整点和半点报时功能。通过设置不同的背景颜色和随机变换指针颜色,增强视觉吸引力;利用多线程技术确保音频播放不影响主程序运行。该程序结合了Tkinter、Pygame、Pytz等库,提供了一个美观且实用的时间显示工具。欢迎点赞、关注、转发、收藏!
491 94
|
11月前
|
存储 Linux iOS开发
Python入门:2.注释与变量的全面解析
在学习Python编程的过程中,注释和变量是必须掌握的两个基础概念。注释帮助我们理解代码的意图,而变量则是用于存储和操作数据的核心工具。熟练掌握这两者,不仅能提高代码的可读性和维护性,还能为后续学习复杂编程概念打下坚实的基础。
Python入门:2.注释与变量的全面解析
|
10月前
|
传感器 监控 Java
Java代码结构解析:类、方法、主函数(1分钟解剖室)
### Java代码结构简介 掌握Java代码结构如同拥有程序世界的建筑蓝图,类、方法和主函数构成“黄金三角”。类是独立的容器,承载成员变量和方法;方法实现特定功能,参数控制输入环境;主函数是程序入口。常见错误包括类名与文件名不匹配、忘记static修饰符和花括号未闭合。通过实战案例学习电商系统、游戏角色控制和物联网设备监控,理解类的作用、方法类型和主函数任务,避免典型错误,逐步提升编程能力。 **脑图速记法**:类如太空站,方法即舱段;main是发射台,static不能换;文件名对仗,括号要成双;参数是坐标,void不返航。
400 5
|
11月前
|
人工智能 文字识别 自然语言处理
保单AI识别技术及代码示例解析
车险保单包含基础信息、车辆信息、人员信息、保险条款及特别约定等关键内容。AI识别技术通过OCR、文档结构化解析和数据校验,实现对保单信息的精准提取。然而,版式多样性、信息复杂性、图像质量和法律术语解析是主要挑战。Python代码示例展示了如何使用PaddleOCR进行保单信息抽取,并提出了定制化训练、版式分析等优化方向。典型应用场景包括智能录入、快速核保、理赔自动化等。未来将向多模态融合、自适应学习和跨区域兼容性发展。
|
自然语言处理 搜索推荐 数据安全/隐私保护
鸿蒙登录页面好看的样式设计-HarmonyOS应用开发实战与ArkTS代码解析【HarmonyOS 5.0(Next)】
鸿蒙登录页面设计展示了 HarmonyOS 5.0(Next)的未来美学理念,结合科技与艺术,为用户带来视觉盛宴。该页面使用 ArkTS 开发,支持个性化定制和无缝智能设备连接。代码解析涵盖了声明式 UI、状态管理、事件处理及路由导航等关键概念,帮助开发者快速上手 HarmonyOS 应用开发。通过这段代码,开发者可以了解如何构建交互式界面并实现跨设备协同工作,推动智能生态的发展。
756 10
鸿蒙登录页面好看的样式设计-HarmonyOS应用开发实战与ArkTS代码解析【HarmonyOS 5.0(Next)】
|
12月前
|
SQL Java 数据库连接
如何在 Java 代码中使用 JSqlParser 解析复杂的 SQL 语句?
大家好,我是 V 哥。JSqlParser 是一个用于解析 SQL 语句的 Java 库,可将 SQL 解析为 Java 对象树,支持多种 SQL 类型(如 `SELECT`、`INSERT` 等)。它适用于 SQL 分析、修改、生成和验证等场景。通过 Maven 或 Gradle 安装后,可以方便地在 Java 代码中使用。
3691 11
|
PHP 开发者 容器
PHP命名空间深度解析:避免命名冲突与提升代码组织####
本文深入探讨了PHP中命名空间的概念、用途及最佳实践,揭示其在解决全局命名冲突、提高代码可维护性方面的重要性。通过生动实例和详尽分析,本文将帮助开发者有效利用命名空间来优化大型项目结构,确保代码的清晰与高效。 ####
193 20
|
机器学习/深度学习 存储 人工智能
强化学习与深度强化学习:深入解析与代码实现
本书《强化学习与深度强化学习:深入解析与代码实现》系统地介绍了强化学习的基本概念、经典算法及其在深度学习框架下的应用。从强化学习的基础理论出发,逐步深入到Q学习、SARSA等经典算法,再到DQN、Actor-Critic等深度强化学习方法,结合Python代码示例,帮助读者理解并实践这些先进的算法。书中还探讨了强化学习在无人驾驶、游戏AI等领域的应用及面临的挑战,为读者提供了丰富的理论知识和实战经验。
668 5
|
存储 安全 Java
系统安全架构的深度解析与实践:Java代码实现
【11月更文挑战第1天】系统安全架构是保护信息系统免受各种威胁和攻击的关键。作为系统架构师,设计一套完善的系统安全架构不仅需要对各种安全威胁有深入理解,还需要熟练掌握各种安全技术和工具。
529 10

推荐镜像

更多
  • DNS