基于STM32F401RET6智能锁项目(使用库函数点灯、按键)
点灯硬件原理图
1、首先,我们查看一下原理图,找到相对应的GPIO口
LED_R低电平导通,LED4亮,所以LED_R的GPIO口需要配置一个低电平才能亮;
LED_G低电平导通,LED3亮,所以LED_R的GPIO口需要配置一个低电平才能亮;
点灯代码实现部分
#include "led.h"
#include "delay.h"int main(void)
{Led_Config();//LED初始化while(1){ led3_on();Delay_ms(1000);led3_off();Delay_ms(1000);}
}
#include "led.h"/*
函数功能:LED初始化1、打开GPIOB时钟2、LED4 PB8 LED_R----- 通用推挽模式 LED3 PB9 --LED_G ----- 通用推挽模式
*/void Led_Config(void)
{RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//打开GPIOB的时钟GPIO_InitTypeDef GPIO_InitStruct;//声明结构体变量//初始化PB8和PB9GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;//通用输出GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;//推挽输出GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;//第八号管脚GPIO_InitStruct.GPIO_Speed = GPIO_Fast_Speed;//速度50MhzGPIO_Init(GPIOB, &GPIO_InitStruct);GPIO_SetBits(GPIOB, GPIO_Pin_8);//灭GPIO_SetBits(GPIOB, GPIO_Pin_9);//灭}void led3_on(void)
{GPIO_ResetBits(GPIOB, GPIO_Pin_9);//亮
}void led3_off(void)
{GPIO_SetBits(GPIOB, GPIO_Pin_9);//灭
}void led4_on(void)
{GPIO_ResetBits(GPIOB, GPIO_Pin_8);//亮
}void led4_off(void)
{GPIO_SetBits(GPIOB, GPIO_Pin_8);//灭
}
#ifndef _LED_H_
#define _LED_H_#include "stm32f4xx.h"void Led_Config(void);
void led3_on(void);
void led3_off(void);
void led4_on(void);
void led4_off(void);#endif
按键硬件电路
KEY1按下是高电平,未按下是低电平。
KEY2按下是低电平,未按下是高电平。
按键代码实现部分
实现现象:key1控制LED3的亮灭、key2控制LED4的亮灭。
#include "key.h"
#include "delay.h"
#include "led.h"/*
key1 PA0
key2 PC13
*/
void key_config(void)
{RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC,ENABLE); //开启GPIOA的时钟GPIO_InitTypeDef GPIO_InitStruct = {0};//声明结构体变量//给结构体赋值GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN; //输入模式GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; //PA0引脚GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; //浮空模式GPIO_InitStruct.GPIO_Speed = GPIO_Fast_Speed;GPIO_Init(GPIOA,&GPIO_InitStruct); //写入结构体GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;GPIO_Init(GPIOC,&GPIO_InitStruct); //写入结构体
}/*
0 没有按键按下
1 key1按下
2 key2按下
*/uint8_t key_scan(void)
{uint8_t key_state = 0;if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) == 1) {Delay_ms(10);if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) == 1){while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) == 1){//按键1按下}key_state = 1;}}else if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13) == 0) {Delay_ms(10);if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13) == 0){while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13) == 0){//按键2按下}key_state = 2;}}return key_state;
}//按键处理函数
void KEY_Handle(void)
{uint8_t Key_State=0;Key_State = key_scan();switch(Key_State){case 0: //没有按键按下break;case 1: //按键1按下led3_T();break; case 2: //按键2按下led4_T();break;case 3: //按键3按下break; case 4: //按键4按下break; default:break;}
}
#ifndef _KEY_H_
#define _KEY_H_#include "stm32f4xx.h" // Device header
void key_config(void);
uint8_t key_scan(void);
void KEY_Handle(void);#endif
#include "led.h"
#include "delay.h"
#include "key.h"int main(void)
{Led_Config();//LED初始化key_config();while(1){ KEY_Handle();}
}
相关文章:

基于STM32F401RET6智能锁项目(使用库函数点灯、按键)
点灯硬件原理图 1、首先,我们查看一下原理图,找到相对应的GPIO口 LED_R低电平导通,LED4亮,所以LED_R的GPIO口需要配置一个低电平才能亮; LED_G低电平导通,LED3亮,所以LED_R的GPIO口需要配置一…...

网络层协议之 IP 协议
IP 协议格式 4 位版本:此处的取值只有两个,4(IPv4)和 6(IPv6),即指定 IP 协议的版本。 4 位首部长度:描述了 IP 报头多长,IP 报头是变长的,因为报头中的选项部…...

SpringBoot 实现对提供的接口进行 AES (加密,解密)
业务来源: 最近工作中,领导要求给别的项目组的小伙伴提供几个接口,要求对接口的参数进行解密操作,然后对返回的数据进行加密操作。 这时我想到了AES AES 是对称加密算法,优点:加密速度快;缺点…...

ASP.NET学生成绩管理系统
摘要 本系统依据开发要求主要应用于教育系统,完成对日常的教育工作中学生成绩档案的数字化管理。开发本系统可使学院教职员工减轻工作压力,比较系统地对教务、教学上的各项服务和信息进行管理,同时,可以减少劳动力的使用…...
谁考了第k名C++
题目描述 在一次考试中,每个学生的成绩都不相同,现知道了每个学生的学号和成绩,求考第k名学生的学号和成绩。(按成绩从大到小排列) 输入 第一行有两个整数,分别是学生的人数n(1≤n≤100&…...
多线服务器的优势有哪些?
服务器中包含着多线服务器、双线服务器和单线服务器等,其中多线服务器可以支持多个IP地址,今天小编就来带领大家一些来了解一下多线服务器的优势有哪些吧! 多线服务器是在一个互联网数据中心,通过特殊的技术手段将不同的多家网络接…...

vue + element-plus 开发中遇到的问题
1.问题之路由守卫 初写路由守卫,对于next()的理解不是很透彻,就想着都放行,不然看不到效果,结果控制台出现了警告,想着报黄的问题就不是问题,但仔细一看发现他说,如果再生产阶段就会失败&#x…...

使用java远程提交flink任务到yarn集群
使用java远程提交flink任务到yarn集群 背景 由于业务需要,使用命令行的方式提交flink任务比较麻烦,要么将后端任务部署到大数据集群,要么弄一个提交机,感觉都不是很离线。经过一些调研,发现可以实现远程的任务发布。…...

麻了!新增4.1分,CCF-C类,2区毕业神刊,被标记On Hold!
本周投稿推荐 SSCI • 2区社科类,3.0-4.0(社科均可) EI • 计算机工程类(接收广,录用极快) SCI&EI • 4区生物医学类,1.5-2.0(录用率99%) • 1区工程类&#…...

tomcat 的启动流程
tomcat 的启动流程 中 使用的Lifecycle 生命流程 。在这里还使用了设计模式中的模板模式(LifecycleBase 是一个模板类) init()方法 start() 方法 container 的处理...

YOLOv9全网最新改进系列::YOLOv9完美融合双卷积核(DualConv)来构建轻量级深度神经网络,目标检测模型有效涨点神器!!!
YOLOv9全网最新改进系列::YOLOv9完美融合双卷积核(DualConv)来构建轻量级深度神经网络,目标检测模型有效涨点神器!!! YOLOv9原文链接戳这里,原文全文翻译请关注B站Ai学术叫叫首er …...

PCIE协议-2-事务层规范-MEM/IO/CFG request rules
2.2.7 内存、I/O和配置请求规则 以下规则适用于所有内存、I/O和配置请求。每种类型的请求还有特定的额外规则。 所有内存、I/O和配置请求除了常见的头标字段外,还包括以下字段:requester ID[15:0]和Tag[9:0],形成事务ID。Last DW BE[3:0] a…...

jmeter分布式集群压测
目的:通过多台机器同时运行 性能压测 脚本,模拟更好的并发压力 简单点:就是一个人(控制机controler/调度机 master)做一个项目的时候,压力有点大,会导致结果不理想,这时候找几个人&a…...

美国加州正测试ChatGPT等生成式AI,在4大部门应用
5月11日,美联社消息,美国加州政府正在测试ChatGPT等生成式AI,应用在税收和收费管理部、交通部、公共卫生部以及卫生与公众服务部4大部门。 测试时间6个月,为其提供技术支持的一共有5家公司,分别是OpenAI、Anthropic、…...

【Kali Linux工具篇】wpscan的基本介绍与使用
介绍 WPScan是Kali Linux默认自带的一款漏洞扫描工具,它采用Ruby编写,能够扫描WordPress网站中的多种安全漏洞,其中包括主题漏洞、插件漏洞和WordPress本身的漏洞。最新版本WPScan的数据库中包含超过18000种插件漏洞和2600种主题漏洞&#x…...
C#算法之计数排序
算法释义:计数排序是一种非基于比较的排序算法,它不依赖于比较操作来确定元素的顺序,而是通过键值索引直接确定元素的输出位置。计数排序适用于一定范围内的整数排序。为什么说是一定范围之内呢?原因如下:计数排序的复…...

EasyExcel简单使用
EasyExcel简单使用 之前一直用的Apache POI来做数据的导入导出,但听说阿里的EasyExcel也拥有POI的功能的同时,在处理大数据量的导入导出的时候性能上比POI更好,所以就来尝试使用一下 导入Maven依赖: <dependency><…...

Notes客户端中的漫游功能
大家好,才是真的好。 故事,首先是从一个小图标开始的,很多人问我Domino公共通讯录中,个人文档前面有一个绿色小球图标,这是什么意思? 我的答案:这是Notes客户端中的漫游功能。 说到漫游&…...

为什么要内存对齐?
首先,我们介绍一下结构体内存对齐的规则: 1.第一个成员在与结构体偏移量为0的地址处。 2.其他成员变量要对其到某个数字(对齐数)的整数倍的地址处。 注:对齐数编译器默认的一个对齐数与该成员大小的较小值ÿ…...

23、Flink 的 Savepoints 详解
Savepoints 1.什么是 Savepoints Savepoint 是依据 Flink checkpointing 机制所创建的流作业执行状态的镜像,可以使用 Savepoint 进行 Flink 作业的停止、重启或更新。 Savepoint 由两部分组成:稳定存储(例如 HDFS,S3ÿ…...

python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...

使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...

【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...
MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用
文章目录 一、背景知识:什么是 B-Tree 和 BTree? B-Tree(平衡多路查找树) BTree(B-Tree 的变种) 二、结构对比:一张图看懂 三、为什么 MySQL InnoDB 选择 BTree? 1. 范围查询更快 2…...