STM32-按键输入

按键引脚图led.c

#include"key.h"
#include"delay.h"


//按键初始化函数
void KEY_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE|RCC_AHB1Periph_GPIOA,ENABLE);
	
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN;//普通输入
	//GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
	GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_DOWN;//下拉
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN;//普通输入
	//GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
	GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;//上拉
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
	GPIO_Init(GPIOE,&GPIO_InitStructure);
}
/*
按键处理函数
返回按键值
mode=0,不支持连按;mode=1;支持连按
return 0:没有按键按下
return 1:KEY0按下
return 2:KEY1按下
return 3:KEY2按下
return 4:WK_UP按下
注意:此函数有优先级
*/
u8 KEY_Scan(u8 mode)
{
	static u8 key_up=1;//按键松开标志
	if(mode)key_up=1;//支持连按
	if(key_up==1&&(KEY0==0||KEY1==0||KEY2==0||WK_UP==1))
	{
		delay_ms (10);//去抖动
		key_up =0;
		if(KEY0==0)return 1;
		else if(KEY1==0)return 2;
		else if(KEY2==0)return 3;
		else if(WK_UP==0)return 4;
	}
	else if(KEY0==1||KEY1==1||KEY2==1||WK_UP==0)
		key_up =1;
		return 0;//无按键按下
	
}
  1. KEY_Init是用来初始化按键输入的 IO口的。实现 PA0、PE2~4的输入设置。
  2. KEY_Scan函数,则是用来扫描这 4个 IO口是否有按键按下。 KEY_Scan函数,支持两种扫描方式,通过 mode参数来设置。

 led.h

#ifndef __KEY_H
#define __KEY_H
#include"sys.h"

/*读取IO*/
#define KEY0 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)
#define KEY1 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)
#define KEY2 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)
#define WK_UP GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)

#define KEY0_PRES 1
#define KEY1_PRES 2
#define KEY2_PRES 3
#define WKUP_PRES 4

void KEY_Init(void);//IO初始化
u8 KEY_Scan(u8);//按键扫描函数

#endif

 宏定义部分也可以用位带操作

主函数main.c

#include"sys.h"
#include"delay.h"
#include"usart.h"
#include"led.h"
#include"beep.h"
#include"key.h"
int main(void)
{
	u8 key;           //保存按键
	delay_init (168); //初始化延时函数
	KEY_Init ();      //初始化与按键连接的硬件接口
	LED_Init ();      //初始化LED端口
	BEEP_Init ();     //初始化蜂鸣器端口
	LED0=0;           //先点亮LED0
	while(1)
	{
		key=KEY_Scan(0);//得到按键值
		if(key)
		{
			switch(key)
			{
				case WKUP_PRES:
					BEEP=!BEEP;
				    break;
				case KEY0_PRES:
					LED0!=LED0;
					break;
				case KEY1_PRES:
					LED1!=LED1;
					break;
				case KEY2_PRES:
					LED0!=LED0;
					LED1!=LED1;
					break;
					
			}
		}
		else
			delay_ms (10);
	}
	
}

在写这个实验代码的时候我遇到很多问题,分享给大家

  1.  定义变量必须在初始化之前;
  2. KEY0、KEY1、KEY2必须上拉(低电平有效)、WK_UP必须下拉(高电平有效)。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值