3、STM32之GPIO输入

1、按键点灯

在这里插入图片描述
KEY0连接PC5,KEY1连接PA15,wake_up连接PA0.
在这里插入图片描述
根据这个电路图可知。KEY0和KEY1,按键按下变低电平,要保证不按下是高电平。所以要采用上拉输入,在悬空时默认高电平。WK_UP连接高电平,按键按下高电平,不按下要保持低电平,用下拉输入。
在这里插入图片描述
在你的对应的文件目录下面新建一个hardware文件夹

在这里插入图片描述
点击
在这里插入图片描述
把这个文件夹添加进来
在这里插入图片描述
然后点击小槌头
在这里插入图片描述
把文件路径添加进来
在这里插入图片描述
在这里插入图片描述
在Hardware文件夹下新建按键和灯的.c和.h文件
在这里插入图片描述
然后开始敲代码

LED.c

#include "stm32f10x.h"                  // Device header


void LED_Init(void)
{	
	
	GPIO_InitTypeDef  GPIO_InitStructure;
	
	 // 配置时钟,使能IO口时钟,使能PA,PD端口时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD, ENABLE);	 
	
	 //初始化IO参数
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;				 
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 	//推挽输出	
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	//IO口速度为50MHz
	GPIO_Init(GPIOA, &GPIO_InitStructure);	
	
	 //初始化IO参数
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;				 
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 	//推挽输出	
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	//IO口速度为50MHz
	GPIO_Init(GPIOD, &GPIO_InitStructure);	
	
  
	GPIO_SetBits(GPIOA,GPIO_Pin_8);
	GPIO_SetBits(GPIOD,GPIO_Pin_2);
	
}

void LED1_ON(void)
{
	GPIO_ResetBits(GPIOA,GPIO_Pin_8);
}

void LED1_OFF(void)
{
	GPIO_SetBits(GPIOA,GPIO_Pin_8);
}
void LED2_ON(void)
{
	GPIO_ResetBits(GPIOD,GPIO_Pin_2);
}

void LED2_OFF(void)
{
	GPIO_SetBits(GPIOD,GPIO_Pin_2);
}

LED.h

//防止头文件重复包含
#ifndef __LED_H
#define __LED_H

#define LED0 PAout(8) //PA8
#define LED1 PDout(2) //PA8

//外部声明,可被外部调用
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"                  // Device header
#include "delay.h"
void Key_Init(void)
{	
	
	GPIO_InitTypeDef  GPIO_InitStructure;
	
	 // 配置时钟,使能IO口时钟,使能PA,PD端口时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC, ENABLE);	 
	
	 //初始化IO参数
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;				 
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	//IO口速度为50MHz
	GPIO_Init(GPIOA, &GPIO_InitStructure);	
	
	 //初始化IO参数
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;				 
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; 	
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	//IO口速度为50MHz
	GPIO_Init(GPIOC, &GPIO_InitStructure);	
	
}

uint8_t Key1_Scan(void)
{
	uint8_t keynum = 0;
	if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15) == 0)
	{
		delay_ms(20);
		while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15) == 0);
		delay_ms(20);
		keynum = 1;
	}
	return keynum;
}

uint8_t Key0_Scan(void)
{
	uint8_t keynum = 0;
	if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5) == 0)
	{
		delay_ms(20);
		while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5) == 0);
		delay_ms(20);
		keynum = 1;
	}
	return keynum;
}

Key.h

#ifndef __KEY_H
#define __KEY_H
 
void Key_Init(void);

uint8_t Key1_Scan(void);

uint8_t Key0_Scan(void);

#endif 

有四个函数需要注意。
\STM32F10x_FWLib\inc\stm32f10x_gpio.h 文件中可以找到

这两个是获得输入的位/字节的值

 uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
 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); 

2、一些有的没的的笔记

1)关于关键字

在这里插入图片描述

2)关于一些c语言问题

#define宏定义
用一串字符代替一串字符,便于理解
注意这个不用写;

/*用LED0代替PA_8,用LED1代替PD_2
**/
#define LED0 PAout(8) //PA8
#define LED1 PDout(2) //PD2
#define ABC 12345
用ABC代替12345

typedef 给变量类型换名字

typedef unsigned char uint8_t;

struct结构体
一个数据类型,用于数据打包不同类型变量的集合

typedef struct
{
  uint16_t GPIO_Pin;  
  GPIOSpeed_TypeDef GPIO_Speed; 
  GPIOMode_TypeDef GPIO_Mode;   
}GPIO_InitTypeDef;
typedef struct
{
	char name;
	int age;
}student;

student.name = 2;

enum枚举类型

typedef enum
{ 
  GPIO_Speed_10MHz = 1,
  GPIO_Speed_2MHz, 
  GPIO_Speed_50MHz
}GPIOSpeed_TypeDef;
#define IS_GPIO_SPEED(SPEED) (((SPEED) == GPIO_Speed_10MHz) || ((SPEED) == GPIO_Speed_2MHz) || \
                              ((SPEED) == GPIO_Speed_50MHz))
3)关于按键

按键抖动需要延时,20us是个合适的时间
在这里插入图片描述

4)关于光敏/热敏/红外传感器

在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值