【嵌入式蓝桥杯】嵌入式蓝桥杯按键编写

本文详细介绍了在嵌入式系统中如何初始化按键,使用GPIO上拉输入,并通过GPIO_ReadInputDataBit函数检测按键状态。通过宏定义简化了按键值的获取,并提供了按键扫描和处理的函数,包括判断按键是否被长按或短按。示例代码展示了如何处理按键1和按键2的按下事件,并在按键被释放后执行相应操作。
摘要由CSDN通过智能技术生成

嵌入式蓝桥杯按键编写

首先还是要记住按键的时钟IO口
.KEY_RESET PA0
KEY_1 PA8
KEY_2 PB1
KEY_3 PB2

按键初始化 采用上拉输入
将IO上拉一个高电平 这样按下按键时候 iO直接接地 iO口电压瞬间变低
此时候判断IO是否为低电平就能判断按键是否按下

void KEY_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStrure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);
	
	GPIO_InitStrure.GPIO_Mode=GPIO_Mode_IPU;
	GPIO_InitStrure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_8;
	GPIO_InitStrure.GPIO_Speed=GPIO_Speed_10MHz;
	GPIO_Init(GPIOA,&GPIO_InitStrure);
	
	GPIO_InitStrure.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_2;
	GPIO_Init(GPIOB,&GPIO_InitStrure);
	
}

我们用到一个函数 可以直接读取IO口的值
判断IO是否为低电平就能判断按键是否按下
GPIO_ReadInputDataBit()
记住此函数是带有bit的 不要误写成 GPIO_ReadInputDataBit()
此时我们用宏定义标记按键对应的iO口

#define KEY_0     GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0);
#define KEY_1     GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8);
#define KEY_2     GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1);
#define KEY_3     GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_2);

然后判断IO口的电平

uint8_t KEY_Scan(void)
{
	 u8 key_value = 0xff;
	if (KEY_0 ==0) 
		key_value='0';
	else if (KEY_1 == 0)
		key_value='1';
	else if (KEY_2 == 0)
		key_value='2';
  else if (KEY_3 == 0)
		key_value='3';
  return key_value;
}

到此时就要根据实际情况来编写按键的代码
是否长按 短按
是否按一次 只执行一次
这里写出按一次执行的结果
具体就是将扫描函数和执行函数分开 按一次的话扫描有没有松开
执行函数的执行完将反馈给原函数
如没有收到松开标志位将不执行
具体完整代码如下

#include "key.h"
#include "tim.h"
void KEY_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_8;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_10MHz;
	GPIO_Init(GPIOA,&GPIO_InitStruct);

	
}
	u8 key_status = 1;//0ÊÇûÓа´Ï 1ÊÇ°´ÏÂÁË
u8 key_release = 1;//1°´ÏÂÖ®ºóËÉ¿ª ¿ÉÒÔ´¥·¢×´Ì¬ 0 ±íʾ²»ÄÜ´¥·¢×´Ì¬ 
u8 KEY_Scan(void)
{

	if((KEY_0&&KEY_1)!=1)
	{
		
			Delay_Ms(20);
	if((KEY_0&&KEY_1)!=1)
			{
				if(KEY_0==0)

					return '1';
				else if(KEY_1==0)

					return '2';
			}
		
	}
	else 
	{
		key_status = 1;
	}

}
void KEY_Read(void)
{
	u8 t;
	t=KEY_Scan();
	if(key_status)
	{

	    if(t=='1')
			{
			printf("°´¼ü1°´ÏÂÁË");
			key_status=0;
			}
			if(t=='2')
			printf("°´¼ü2°´ÏÂÁË");
		
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-ATAO----

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值