IMX6ULL裸机程序--3.按键输入检测

原理分析

按键输入检测采用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;

}

发布了24 篇原创文章 · 获赞 6 · 访问量 3973

猜你喜欢

转载自blog.csdn.net/weixin_43482414/article/details/104627203