stm32单片机个人学习笔记4(GPIO输入)

news/2024/11/15 0:28:08/

前言

本篇文章属于stm32单片机(以下简称单片机)的学习笔记,来源于B站教学视频。下面是这位up主的视频链接。本文为个人学习笔记,只能做参考,细节方面建议观看视频,肯定受益匪浅。

STM32入门教程-2023版 细致讲解 中文字幕_哔哩哔哩_bilibili

一、按键介绍

二、传感器模块介绍

 三、硬件电路

上面两个按键按下是低电平,松手是高电平

左边两个要配置为上拉输入模式或下拉输入模式

右边两个可以配置为浮空输入模式也可以配置为上拉输入模式或下拉输入模式

一般采用上面两种接法,一些单片机没有下拉输入模式

 四、实例一(按键控制LED)

1.接线图

2. 代码

LED.c

#include "stm32f10x.h"                  // Device header/*** @brief  LED初始化函数* @param  无* @retval 无*/
void LED_Init(void)
{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);
}/*** @brief  点亮LED1* @param  无* @retval 无*/
void LED1_ON(void)
{GPIO_ResetBits(GPIOA,GPIO_Pin_1);
}/*** @brief  熄灭LED1* @param  无* @retval 无*/
void LED1_OFF(void)
{GPIO_SetBits(GPIOA,GPIO_Pin_1);
}/*** @brief  翻转LED1,处于点亮状态时,熄灭它;处于熄灭状态时,点亮它* @param  无* @retval 无*/
void LED1_Turn(void)
{if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1)==0){GPIO_SetBits(GPIOA,GPIO_Pin_1);}else{GPIO_ResetBits(GPIOA,GPIO_Pin_1);}
}/*** @brief  点亮LED2* @param  无* @retval 无*/
void LED2_ON(void)
{GPIO_ResetBits(GPIOA,GPIO_Pin_2);
}/*** @brief  熄灭LED1* @param  无* @retval 无*/
void LED2_OFF(void)
{GPIO_SetBits(GPIOA,GPIO_Pin_2);
}/*** @brief  翻转LED2,处于点亮状态时,熄灭它;处于熄灭状态时,点亮它* @param  无* @retval 无*/
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);}
}

 Key.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"/*** @brief  按键初始化* @param  无* @retval 无*/
void Key_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_11;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);}/*** @brief  获取键码值* @param  无* @retval KeyNum:键码值*/
uint8_t Key_GetNum(void)
{uint8_t KeyNum = 0;if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1)==0){Delay_ms(20);while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1)==0);Delay_ms(20);KeyNum = 1;}if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11)==0){Delay_ms(20);while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11)==0);Delay_ms(20);KeyNum = 2;}return KeyNum;
}

 

 五、实例二(光敏传感器控制蜂鸣器)

1.接线图

2.代码

Buzzer.c 

#include "stm32f10x.h"                  // Device header/*** @brief  蜂鸣器初始化* @param  无* @retval 无*/
void Buzzer_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_SetBits(GPIOB,GPIO_Pin_12);
}/*** @brief  打开蜂鸣器* @param  无* @retval 无*/
void Buzzer_ON(void)
{GPIO_ResetBits(GPIOB,GPIO_Pin_12);
}/*** @brief  关闭蜂鸣器* @param  无* @retval 无*/
void Buzzer_OFF(void)
{GPIO_SetBits(GPIOB,GPIO_Pin_12);
}/*** @brief  翻转蜂鸣器* @param  无* @retval 无*/
void Buzzer_Turn(void)
{if (GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_12)==0){GPIO_SetBits(GPIOB,GPIO_Pin_12);}else{GPIO_ResetBits(GPIOB,GPIO_Pin_12);}
}

 LightSensor.c

#include "stm32f10x.h"                  // Device header/*** @brief  光敏传感器初始化* @param  无* @retval 无*/
void LightSensor_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);}/*** @brief  光敏传感器输入数据* @param  无* @retval 光照强度小输出高电平1,光照强度大输出低电平0*/
uint8_t LightSensor_Get(void)
{return GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13);
}

 


http://www.ppmy.cn/news/1527784.html

相关文章

828 华为云征文|华为 Flexus 云服务器搭建萤火商城 2.0

《828 华为云征文|华为 Flexus 云服务器搭建萤火商城 2.0》 在 2024 年 9 月 14 日这个特别的日子,我着手利用华为 Flexus 云服务器搭建轻量级、高性能、前后端分离的电商系统萤火商城 2.0,开启了一段充满挑战与惊喜的旅程。 华为 Flexus 云服…

【C++】—— 内存管理

【C】—— 内存管理 1 C/C 的内存划分 1.1 C/C 的内存分布1.2 C/C 的内存分布练习 2 C语言 中动态内存管理方式:malloc/calloc/realloc/free3 C 内存管理方式3.1 new / delete 操作内置类型3.2 new 和 delete 操作自定义类型3.2.1 new 和 delete 操作自定义类型基础…

C++速通LeetCode简单第10题-翻转二叉树

递归法: class Solution { public:TreeNode* invertTree(TreeNode* root) {if (root nullptr) {return nullptr;}TreeNode* left invertTree(root->left);TreeNode* right invertTree(root->right);root->left right;root->right left;return roo…

中关村科金推出得助音视频鸿蒙SDK,助力金融业务系统鸿蒙化提速

鸿蒙生态大势所趋,各种应用适配加速 近日,华为纯血鸿蒙系统(HarmonyOS NEXT)再度引发市场高度关注。据媒体消息,鸿蒙NEXT Beta版将在9月24日对Mate 60系列、X5系列、Pura70系列等16款旗舰机型进行推送,这已…

【C++】关键字、命名空间、输入和输出、缺省参数的深入了解

目录 一、C关键字二、命名空间2.1 为什么存在命名空间?2.2 命名空间定义2.3 命名空间使用 三、C输入&输出四、缺省函数4.1 缺省函数分类 总结 一、C关键字 C一共有63个关键字 其中红色圈出来的32个关键字同时也是C语言的 二、命名空间 2.1 为什么存在命名空间…

python 实现euclidean distance欧式距离算法

euclidean distance欧式距离算法介绍 欧式距离(Euclidean Distance)是度量两点之间距离的一种常用方法,特别是在多维空间中。它基于欧几里得几何中的距离定义,即两点间的直线距离。 在二维空间中,假设有两个点 P 1 …

MySQl篇(SQL - 基本介绍)(持续更新迭代)

目录 一、简介 二、SQL方言(分页查询为例) 1. 简介 2. SQL方言大比拼 2.1. Oracle 2.1.1. 使用ROWNUM实现分页查询 2.1.2. 使用ROW_NUMBER()实现分页查询 2.2. MySQL 2.3. PostgreSQL 三、语法规范 四、注释 五、MySQL脚本中的标点符号 一、简…

Scikit-learn 学习笔记

安装: 在Scikit-learn中,数据通常表示为NumPy数组或Pandas DataFrame。特征数据(X)通常是一个二维数组,其中每一行代表一个样本,每一列代表一个特征。目标数据(y)通常是一个一维数组…