STM32F103C8T6学习笔记3--按键控制LED灯

1、实验内容

S4、S5分别接PB12和PB13,实验要求,按下S4,D1亮,D2灭;按下S5,D2亮,D1灭。

由于按键学习的是GPIO口的输入功能,和输出功能的配置略有区别。本次通过按键触发相应功能没有使用中断,完全是软件控制。

2、代码实现

(1)GPIO口输入功能配置-按键初始化(封装成函数)

#include "stm32f10x.h"                  // Device header
#include "delay.h"
void Key_Init(void)
{
	/*GPIO初始化*/
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
		/*开启时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);		//开启GPIOB的时钟
	GPIO_Init(GPIOB, &GPIO_InitStructure);						//将PB12和PB13引脚初始化为上拉输入
}

开启GPIOB时钟,配置2个按键的输入模式为上拉输入,速度50MHz,端口初始化。

(2)读取按键键值的函数

uint8_t Key_GetNum(void)
{
	uint8_t KeyNum = 0;		//定义变量,默认键码值为0
	
	if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12) == 0)			//读PB12输入寄存器的状态,如果为0,则代表按键1按下
	{
		delay_ms(20);											//延时消抖
		while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12) == 0);	//等待按键松手
		delay_ms(20);											//延时消抖
		KeyNum = 1;												//置键码为1
	}
	
	if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_13) == 0)			//读PB13输入寄存器的状态,如果为0,则代表按键2按下
	{
		delay_ms(20);											//延时消抖
		while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_13) == 0);	//等待按键松手
		delay_ms(20);											//延时消抖
		KeyNum = 2;												//置键码为2
	}
	
	return KeyNum;			//返回键码值,如果没有按键按下,所有if都不成立,则键码为默认值0
}

GPIO_ReadInputDataBit()读GPIO输入数据寄存器的某一位。这里面有个延时消抖的代码延时20ms,while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12) == 0);最后键值作为uint8类型的变量值返回。

(3)主函数调用Key_Init和Key_GetNum函数

#include "stm32f10x.h"                  // Device header
#include "delay.h"  
#include "LED.h" 
#include "sys.h" 
#include "KEY.h" 

int main(void)
{
	uint8_t KeyNum;
	Key_Init();	
	LED_Init(); //调用初始化LED函数,引用"led.h"后可使用
	delay_init(); //调用初始化延迟函数,引用"delay.h"后可使用
  while(1)
	{
			KeyNum = Key_GetNum();
			if(KeyNum==1)
			{
				PAout(0)=0;
				PAout(1)=1;
			}
			if(KeyNum==2)
			{
				PAout(0)=1;
				PAout(1)=0;
			}
	}
}

PAout(0)=0是sys.c/h里面定义的宏,就是将PA0的输出电平控制为1或0,当然还有PBin(12)宏。可以将程序改写为

int main(void)
{
    Key_Init();    
    LED_Init(); //调用初始化LED函数,引用"led.h"后可使用
    delay_init(); //调用初始化延迟函数,引用"delay.h"后可使用
  while(1)
    {
            if(PBin(12)==0)
            {
                PAout(0)=0;
                PAout(1)=1;
            }
            if(PBin(13)==0)
            {
                PAout(0)=1;
                PAout(1)=0;
            }
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微服务核心——网关路由

目录 前言 一、登录存在的问题归纳 二、*微服务网关整体方案 三、认识微服务网关 四、网关鉴权实现 五、OpenFeign微服务间用户标识信息传递实现 六、微服务网关知识追问巩固 前言 本篇文章具体讲解微服务中网关的实现逻辑、用于解决什么样的问题。其中标题中标注* 涉…

如何压缩pdf文件的大小?5分钟压缩pdf的方法推荐

如何压缩pdf文件的大小?在现代办公和学习中,PDF文件因其稳定性和广泛的兼容性被广泛使用。然而,随着文件内容的增多,制作好的PDF文件常常变得过大,给使用带来了诸多不便。无论是电子邮件附件的发送,还是在线…

entos7离线安装xrdp和图形化桌面

1、查看Linux系统环境 cat /etc/os-release NAME"CentOS Linux" VERSION"7 (Core)" ID"centos" ID_LIKE"rhel fedora" VERSION_ID"7" PRETTY_NAME"CentOS Linux 7 (Core)" ANSI_COLOR"0;31" CPE_NAME…

RSA算法简介(原理,举例)

目录 RSA算法原理 1. 密钥生成 步骤: 2. 加密 3. 解密 RSA算法示例 示例步骤 加密示例 解密示例 RSA算法是一种非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出。RSA算法的安全性基于大整数因子分解的难度,是…

海鲜图像分割系统:图像技术

海鲜图像分割系统源码&数据集分享 [yolov8-seg-C2f-DAttention&yolov8-seg-C2f-SCcConv等50全套改进创新点发刊_一键训练教程_Web前端展示] 1.研究背景与意义 项目参考ILSVRC ImageNet Large Scale Visual Recognition Challenge 项目来源AAAI Globa…

[react]10、react性能优化

1、列表&key 一、React更新流程 React在props或state发生改变时,会调用React的render方法,会创建一颗不同的树。React需要基于这两颗不同的树之间的差别来判断如何有效的更新UI。 同层节点之间相互比较,不会垮节点比较;不同类型的节点&am…

Android 托管 Github Action 发布 Github Packages ,实现 Mvn 免费自动化托管

自从多年前 JCenter 关闭服务之后,GSY 项目版本就一直发布在 Jitpack 上,如今每个月也都有大概 10w 左右下载,但是近年来时不时就会出现历史版本丢失的问题,而且有时候还不是某个具体版本丢失,而是版本里的某几个依赖突…

基于Javaweb+MySQL实现学生选课系统

学生选课系统设计报告 一、阶段:开发前的设置和思考 1.1 题目要求: 建立一个学生选课系统, 编写应用程序完成系统开发。 建立基本表: 学生(学号,姓名,性别,年龄,系别&#xff0…

centos7 安装python3.9.4,解决import ssl异常

本篇文章介绍如何在centos7中安装python3.9.4(下文简称python3),解决python3安装后import ssl模块失败问题,为什么我要在centos7中安装python呢,因为我需要在服务器中跑python数据处理脚本。 安装python3同时解决import ssl模块失败问题总共包…

Springboot 整合 Java DL4J 实现情感分析系统

🧑 博主简介:历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编程,…

计算机网络串联——打开网站的具体步骤

参与浏览网站的重要名词 1、MAC地址也叫硬件地址、物理地址。那这个东西就是设备你出厂的时候就会带有的,详情跳转,其构成如下: MAC地址用16进制表示,就是一共有12位,前六位他们会像一个国际的这种专门组织去申…

<项目代码>YOLOv8 夜间车辆识别<目标检测>

YOLOv8是一种单阶段(one-stage)检测算法,它将目标检测问题转化为一个回归问题,能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法(如Faster R-CNN),YOLOv8具有更高的…

xilinx vitis 更换硬件平台——ZYNQ学习笔记5

1、重新生成硬件信息 2、选择带有bit信息 3、设施路径和名字 4、打开更新硬件选项 5、选择新的硬件信息 6、打开系统工程界面 7、复位硬件信息 更新完毕

【温酒笔记】SPI

1. SPI基础 物理层 片选线 :选中拉低SCK: 时钟线MOSI:主出从入MISO:主入从出 协议层 CPOL:时钟极性:空闲电平高低 CPHA:时钟相位:第一个还是第二个边沿采样 2. 示例SPI-W25Q16 (见模组分类下文章)

Web应用性能测试工具 - httpstat

在数字化时代,网站的性能直接影响用户体验和业务成功。你是否曾经在浏览网页时,遇到加载缓慢的困扰?在这个快速变化的互联网环境中,如何快速诊断和优化Web应用的性能呢?今天,我们将探讨一个强大的工具——h…

Transformer 论文精读与完整代码复现【Attention Is All You Need】

本文将在一开始快速概括模型的主体,论文的贡献以及重要图表,然后使用 PyTorch 复现完整且与原论文对齐的 Transformer(位于后半段)。通过阅读文章能够了解: 单头与多头的区别?掩码到底掩了什么?…

element-plus按需引入报错AutoImport is not a function

官网文档:快速开始 | Element Plus webpack配置 // webpack.config.js const AutoImport require(unplugin-auto-import/webpack) const Components require(unplugin-vue-components/webpack) const { ElementPlusResolver } require(unplugin-vue-components…

《Python网络安全项目实战》项目2 Python基础练习_总复习(2)

《Python网络安全项目实战》项目2 Python基础练习_总复习(2) 期末总复习(2) 班级: 姓名: 实训成绩: 任务单成绩: 利用%d,%f占位符格式化输出。 Name “小明” age 16 height 1.7355774 ___________________________…

自扶正救生艇,保障水上救援的安全卫士_鼎跃安全

在应急事件中,自扶正救生艇能够发挥关键的救援和保障作用,确保救援人员和被困人员的生命安全,尤其在极端天气或突发水上事故中展现出明显优势。 在救援过程中如果遭遇翻船,救生艇能够迅速恢复正常姿态,确保救援人员不会…

SAR_ADC介绍和建模

SAR-ADC介绍以及建模 一、介绍 1、工作原理 采用多个时钟周期,将DAC的模拟输出VDAC逐次逼近此采样模拟输入,获得数字输出结果。采用二进制搜索或者折半查找算法 2、工作过程 1:信号与VREF/2相比,结‘1,代表信号>…