main.c文件
#include "sys.h"
#include "delay.h"
#include "gpio.h"
uint8_t GetCNState;
int main(void)
{
delay_init(); //延时函数初始化
GPIO_Quick_Init(GPIOA_Pin0,GPIO_Mode_Out_PP,1); //初始化A0为推挽输出模式,开始电平为1
GPIO_Quick_Init(GPIOB_Pin1,GPIO_Mode_Out_PP,0); //初始化B1为推挽输出模式, 开始电平为0
GPIO_Quick_Init(GPIOC_Pin2,GPIO_Mode_IPU,1); //初始化C2为上拉输入模式
Write_GPIOx_Pinx(GPIOA_Pin0,0); //A0输出0
GetCNState = Read_GPIOx_Pinx(GPIOB_Pin1); //读端口B1的电平
while(1)
{
}
}
gpio.c文件
#include "gpio.h"
#include "delay.h"
/**************************************
功能 :GPIO快速初始化
参数1:选择GPIO
参数2:选择模式
GPIO_Mode_AIN
GPIO_Mode_Out_PP
GPIO_Mode_IPD
GPIO_Mode_IPU
GPIO_Mode_Out_OD
GPIO_Mode_Out_PP
GPIO_Mode_AF_OD
GPIO_Mode_AF_PP
参数3:IO口初始状态
**************************************/
void GPIO_Quick_Init(GPIOx_Pinx_enum GPIOx_Pinx, GPIOMode_TypeDef GPIO_Mode,u8 val)
{
static int Remap_SWJ_Disable = 0;
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_TypeDef* GPIOx;
uint16_t GPIO_Pin;
Check_GPIOx_Pinx(GPIOx_Pinx,&GPIOx,&GPIO_Pin);
if (GPIOx == GPIOA)RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能端口时钟
else if(GPIOx == GPIOB)RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能端口时钟
else if(GPIOx == GPIOC)RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //使能端口时钟
else if(GPIOx == GPIOD)RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); //使能端口时钟
else if(GPIOx == GPIOE)RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE); //使能端口时钟
else if(GPIOx == GPIOF)RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE); //使能端口时钟
else if(GPIOx == GPIOG)RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE); //使能端口时钟
if( ((GPIOx == GPIOB && GPIO_Pin == GPIO_Pin_3) || (GPIOx == GPIOB && GPIO_Pin == GPIO_Pin_4) ||
(GPIOx == GPIOA && GPIO_Pin == GPIO_Pin_13) || (GPIOx == GPIOA && GPIO_Pin == GPIO_Pin_14) ||
(GPIOx == GPIOA && GPIO_Pin == GPIO_Pin_15)) && Remap_SWJ_Disable == 0)
{
Remap_SWJ_Disable = 1;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //使能端口时钟
GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);
}
GPIO_InitStructure.GPIO_Pin = GPIO_Pin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOx, &GPIO_InitStructure); //根据设定参数初始化
GPIO_WriteBit(GPIOx,GPIO_Pin,(BitAction)val);
}
/**************************************
功能 :写GPIO
参数1:选择GPIO
参数2:写入的值
**************************************/
void Write_GPIOx_Pinx(GPIOx_Pinx_enum GPIOx_Pinx,u8 val)
{
GPIO_TypeDef* GPIOx;
uint16_t GPIO_Pin;
Check_GPIOx_Pinx(GPIOx_Pinx,&GPIOx,&GPIO_Pin);
GPIO_WriteBit(GPIOx,GPIO_Pin,(BitAction)val);
}
/**************************************
功能 :读GPIO
参数1:选择GPIO
返回 :GPIO值
**************************************/
uint8_t Read_GPIOx_Pinx(GPIOx_Pinx_enum GPIOx_Pinx)
{
GPIO_TypeDef* GPIOx;
uint16_t GPIO_Pin;
Check_GPIOx_Pinx(GPIOx_Pinx,&GPIOx,&GPIO_Pin);
return (GPIO_ReadInputDataBit(GPIOx,GPIO_Pin));
}
void Check_GPIOx_Pinx(GPIOx_Pinx_enum GPIOx_Pinx,GPIO_TypeDef** GPIOx,uint16_t* GPIO_Pin)
{
if(GPIOx_Pinx < 16*1) *GPIOx = GPIOA;
else if(GPIOx_Pinx < 16*2) *GPIOx = GPIOB;
else if(GPIOx_Pinx < 16*3) *GPIOx = GPIOC;
else if(GPIOx_Pinx < 16*4) *GPIOx = GPIOD;
else if(GPIOx_Pinx < 16*5) *GPIOx = GPIOE;
else if(GPIOx_Pinx < 16*6) *GPIOx = GPIOF;
else if(GPIOx_Pinx < 16*7) *GPIOx = GPIOG;
if(GPIOx_Pinx % 16 == 0) *GPIO_Pin = GPIO_Pin_0;
else if(GPIOx_Pinx % 16 == 1) *GPIO_Pin = GPIO_Pin_1;
else if(GPIOx_Pinx % 16 == 2) *GPIO_Pin = GPIO_Pin_2;
else if(GPIOx_Pinx % 16 == 3) *GPIO_Pin = GPIO_Pin_3;
else if(GPIOx_Pinx % 16 == 4) *GPIO_Pin = GPIO_Pin_4;
else if(GPIOx_Pinx % 16 == 5) *GPIO_Pin = GPIO_Pin_5;
else if(GPIOx_Pinx % 16 == 6) *GPIO_Pin = GPIO_Pin_6;
else if(GPIOx_Pinx % 16 == 7) *GPIO_Pin = GPIO_Pin_7;
else if(GPIOx_Pinx % 16 == 8) *GPIO_Pin = GPIO_Pin_8;
else if(GPIOx_Pinx % 16 == 9) *GPIO_Pin = GPIO_Pin_9;
else if(GPIOx_Pinx % 16 == 10) *GPIO_Pin = GPIO_Pin_10;
else if(GPIOx_Pinx % 16 == 11) *GPIO_Pin = GPIO_Pin_11;
else if(GPIOx_Pinx % 16 == 12) *GPIO_Pin = GPIO_Pin_12;
else if(GPIOx_Pinx % 16 == 13) *GPIO_Pin = GPIO_Pin_13;
else if(GPIOx_Pinx % 16 == 14) *GPIO_Pin = GPIO_Pin_14;
else if(GPIOx_Pinx % 16 == 15) *GPIO_Pin = GPIO_Pin_15;
}
gpio.h文件
#ifndef __GPIO_H_
#define __GPIO_H_
#include "sys.h"
typedef enum
{
GPIOA_Pin0 = 0,GPIOA_Pin1,GPIOA_Pin2,GPIOA_Pin3,GPIOA_Pin4,GPIOA_Pin5,GPIOA_Pin6,GPIOA_Pin7,GPIOA_Pin8,GPIOA_Pin9,GPIOA_Pin10,GPIOA_Pin11,GPIOA_Pin12,GPIOA_Pin13,GPIOA_Pin14,GPIOA_Pin15,
GPIOB_Pin0,GPIOB_Pin1,GPIOB_Pin2,GPIOB_Pin3,GPIOB_Pin4,GPIOB_Pin5,GPIOB_Pin6,GPIOB_Pin7,GPIOB_Pin8,GPIOB_Pin9,GPIOB_Pin10,GPIOB_Pin11,GPIOB_Pin12,GPIOB_Pin13,GPIOB_Pin14,GPIOB_Pin15,
GPIOC_Pin0,GPIOC_Pin1,GPIOC_Pin2,GPIOC_Pin3,GPIOC_Pin4,GPIOC_Pin5,GPIOC_Pin6,GPIOC_Pin7,GPIOC_Pin8,GPIOC_Pin9,GPIOC_Pin10,GPIOC_Pin11,GPIOC_Pin12,GPIOC_Pin13,GPIOC_Pin14,GPIOC_Pin15,
GPIOD_Pin0,GPIOD_Pin1,GPIOD_Pin2,GPIOD_Pin3,GPIOD_Pin4,GPIOD_Pin5,GPIOD_Pin6,GPIOD_Pin7,GPIOD_Pin8,GPIOD_Pin9,GPIOD_Pin10,GPIOD_Pin11,GPIOD_Pin12,GPIOD_Pin13,GPIOD_Pin14,GPIOD_Pin15,
GPIOE_Pin0,GPIOE_Pin1,GPIOE_Pin2,GPIOE_Pin3,GPIOE_Pin4,GPIOE_Pin5,GPIOE_Pin6,GPIOE_Pin7,GPIOE_Pin8,GPIOE_Pin9,GPIOE_Pin10,GPIOE_Pin11,GPIOE_Pin12,GPIOE_Pin13,GPIOE_Pin14,GPIOE_Pin15,
GPIOF_Pin0,GPIOF_Pin1,GPIOF_Pin2,GPIOF_Pin3,GPIOF_Pin4,GPIOF_Pin5,GPIOF_Pin6,GPIOF_Pin7,GPIOF_Pin8,GPIOF_Pin9,GPIOF_Pin10,GPIOF_Pin11,GPIOF_Pin12,GPIOF_Pin13,GPIOF_Pin14,GPIOF_Pin15,
GPIOG_Pin0,GPIOG_Pin1,GPIOG_Pin2,GPIOG_Pin3,GPIOG_Pin4,GPIOG_Pin5,GPIOG_Pin6,GPIOG_Pin7,GPIOG_Pin8,GPIOG_Pin9,GPIOG_Pin10,GPIOG_Pin11,GPIOG_Pin12,GPIOG_Pin13,GPIOG_Pin14,GPIOG_Pin15,
}GPIOx_Pinx_enum;
void Check_GPIOx_Pinx(GPIOx_Pinx_enum GPIOx_Pinx,GPIO_TypeDef** GPIOx,uint16_t* GPIO_Pin);
void GPIO_Quick_Init(GPIOx_Pinx_enum GPIOx_Pinx, GPIOMode_TypeDef GPIO_Mode,u8 val) ;
void Write_GPIOx_Pinx(GPIOx_Pinx_enum GPIOx_Pinx,u8 val) ;
uint8_t Read_GPIOx_Pinx(GPIOx_Pinx_enum GPIOx_Pinx);
void Get_Key_Time(GPIOx_Pinx_enum GPIOx_Pinx,long* PressLastTimes,u8 PressCN,u8 IsWait);
#endif