1、封装函数编写
我这里是直接以GPIO_WriteBit函数为例了,主要是我想在主函数里面可以将控制LED的的程序封装,单独开放GPIO_PIN_x (x = 0~15) 以及 BitVal 两个接口来简略函数,避免后续PIN控制太多太繁杂的问题。
我在封装前先去读GPIO_WriteBit,函数有三个参量,再分别再去查看三个参量是什么类型,最后查到GPIOX和GPIO_Pin是宏定义,BitVal是枚举(不过最后发现要实现的话,不知道也无伤大雅,不过要理解的话,还是一个个查清楚比较好)
GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal)
接下来直接写我封装函数,这里我要封装GPIOA口,所以要开放GPIO_PIN_x 以及 BitVal这两个端口,因此就到定义这两个参数的问题了,定义的话,因为GPIO_PIN_x是一个宏定义,查它定义类型的话也是寄存器位数高低,原函数这里写的是uint16_t (即为unsigned short int的数据类型),我们这边直接定义它为uint16_t PIN的形式就好;然后就是BitVal的一个枚举结构体了,不过通过尝试发现,我们这里不能直接直接struct结构体的形式定义,我们去查BitVal的函数定义结果发现枚举结构体已经被定义为BitAction了,所以我们这里直接定义为BitAction就可以了
接下来直接上封装好的函数:
void LED_Set(uint16_t PIN, BitAction Bit)
{
GPIO_WriteBit(GPIOA, PIN, Bit);
}
2、LED控制函数源码
接下来我还将LED控制的对任意分类封装以及电平翻转写了出来下面上源代码给大家参考参考
LED.c
#include "stm32f10x.h" // Device header
void LED_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_SetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2);
}
// 直接的单一控制
void LED1_ON(void)
{
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);
}
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);
}
}
// 快捷控制PIN口的函数 设置对端口的直接调控 (PIN->GPIO_Pin_x)
void LED_SetON(uint16_t PIN)
{
GPIO_WriteBit(GPIOA, PIN, Bit_RESET);
}
void LED_SetOFF(uint16_t PIN)
{
GPIO_WriteBit(GPIOA, PIN, Bit_SET);
}
// 快捷控制任意PIN口的输出状态 (PIN->GPIO_Pin_x;Bit->BitVal)
void LED_Set(uint16_t PIN, BitAction Bit)
{
GPIO_WriteBit(GPIOA, PIN, Bit);
}
// 将上述函数融合,定义最便捷的参数函数,控制GPIOA的任意PIN的高低电位Bit翻转
// void LED_control(uint16_t PIN, BitAction Bit)
// 因为是电位翻转的所以Bit参数没有用上
void LED_control(uint16_t PIN)
{
if(GPIO_ReadOutputDataBit(GPIOA, PIN) == 0)
{
GPIO_SetBits(GPIOA, PIN);
}
else
{
GPIO_ResetBits(GPIOA, PIN);
}
}
LED.h
#ifndef __LED_H
#define __LED_H
void LED_Init(void);
void LED1_ON(void);
void LED2_ON(void);
void LED1_OFF(void);
void LED2_OFF(void);
void LED1_Turn(void);
void LED2_Turn(void);
void LED_SetON(uint16_t PIN);
void LED_SetOFF(uint16_t PIN);
void LED_Set(uint16_t PIN, BitAction Bit);
void LED_control(uint16_t PIN);
#endif
3、下面是我发来自己保存的啦(代码备份肯定要多呀 doge)
Key.c
#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;
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;
}
Key.h
#ifndef __KEY_H
#define __KEY_H
void Key_Init(void);
uint8_t Key_GetNum(void);
#endif
main.c
#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)
{
LED_control(GPIO_Pin_1);
}
if(KeyNum == 2)
{
LED_control(GPIO_Pin_2);
}
// 快捷控制任意PIN口的输出状态 (PIN->GPIO_Pin_x;Bit->BitVal)
// LED_Set(GPIO_Pin_1, Bit_RESET);
// Delay_ms(500);
// LED_Set(GPIO_Pin_1, Bit_SET);
// Delay_ms(500);
// 快捷控制PIN口的函数 设置对端口的直接调控 (PIN->GPIO_Pin_x)
// LED_SetON(GPIO_Pin_1);
// Delay_ms(500);
// LED_SetOFF(GPIO_Pin_1);
// Delay_ms(500);
// 直接变更输入电位状态的控制方式
// KeyNum =key_GetNum();
// if(KeyNum == 1)
// {
// LED1_Turn();
// }
// if(KeyNum == 2)
// {
// LED2_Turn();
// }
// 直接的单一控制
// LED1_ON();
// LED2_ON();
// Delay_ms(500);
// LED1_OFF();
// LED2_OFF();
// Delay_ms(500);
// LED_Set(GPIO_Pin_1, Bit_RESET);
// Delay_ms(500);
// LED_Set(GPIO_Pin_1, Bit_SET);
// Delay_ms(500);
}
}
本文为作者独立编写
本BLOG上所有的原创文章未经本人许可,不得用于商业用途及传统媒体。网络媒体转载请注明出处,否则属于侵权行为。