GPIO库函数编程——库函数编程(点亮流水灯&按键控制LED)

 库函数编程  -- 标准库

1. 库函数讲解

标准库是官方将对外设的寄存器操作封装成函数

配置步骤:

1.配置总线时钟:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB 
| RCC_APB2Periph_SPI1, ENABLE);

2.定义GPIO的参数结构体:

GPIO_InitTypeDef GPIO_InitStructure; 

3.分别用来确定IO口的具体管脚、输出模式下的速度、引脚的模式:

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; 
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; 
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

引脚参数可选:

速度参数可选:

模式参数可选:

控制IO口输出高低电平的库函数 :

GPIO_SetBits(GPIOE, GPIO_Pin_3 ); //设置PE3的数据端口位
GPIO_ResetBits(GPIOE, GPIO_Pin_3);	//清除PE3的数据端口位
 

读取IO口状态的库函数:IDR

ReadValue =GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_7); //读取PB7的输入

返回值就是IO的电平状态

2. 库函数的简单应用

2.1 使用库函数点亮流水灯

首先通过原理图观察流水灯引脚与单片机开发板如何连接

经原理图观察得出:LED1、LED2、LED3、LED4分别与单片机的PE2、PE3、PE4、PE5连接

单片机实现延时原理:

NOP():单片机在执行NOP指令时,什么也不做,等待一个指令周期

主频为72Mhz   所以等待1个指令周期的时间为  1/72M s= 1/72000 ms = 1/72  us

延时1us   72个NOP

延时1ms   72000个NOP

编写程序代码:

延时函数头文件 delay.h

#ifndef __DELAY_H
#define __DELAY_H

#include "stm32f10x.h"

void Delay_1us(void);
void Delay_nus(uint32_t Time);
void Delay_nms(uint32_t Time);

#endif

延时函数 delay.c

#include "delay.h"

void Delay_1us(void)
{
	__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
	__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
	__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
	__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
	__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
	__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
	__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
	__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
}

void Delay_nus(uint32_t Time)
{
	while(Time--)
	{
		Delay_1us();
	}
}	
	
void Delay_nms(uint32_t Time)
{
	while(Time--)
	{
		Delay_nus(1000);//延时1ms
	}
}	

LED灯头文件 led.h

#ifndef __LED_H
#define __LED_H
#include "stm32f10x.h"

#define LED_1ON() GPIO_ResetBits(GPIOE, GPIO_Pin_2);		//开LED1 给PE2低电平信号
#define LED_1OFF() GPIO_SetBits(GPIOE, GPIO_Pin_2);		  //关LED1 给PE2高电平信号

#define LED_2ON() GPIO_ResetBits(GPIOE, GPIO_Pin_3);		//开LED2 给PE3低电平信号
#define LED_2OFF() GPIO_SetBits(GPIOE, GPIO_Pin_3);		  //关LED2 给PE3高电平信号

#define LED_3ON() GPIO_ResetBits(GPIOE, GPIO_Pin_4);		//开LED3 给PE4低电平信号
#define LED_3OFF() GPIO_SetBits(GPIOE, GPIO_Pin_4);		  //关LED3 给PE4高电平信号

#define LED_4ON() GPIO_ResetBits(GPIOE, GPIO_Pin_5);		//开LED4 给PE5低电平信号
#define LED_4OFF() GPIO_SetBits(GPIOE, GPIO_Pin_5);		  //关LED4 给PE5高电平信号

#define LED_1Toggle() GPIOE->ODR ^=1<<2;		//翻转LED1 
#define LED_2Toggle() GPIOE->ODR ^=1<<3;		//翻转LED2
#define LED_3Toggle() GPIOE->ODR ^=1<<4;		//翻转LED3
#define LED_4Toggle() GPIOE->ODR ^=1<<5;		//翻转LED4

void LED_Config(void);
#endif

注:宏定义中 LED_xToggle 将在按键控制LED灯亮灭中使用。

LED灯 led.c

#include "led.h"

void LED_Config(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE , ENABLE); //配置APB2总线时钟
	GPIO_InitTypeDef GPIO_InitStructure; 	//定义结构体
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 |GPIO_Pin_3 |GPIO_Pin_4 |GPIO_Pin_5; //初始化PE2345引脚
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;	//最高输出速率 10MHz
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; 	//推挽输出模式	
	GPIO_Init(GPIOE, &GPIO_InitStructure);				
}

主函数  man.c

#include "delay.h"
#include "led.h"
int main(void)
{
	LED_Config();      //调用LED配置函数
  while (1)
  {	
		LED_1ON();
		Delay_nms(50);    //调用延时函数
		LED_1OFF();
		Delay_nms(50);
		LED_2ON();
		Delay_nms(50);
		LED_2OFF();
		Delay_nms(50);
		LED_3ON();
		Delay_nms(50);
		LED_3OFF();
		Delay_nms(50);
		LED_4ON();
		Delay_nms(50);
		LED_4OFF();
		Delay_nms(50);
	}
}

2.2 使用库函数实现独立按键控制各LED亮灭

同样先通过原理图观察按键引脚与单片机开发板如何连接

经原理图观察得出:KEY1、KEY2、KEY3、KEY4分别与单片机的PA0、PC4、PC5、PC6连接

按键电路分析:

当按键KEY1被按下时会输出一个高电平信号;

KEY2、KEY3、KEY4被按下时会输出一个低电平

编写程序代码:

按键头文件 key.h

#ifndef __KEY_H
#define __KEY_H

#include "stm32f10x.h"

void KEY_Config(void);
#endif

按键 key.c

#include "key.h"
void KEY_Config(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_GPIOC, ENABLE); 
    //配置APB2总线时钟
	GPIO_InitTypeDef GPIO_InitStructure; 			//定义结构体
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; 		//最高输出速率 10MHz
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 	//浮空输入模式
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; 				//初始化PA0引脚
	GPIO_Init(GPIOA, &GPIO_InitStructure);					
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 |GPIO_Pin_5 |GPIO_Pin_6; 	//初始化PC456引脚
	GPIO_Init(GPIOC, &GPIO_InitStructure);								
}

主函数 main.c

#include "delay.h"
#include "led.h"
#include "key.h"
int main(void)
{
	KEY_Config();
	LED_Config();
  while (1)
  {	
		//KEY1控制LED1亮灭
		if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)==1)
		{
			Delay_nms(20);    //消抖
			if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)==1)
			{
				while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)==1);//消抖
				LED_1Toggle();
			}
		}
		//KEY2控制LED2亮灭
			if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_4)==0)     
		{
			Delay_nms(20);
			if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_4)==0)
			{
				while(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_4)==0);
				LED_2Toggle();
			}
		}
		//KEY3控制LED3亮灭
		if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_5)==0)
		{
			Delay_nms(20);
			if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_5)==0)
			{
				while(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_5)==0);
				LED_3Toggle();
			}
		}
		//KEY4控制LED4亮灭
		if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_6)==0)
		{
			Delay_nms(20);
			if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_6)==0)
			{
				while(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_6)==0);
				LED_4Toggle();
			}
		}	
	}
}

(感谢阅读! 此文章为本人学习总结, 如有错误 ,欢迎指教 )

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值