stm32学习笔记:GPIO输入

1、寄存器输入输出函数

cpp 复制代码
//读取输入数据寄存器某一个端口的输入值,参数用来指定某一个端口,返回值是
uint8_t类型,用来代表高低电平(读取按键的值)

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

//读取整个输入数据寄存器,参数用来指定外设,uint16_t是一个16位的数据,每一位代表一个端口值
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);

//读取输出寄存器
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

//读取输出寄存器
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);

ReadInput:读取GPIO口

ReadOutput:输出模式下输出的值/电平

2、按下按键:低电平

按键采取上拉输入模式,按下就接地,故没按下是高电平,按下的时候是低电平。

按键抖动 :由于按键内部使用机械式弹等片进行判新,所以在按下和松手的瞬间会伴随有一连串的抖动

cpp 复制代码
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入

上拉输入:可读取引脚电平,内部连接上拉电阻,悬空时默认高电平

传感器元件的电阻会随看外界模拟量的变化而变化,通过领随电阻证即可得到模拟电压输出,再通过与电压比较器进行二值化即可得列数字电压输出

3、主要代码

(1)获取按键的值(按键接在B1和B11,led灯接在A1和A2)

cpp 复制代码
//读取按键值的函数
uint8_t Key_GetNum(void)
{
	uint8_t KeyNum = 0;
	//读取GPIO端口的功能
	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;
}	

(2)调用按键中的函数

cpp 复制代码
while(1)
	{
		KeyNum = Key_GetNum();
		if(KeyNum == 1)
		{
			LED1_ON();
		}
		if(KeyNum == 2)
		{
			LED1_OFF();
		}
	}

4、全部代码:

一、按键控制灯

(1)key.c
cpp 复制代码
#include "stm32f10x.h"                  // Device header
#include "Delay.h"
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);

}
//读取按键值的函数
uint8_t Key_GetNum(void)
{
	uint8_t KeyNum = 0;
	//读取GPIO端口的功能
	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;
}	
(2)key.h
cpp 复制代码
#ifndef __KEY_H
#define __KEY_H        

void Key_Init(void);
uint8_t Key_GetNum(void);

#endif
(3)led
cpp 复制代码
#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);//关闭LED
}

void LED1_ON(void)              //控制LED开关灯
{
	GPIO_ResetBits(GPIOA, GPIO_Pin_1);
}
void LED1_OFF(void)
{
	GPIO_SetBits(GPIOA, GPIO_Pin_1);
}
void LED1_Turn(void)
{
	if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_1)==0)
	{
		GPIO_SetBits(GPIOA,GPIO_Pin_1);            //再按一下置为1
	}
	else
	{
		GPIO_ResetBits(GPIOA,GPIO_Pin_1); 
	}
}
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); 
	}
}
(4)led.h
cpp 复制代码
#ifndef __LED_H            
#define __LED_H           

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

#endif
(5)主函数
cpp 复制代码
#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "LED.h"
#include "Key.h"

uint8_t KeyNum;          //存储键码的返回值

int main(void)
{
	LED_Init();
	Key_Init();
	
	while(1)
	{
		KeyNum = Key_GetNum();
		if(KeyNum == 1)
		{
			LED1_ON();
		}
		if(KeyNum == 2)
		{
			LED1_OFF();
		}
	}
}

二、光敏传感器控制蜂鸣器

当遮住光线时,输出指示灯灭,代表输出高电平,有光线时,输出指示灯亮,代表输出低电平

(6)Buzzer.c
cpp 复制代码
#include "stm32f10x.h"                  // Device header

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);
}

void Buzzer_ON(void)
{
	GPIO_ResetBits(GPIOB, GPIO_Pin_12);
}

void Buzzer_OFF(void)
{
	GPIO_SetBits(GPIOB, GPIO_Pin_12);
}

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);
	}
}
(7)Buzzer.h
cpp 复制代码
#ifndef __BUZZER_H
#define __BUZZER_H

void Buzzer_Init(void);
void Buzzer_ON(void);
void Buzzer_OFF(void);
void Buzzer_Turn(void);

#endif
(8)LightSensor.c
cpp 复制代码
#include "stm32f10x.h"                  // Device header
 
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);
}
 
uint8_t LightSensor_Get(void)
{
	return GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_13);
}
(9)LightSensor.h
cpp 复制代码
#ifndef __LIGHT_SENSOR_H
#define __LIGHT_SENSOR_H

void LightSensor_Init(void);
uint8_t LightSensor_Get(void);

#endif

(10)主函数

cpp 复制代码
#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "Buzzer.h"
#include "LightSensor.h"

int main(void)
{
	Buzzer_Init();
	LightSensor_Init();
	
	while (1)
	{
		if(LightSensor_Get()==1)       //光线暗
		{
			Buzzer_ON();
		}
		else
		{
			Buzzer_OFF();
		}
	}
}	
相关推荐
不羁。。1 小时前
【撸靶笔记】第七关:GET - Dump into outfile - String
数据库·笔记·oracle
好望角雾眠6 小时前
第一阶段C#基础-10:集合(Arraylist,list,Dictionary等)
笔记·学习·c#
艾伦~耶格尔6 小时前
【集合框架LinkedList底层添加元素机制】
java·开发语言·学习·面试
星仔编程6 小时前
python学习DAY46打卡
学习
大霞上仙7 小时前
实现自学习系统,输入excel文件,能学习后进行相应回答
python·学习·excel
曙曙学编程8 小时前
stm32——GPIO
c语言·c++·stm32·单片机·嵌入式硬件
yatingliu20198 小时前
HiveQL | 个人学习笔记
hive·笔记·sql·学习
Kisorge8 小时前
【电机参数】电压、电流、转速标幺化推算过程
stm32
郭庆汝8 小时前
CMake概述用法详细笔记
笔记
武当豆豆8 小时前
C++编程学习(第25天)
开发语言·c++·学习