按键控制LED灯

目录

文件夹Hardware:

文件LED.c:

文件LED.h:

文件Key.c:

文件Key.h:

文件夹User:

文件main.c:


首先模块化管理代码

文件夹Hardware:

文件LED.c:

// 引入STM32F10x系列微控制器的头文件,包含了一些基本的寄存器和函数声明。  
#include "stm32f10x.h"  
  
// LED初始化函数  
void LED_Init(void)  
{  
    // 使能GPIOA端口的时钟,这样才能对GPIOA进行操作。  
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  
   
    // 定义一个GPIO初始化结构体,用于配置GPIO的参数。  
 GPIO_InitTypeDef GPIO_InitStructure;  
   
    // 设置GPIO模式为推挽输出,且设置LED灯连接到GPIOA的1和2脚。  
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;  
    // 设置GPIO的输出速率为50MHz。  
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
    // 使用上述参数初始化GPIOA的1和2脚。  
 GPIO_Init(GPIOA, &GPIO_InitStructure);  
   
    // 将GPIOA的1和2脚设置为高电平,即初始状态为LED灯灭。  
 GPIO_SetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2);  
}  
  



// LED1打开函数  
void LED1_ON(void)  
{  
    // 将GPIOA的1脚设置为低电平,即点亮LED灯。  
 GPIO_ResetBits(GPIOA, GPIO_Pin_1);  
}  
  



// LED1关闭函数  
void LED1_OFF(void)  
{  
    // 将GPIOA的1脚设置为高电平,即熄灭LED灯。  
 GPIO_SetBits(GPIOA, GPIO_Pin_1);  
}  
  



// LED1转换函数  
void LED1_Turn(void)  
{  
    // 如果GPIOA的1脚为低电平(0),则设置为高电平(熄灭LED灯)。否则设置为低电平(点亮LED灯)。  
 if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1) == 0) {  
 GPIO_SetBits(GPIOA, GPIO_Pin_1);  
 } else {  
 GPIO_ResetBits(GPIOA, GPIO_Pin_1);  
 }  
}  
  



// LED2打开函数,与LED1类似,只是操作的是GPIOA的2脚。  
void LED2_ON(void)  
{  
    GPIO_ResetBits(GPIOA, GPIO_Pin_2);  
}  
void LED2_OFF(void)  
{  
    GPIO_SetBits(GPIOA, GPIO_Pin_2);  
}  
void LED2_Turn(void)  
{  
    if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_2) == 0) {  
        GPIO_SetBits(GPIOA, GPIO_Pin_2);  
    } else {  
        GPIO_ResetBits(GPIOA, GPIO_Pin_2);  
    }  
}



文件LED.h:

#ifndef __LED_H
#define __LED_H

//这里都是LED.c里函数的声明

void LED_Init(void);
void LED1_ON(void);
void LED1_OFF(void);
void LED2_ON(void);
void LED2_OFF(void);    

#endif
 



文件Key.c:

#include "stm32f10x.h"                  // 引入STM32F10x系列微控制器的头文件,包含了一些基本的寄存器和函数声明。  
#include "Delay.h"                    // 引入延时函数库的头文件。  
  
// 按键初始化函数  
void Key_Init()  
{  
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);  // 使能GPIOB端口的时钟,这样才能对GPIOB进行操作。  
 GPIO_InitTypeDef GPIO_InitStructure;                    // 定义一个GPIO初始化结构体,用于配置GPIO的参数。  
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;            // 设置GPIO模式为上拉输入。  
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_11;   // 设置要初始化的针脚为GPIOB的1和11脚,这两个脚分别连接Key1和Key2。  
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        // 设置GPIO的输出速率为50MHz。  
 GPIO_Init(GPIOB, &GPIO_InitStructure);                    // 使用上述参数初始化GPIOB的1和11脚。  
}  



  
// 获取按键编号函数  
uint8_t Key_GetNum(void)  
{  
 uint8_t KeyNum = 0;                 // 初始化按键编号为0,表示没有按键按下。  
   
   if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0) {  // 如果Key1被按下(即读取的Key1针脚电平为低)  
       Delay_ms(20);                      // 消除按键抖动,等待按键稳定(延迟20毫秒)。  
       while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0); // 等待Key1针脚电平由低变高      (按键释放)。  
       Delay_ms(20);                      // 再次消除按键抖动(延迟20毫秒)。  
       KeyNum = 1;                        // 设置按键编号为1,表示Key1被按下。  
     }  
   
     if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0) {  // 如果Key2被按下(即读取的Key2 针脚电平为低)  
         Delay_ms(20);                      // 消除按键抖动,等待按键稳定(延迟20毫秒)。  
         while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0); // 等待Key2针脚电平由低变高(按键释放)。  
         Delay_ms(20);                      // 再次消除按键抖动(延迟20毫秒)。  
         KeyNum = 2;                        // 设置按键编号为2,表示Key2被按下。  
 }  
   
 return KeyNum;                    // 返回按下的按键编号。如果两个按键都没有被按下,返回0。  
}



文件Key.h:

#ifndef __KEY_H
#define __KEY_H

//这里都是对Key.c中的函数进行声明

void Key_Init();
uint8_t Key_GetNum(void);
void LED1_Turn(void);
void LED2_Turn(void);

#endif
 



文件夹User:

文件main.c:

#include "stm32f10x.h"           // 引入STM32F10x系列微控制器的头文件,包含了一些基本的寄存器和函数声明。  
#include "Delay.h"               // 引入延时函数库的头文件。  
#include "LED.h"                 // 引入LED控制函数库的头文件。  
#include "Key.h"                 // 引入按键检测函数库的头文件。  
  
uint8_t KeyNum;                  // 定义一个全局变量,用于存储按下的按键编号。  
  
int main(void)                   // 主函数入口。  
{
    LED_Init();                  // 初始化LED,可能包括设置GPIO模式、速度等。  
    Key_Init();                  // 初始化按键检测,可能包括使能GPIO时钟、配置GPIO模式等。  
   
    while(1)                     // 无限循环,持续检测按键和LED状态。  
    {  
        KeyNum=Key_GetNum();     // 获取按下的按键编号,并存储在KeyNum变量中。  
        if(KeyNum==1)            // 如果KeyNum等于1(即Key1被按下)  
        {  
           LED1_Turn();          // 转换LED1。  
        }  
        if(KeyNum==2)            // 如果KeyNum等于2(即Key2被按下)  
        {  
           LED2_Turn();          // 打开LED2。  
        }  
    }  
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/643226.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

5.Python爬虫前的准备工作

知识准备 1) Python语言 Python 爬虫作为 Python 编程的进阶知识,要求具备较好的 Python 编程基础 了解 Python 语言的多进程与多线程,并熟悉正则表达式语法,也有助于编写爬虫程序 2) Web前端 了解 Web 前端的基本知识,比如 …

2-项目介绍

项目介绍 1.文件结构 1.1.后端结构 com.ruoyi ├── common // 工具类 │ └── annotation // 自定义注解 │ └── config // 全局配置 │ └── constant // 通用…

用Netty手写Http/Https服务器

Netty是一个以事件驱动的异步通信网络框架&#xff0c;可以帮助我们实现多种协议的客户端和服务端通信&#xff0c;话不多说&#xff0c;上代码&#xff0c;需要引入下方依赖 <dependency><groupId>io.netty</groupId><artifactId>netty-all</artif…

BUU LFI COURSE 1

靶场教程 1.开局界面&#xff0c;已给出源代码。2.存在文件包含include &#xff0c;直接通过传参 file 进行获取 flag。3.通过访问 url 发现报错&#xff0c;说明 flag 并不在当前目录下&#xff0c;只需要向前访问目录即可。 http://b6ed0fd6-c852-40d0-b285-32d9d00fbf00.…

抖去推短视频矩阵系统+实景无人直播系统技术源头开发

抖去推爆款视频生成器&#xff0c;通过短视频矩阵、无人直播&#xff0c;文案引流等&#xff0c;打造实体商家员工矩阵、用户矩阵、直播矩阵&#xff0c;辅助商家品牌曝光&#xff0c;团购转化等多功能赋能商家拓客引流。 短视频矩阵通俗来讲就是批量剪辑视频和批量发布视频&a…

查询小世界账号网页HTML源码

HTML源码&#xff0c;记事本打开后可以修改里面的内容&#xff0c;电脑本地双击html可以查看效果&#xff0c;复制小世界个人主页链接就可以查询QQ号&#xff0c; 蓝奏云&#xff1a;https://wfr.lanzout.com/ihXCn1lz2jnc

MySQL数据库面试知识点

1、数据库基础&#xff1a; MySQL是一个开源的关系型数据库管理系统&#xff0c;用于存储、管理和检索数据。它支持多种存储引擎&#xff0c;包括InnoDB、MyISAM等。MySQL是由瑞典公司MySQL AB开发&#xff0c;后来被Sun Microsystems收购&#xff0c;最终被甲骨文公司(Oracle…

4G物联网LED智慧路灯杆显示屏产品介绍

4GLED显示屏是一种具有4G网络连接功能的LED显示屏。它可以通过4G网络连接到互联网&#xff0c;实现远程管理和控制&#xff0c;方便进行内容更新和管理。同时&#xff0c;4GLED显示屏具有高亮度、高清晰度和高对比度的特点&#xff0c;可以提供清晰明亮的图像和视频展示效果。它…

stm32产品架构

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据 总结 前言 起因是我在看野火的ucosiii&#xff0c;然后他是基于i.mx芯片。然后我就很疑惑i.mx是什么芯片&#xff0c;看了下好像是ARM-M7(或者叫ARMCM7)架构的芯片。然后我又疑惑ARM-M7又是什么架…

omron adept控制器维修SmartController EX

欧姆龙机器人adept运动控制器维修SmartController EX 19300-000 维修范围&#xff1a;姆龙机器人&#xff1b;码垛机器人&#xff1b;搬运机器人&#xff1b;焊机机器人&#xff1b;变位机等。 Adept Viper s650/s850用于装配、物料搬运、包装和机械装卸&#xff0c;循环周期短…

二进制?十进制!(C语言刷题)(位运算)

专栏:https://blog.csdn.net/2301_79293429/category_12545690.html 题目描述 给定两个十进制整数 : A,B 你需要把它们的二进制形式以十进制的运算法则相加输出结果。 例如&#xff1a; A3,B2的时候&#xff0c;A 的二进制表示是 : 11 , B 的二进制表示是 10 &#xff0c;…

物流实时数仓——概述与准备工作

目录 一、架构设计与技术栈 (一)数仓架构设计 (二)所用技术栈 (三)最终效果 二、关于离线与实时的相关概念 三、实时数仓设计思路 一、架构设计与技术栈 (一)数仓架构设计 (二)所用技术栈 Hadoop 3.3.4 Zookeeper 3.7.1 Kafka 3.3.1 Hbase 2.4.11 Redis 6.0.8 Flink 1.17…

mysqldump添加从库或者重新同步从库

一、GTID添加从库的方法 1.如果master所有的binlog还在&#xff0c;安装slave后&#xff0c;直接change master 到master 原理是直接获取master所有的gtid并执行 优点是简单 缺点是如果binlog太多&#xff0c;数据完全同步需要的时间较长&#xff0c;并且需要master一开始就启…

Leetcode2806. 取整购买后的账户余额

Every day a Leetcode 题目来源&#xff1a;2806. 取整购买后的账户余额 解法1&#xff1a;数学 题目要求为将 purchaseAmount 四舍五入到最近的 10 的倍数作为 roundedAmount&#xff0c;计算 100−roundedAmount 的值并返回。 分类讨论即可。 代码&#xff1a; /** lc…

机器学习实验3——支持向量机分类鸢尾花

文章目录 &#x1f9e1;&#x1f9e1;实验内容&#x1f9e1;&#x1f9e1;&#x1f9e1;&#x1f9e1;数据预处理&#x1f9e1;&#x1f9e1;代码认识数据相关性分析径向可视化各个特征之间的关系图 &#x1f9e1;&#x1f9e1;支持向量机SVM求解&#x1f9e1;&#x1f9e1;直觉…

CentOS:nohup后台运行jar文件包程序

1、java -jar XXX.jar 特点&#xff1a;当前ssh窗口被锁定&#xff0c;可按CTRL C打断程序运行&#xff0c;或直接关闭窗口&#xff0c;程序退出 那如何让窗口不锁定&#xff1f; 2、java -jar XXX.jar & &代表在后台运行。 特定&#xff1a;当前ssh窗口不被锁定&…

Parade Series - Android Studio

硬件支持 CPU i7 RAM 16Gb -------------- ------- Java 3Gb Android 33GbJava Enviroment C:\ ├─ Java │ ├─ jdk1.8.0_181 │ ├─ jre1.8.0_181 │ ├─ maven-3.8.5 │ └─ gradle-6.5 └─ Cache├─ gr…

世微AP2915宽电压无MOS管切换双色灯性价比方案

1&#xff1a;产品描述 AP2915 是一款可以一路灯串切换两路灯串的降压恒流驱动器,高效率、外围简单、内置功率管&#xff0c;适用于 5-100V 输入的高精度降压 LED 恒流驱动芯片。内置功率管输出功率可达 12W&#xff0c;电流 1.2A。AP2915 一路灯亮切换两路灯亮&#xff0c;其…

【第十五课】数据结构:堆 (“堆”的介绍+主要操作 / acwing-838堆排序 / c++代码 )

目录 关于堆的一些知识的回顾 数据结构&#xff1a;堆的特点 "down" 和 "up"&#xff1a;维护堆的性质 down up 数据结构&#xff1a;堆的主要操作 acwing-838堆排序 代码如下 时间复杂度分析 确实是在写的过程中频繁回顾了很多关于树的知识&…

使用ElEment组件实现vue表单校验空值

1.绑定表单组件数组rules 2.在data域中设定组件rules 3.设定调用方法函数 提交校验 取消&#xff1a; 测试页面 提交空值 失去焦点 取消重置 提交后重置