一、硬件介绍
如图,因为key0,key1,key2通过轻触开关和GND连接在一起,所以按下按键的时候,对应的PE4,PE3,PE2为低电平;
同理,WK_UP通过开关和VCC3.3连接在一起,所以所以按下按键的时候,对应的PA0为高电平
二、实现目的
刚开机LED0和LED1均熄灭
按下KEY0,LED0点亮,LED1熄灭
按下KEY1,LED0熄灭,LED1点亮
按下KEY2,LED0、LED1点亮
按下KEY_UP,LED0、LED1熄灭
8种GPIO输入输出八种方式图解
|
|
|
|
|
|
|
|
三、设计思路
3.1 先将两个LED熄灭
配置PE5、PB5为推挽输出、低电平
3.2 配置四个按键
1、使能PA、PE时钟
2、将PA0设置为下拉输入;将PE2、PE3、PE4设置为上拉输入
3、初始化PA0、PE2、PE3、PE4
4、写一个判断函数、四个按键按下分别对应LED的四个不同的状态
四、代码简介
主要有五个文件,主函数main.c、按键源文件key.c、按键头文件key.h、灯的源文件led.c、灯的头文件led.h
key.h
//宏定义
#define KEY0 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)//读取按键0 GPIOE.4
#define KEY1 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)//读取按键1 GPIOE.3
#define KEY2 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)//读取按键2 GPIOE.2
#define WK_UP GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)//读取按键3(WK_UP) GPIOA.0
void KEY_Init(void);//IO初始化
key.c
//按键初始化函数
void KEY_Init(void) //IO初始化
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);//使能PORTA,PORTE时钟
//初始化KEY0,KEY1,KEY2--->PE4,PE3,PE2 上拉输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;//选择引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE2,3,4
//初始化 WK_UP-->GPIOA.0 下拉输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//选择引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0设置成输入,默认下拉
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.0
}
led.h
#define LED0 PBout(5)// 宏定义LED0为GPIOB.5输出
#define LED1 PEout(5)// 宏定义LED1为GPIOE.5输出
void LED_Init(void);//定义函数
led.c
//LED初始化
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE); //使能PB,PE端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0-->PB.5 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化GPIOB.5
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED1-->PE.5 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOE, &GPIO_InitStructure); //初始化GPIOE.5
}
main.c
//主函数
int main(void)
{
LED_Init(); //LED端口初始化
KEY_Init(); //初始化与按键连接的硬件接口
while(1)
{
if(KEY0==0) {LED0=0;LED1=1;}
if(KEY1==0) {LED0=1;LED1=0;}
if(KEY2==0) {LED0=0;LED1=0;}
if(WK_UP==1) {LED0=1;LED1=1;}
}
}
五、现象展示
|
|
|
|