基于基于STM32F103ZET6实现按键识别实现按键识别
前面我们熟悉了跑马灯,其实蜂鸣器是一个原理,只是输出的电平不同而已
今天我们使用板载KEY0,KEY1,KEY_UP来控制DS0,DS1,和蜂鸣器,刚刚学习的朋友可能会有疑惑,难道按键和led灯在硬件
上是相连的吗?当然不是,只是我们在识别了按键之后,再来操作led或者蜂鸣器的!
我们拿着已经配置好的新工程或者之前的工程也可以,都是需要用到的,下面就开始思维梳理:
想要用按键控制led(蜂鸣器也可以),操作的是哪些io口,并且是什么模式,这样我们才好去初始化我们的io口,包括两部
分,一端是识别端,按键识别,另一端是外设(led或者其他),他们都是由goio控制,分别配置各自的模式等等,在led端之
前的博客有讲到,就不提了,主要是gpio的识别,小编曾经也是为了这些苦恼了好半天,虽然我们的按键可以用gpio中断来
写,但是为什么要使用普通方法来控制呢?我觉得学习的一种算法,思维,所以gpio中断后面我还会写,我们直接上代码,我
会对代码进行我自己的理解讲给大家:
我命名的按键头文件:key.h::
#ifndef KEY_H
#define KEY_H
#include “sys.h”//
#define key_up GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)
#define key1 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)
#define key0 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)
#define KEYUP 1
#define KEY1 2
#define KEY0 3
void keyinit(void);
int keyscan(void);
#endif
h文件中,sys.h主要是实现io口的读入和输出,并且在按键宏定义中使用了read函数,是必不可少的,这里我们把按键值直接
宏定义为gpio读到的值,方便我们在主函数中调用
key.c
#include “key.h”
void keyinit(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;
GPIO_Init(GPIOE,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;
GPIO_Init(GPIOE,&GPIO_InitStructure);
}
int keyscan(void)
{
static int check=1;
if(check&&(key_up1||key10||key00))
{
check=0;
delay_ms(10);
if(key_up1||key10||key00)
{
if(key_up1)
{
return KEYUP;
}
else if(key10)
{
return KEY1;
}
else if(key00)
{
return KEY0;
}
else
{
return 0;
}
评论0