key按键使用
阅读原文时间:2023年07月09日阅读:2

1. 按键实验

查询原理图可知KEY对应的按键和引脚,当KEY按下时,引脚为低电平,否则为高电平

2. 代码

2.1 GPIO

为了方便GPIO的编写,建立GPIO的文件夹和对应的.h和.c文件。

bsp_gpio.h

/* 为了方便gpio的驱动编写,编写一个gpio驱动文件 */
#ifndef __BSP_GPIO
#define  __BSP_GPIO
#include "imx6ul.h"

/* 枚举类型和结构体定义 */
typedef enum _gpio_pin_direction
{
    // 0U和1U是无符号整型的0和1
    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_GPIO

bsp_gpio.c

#include "bsp_gpio.h"
/*
* @description : GPIO 初始化。
* @param - base : 要初始化的 GPIO 组。
* @param - pin : 要初始化 GPIO 在组内的编号。
* @param - config : GPIO 配置结构体。
* @return : 无
*/
void gpio_init(GPIO_Type *base, int pin, gpio_pin_config_t *config)
{
    // base是GPIO的类型,比如DR,GDIR等
    // 我们一般操作用这两个比较多,比如配置输入输出
    // pin是第几个脚
    if(config->direction == kGPIO_DigitalInput) /* 输入 */
    {
        base->GDIR &= ~( 1 << pin);
    }else {/* 输出 */
        base->GDIR |= 1 << pin;
        gpio_pinwrite(base, pin, config->outputLogic);/* 默认输出电平 */
    }
}
/*
* @description : 读取指定 GPIO 的电平值 。
* @param – base : 要读取的 GPIO 组。
* @param - pin : 要读取的 GPIO 脚号。
* @return : 无
*/
int gpio_pinread(GPIO_Type *base, int pin)
{
    return (((base->DR) >> pin) & 0x1);
}
/*
* @description : 指定 GPIO 输出高或者低电平 。
* @param – base : 要输出的的 GPIO 组。
* @param - pin : 要输出的 GPIO 脚号。
* @param – value : 要输出的电平,1 输出高电平, 0 输出低低电平
* @return : 无
*/
void gpio_pinwrite(GPIO_Type *base, int pin, int value)
{
    if (value == 0U)
    {
        base->DR &= ~(1U << pin); /* 输出低电平 */
    }else{
        base->DR |= (1U << pin); /* 输出高电平 */
    }
}

2.2 key文件的编写

key.h

#ifndef __BSP_KEY
#define __BSP_KEY
#include "imx6ul.h"
/* 定义按键值 */
enum keyvalue{
    KEY_NONE = 0,
    KEY0_VALUE,  //默认是1
};

/* 函数声明 */
void key_init(void);
int key_getvalue(void);
#endif // !__BSP_KEY

key.c

#include "bsp_key.h"
#include "bsp_gpio.h"
#include "bsp_delay.h"

void key_init()
{
    gpio_pin_config_t key_config;
    /* 初始化IO复用,为GPIO */
    IOMUXC_SetPinMux(IOMUXC_UART1_CTS_B_GPIO1_IO18, 0);
    /* 2、、配置 UART1_CTS_B 的 IO 属性
    *bit 16:0 HYS 关闭
    *bit [15:14]: 11 默认 22K 上拉
    *bit [13]: 1 pull 功能
    *bit [12]: 1 pull/keeper 使能
    *bit [11]: 0 关闭开路输出
    *bit [7:6]: 10 速度 100Mhz
    *bit [5:3]: 000 关闭输出
    *bit [0]: 0 低转换率
    */
    IOMUXC_SetPinConfig(IOMUXC_UART1_CTS_B_GPIO1_IO18, 0xF080);

    /* 初始化这个GPIO为输入 */
    key_config.outputLogic = kGPIO_DigitalInput;
    gpio_init(GPIO1, 18, &key_config);
}

/*
* @description : 获取按键值
* @param : 无
* @return : 0 没有按键按下,其他值:对应的按键值
*/
int key_getvalue(void)
{
    int ret = 0;
    static unsigned char release = 1; /* 按键松开 */
    if((release==1)&&(gpio_pinread(GPIO1, 18) == 0)) /* KEY0 按下 */
    {
        delay(10); /* 延时消抖 */
        release = 0; /* 标记按键按下 */
        if(gpio_pinread(GPIO1, 18) == 0)
        ret = KEY0_VALUE;
    }
    else if(gpio_pinread(GPIO1, 18) == 1) /* KEY0 未按下 */
    {
        ret = 0;
        release = 1; /* 标记按键释放 */
    }
    return ret;
}

main.c

#include "imx6ul.h"
#include "bsp_led.h"
#include "bsp_clk.h"
#include "bsp_delay.h"
#include "bsp_beep.h"
#include "bsp_key.h"
#include "bsp_key.h"
/*
 * @description    : mian函数
 * @param         : 无
 * @return         : 无
 */
int main(void)
{
    clk_enable();       /* 使能所有的时钟          */
    led_init();         /* 初始化led           */
    beep_init();        /* 初始化beep */
    key_init();         /* 初始化key */

    int i = 0;
    int keyvalue = 0;
    unsigned char beep_state = OFF;
    unsigned char led_state = OFF;
    while(1)            /* 死循环              */
    {
        // if(key_getvalue())
        // {
        //  led_on();       /* 打开LED            */
        //  beep_on();
        // }
        // i++;
        // if(i == 50)
        // {
        //  i = 0;
        //  led_off();
        //  beep_off();
        // }
        keyvalue = key_getvalue();

        if(keyvalue)
        {
            switch (keyvalue)
            {
                case KEY0_VALUE:
                    beep_state = !beep_state;
                    beep_switch(beep_state);
                    break;
            }
        }
        i++;
        if(i==50)
        {
            i = 0;
            led_state = !led_state;
            led_switch(LED0, led_state);
        }
        delay(10);
    }
    return 0;
}

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器