嵌入式蓝桥杯按键编写 按一次只执行一次的写法

嵌入式蓝桥杯按键编写

首先还是要记住按键的时钟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°´ÏÂÁË");
		
	}
}

猜你喜欢

转载自blog.csdn.net/m0_46179894/article/details/108108228
今日推荐