STM32F103ZET6【标准库函数开发】------02 GPIO输入,按键控制LED实验

一、硬件介绍

在这里插入图片描述
如图,因为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输入输出八种方式图解

输入1
输入2
输入3
输入4
输出1
输出2
输出3
输出4

三、设计思路

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;}
	}	 
}

五、现象展示

KEY_UP
KEY2
KEY1
KEY0
  • 7
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值