原理分析
按键输入检测采用GPIO输入功能,与GPIO输出功能类似,具体需要如下几步:
- 复用功能选择 GPIO模式
- IO配置
- GPIO属性配置为输入模式。
- 检测GPIO状态寄存器状态
代码
工程结构
代码内容
bsp_gpio.c .h
#include "bsp_gpio.h"
/*
GPIO初始化:
参数1:GPIO组
参数2:GPIOpin
参数3:GPIO属性
*/
void gpio_init(GPIO_Type *base,int pin,gpio_pin_config_t *config)
{
if(config->direction == kGPIO_DigitalInput)
{
base->GDIR &= ~(1<<pin);
}
else
{
base->GDIR |= 1<<pin;
gpio_pinwrite(base,pin,config->outputLogic);
}
}
int gpio_pinread(GPIO_Type *base,int pin)
{
return(((base->DR)>>pin)&0x1);
}
void gpio_pinwrite(GPIO_Type *base,int pin,int value)
{
if(value == 0U)
{
base->DR &= ~(1U << pin);
}
else
{
base->DR |= (1U << pin);
}
}
#ifndef __BSP_GPIO_H
#define __BSP_GPIO_H
#define __BSP_KEY_H
#include "imx6ul.h"
/* 枚举类型和结构体定义 */
typedef enum _gpio_pin_direction
{
kGPIO_DigitalInput = 0U, /* 输入 */
kGPIO_DigitalOutput = 1U, /* 输出 */
} gpio_pin_direction_t;
/* GPIO 配置结构体 */
typedef struct _gpio_pin_config
{
gpio_pin_direction_t direction; /* GPIO 方向:输入还是输出 */
uint8_t outputLogic; /* 如果是输出的话,默认输出电平 */
} gpio_pin_config_t;
/* 函数声明 */
void gpio_init(GPIO_Type *base, int pin, gpio_pin_config_t *config);
int gpio_pinread(GPIO_Type *base, int pin);
void gpio_pinwrite(GPIO_Type *base, int pin, int value);
#endif
bsp_key.c .h
#include "bsp_key.h"
#include "bsp_gpio.h"
#include "bsp_delay.h"
/*
key初始化函数
*/
void key_init(void)
{
gpio_pin_config_t key_config;
/* 复用功能选择 */
IOMUXC_SetPinMux(IOMUXC_SNVS_SNVS_TAMPER1_GPIO5_IO01,0);
/* IO设置 */
IOMUXC_SetPinConfig(IOMUXC_SNVS_SNVS_TAMPER1_GPIO5_IO01,0xf080);
/* 初始化IO */
key_config.direction = kGPIO_DigitalInput;
gpio_init(GPIO5,1,&key_config);
}
/*
获取按键值
0:无按键按下 其他值:对应按键值
*/
int key_getvalue(void)
{
int ret = 0;
static unsigned char release = 1;/* 按键松开 */
if((release == 1)&&(gpio_pinread(GPIO5,1) == 0))//按键按下
{
delay(10);//延时消抖
release = 0;//标记按键按下
if(gpio_pinread(GPIO5,1) == 0)
{
ret = KEY0_VALUE;
}
}
else if (gpio_pinread(GPIO5,1) == 1)
{
ret = 0;
release = 1;//标识按键释放
}
return ret;
}
#ifndef __BSP_KEY_H
#define __BSP_KEY_H
#include "imx6ul.h"
enum keyvalue{
KEY_NONE = 0,
KEY0_VALUE,
};
/* 函数声明 */
void key_init(void);
int key_getvalue(void);
#endif
main.c .h
#include "bsp_clk.h"
#include "bsp_delay.h"
#include "bsp_led.h"
#include "bsp_key.h"
/*
* @description : mian函数
* @param : 无
* @return : 无
*/
int main(void)
{
int i = 0;
int keyvalue = 0;
unsigned char led_state = OFF;
clk_enable(); /* 使能所有的时钟 */
led_init(); /* 初始化led */
key_init(); //按键初始化
while(1)
{
keyvalue = key_getvalue();
if(keyvalue)
{
switch (keyvalue)
{
case KEY0_VALUE:
/* code */
led_state = !led_state;
led_switch(LED0,led_state);
break;
default:
break;
}
}
}
return 0;
}