嵌入式蓝桥杯按键编写
首先还是要记住按键的时钟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°´ÏÂÁË");
}
}