MX6U的按键输入

摘要:这部分内容介绍了GPIO口的输入功能,引入了GPIO驱动初始化。这边复制简写一些代码,讲述部分功能。

GPIO驱动的初始化:

代码中的gpio.c文件

//gpio.h
//在头文件中首先枚举GPIO的输入输出方向,输入设置为0,输出设置为1.
typedef enum _gpio_pin_direction
{
    kGPIO_DigitalInput = 0U,  		/* 输入 */
    kGPIO_DigitalOutput = 1U, 		/* 输出 */
} gpio_pin_direction_t;

//设置一个结构体变量表示输入输出方向和电平。
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);


//gpio.c
//初始化GPIO,base为GPIO的组别,pin为IO口。例如:GPIO03_IO01中,base为03,pin为01.
//第三个参数为结构体变量。
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);      
	 //把对应IO的电平移动到bit0,与上0x1,将其他位清零,与上1,得出读出的电平是0还是1。
 }
//指定GPIO的电平,设置电平高低。
void gpio_pinwrite(GPIO_Type *base, int pin, int value)
{
	 if (value == 0U)
	 {
		 base->DR &= ~(1U << pin); /* 输出低电平 */
	 }
	 else
	 {
		 base->DR |= (1U << pin); /* 输出高电平 */
	 }
}

这边对GPIO初始化后,按键的代码key.c代码中:

//按键初始化
void key_init(void)
{	
	gpio_pin_config_t key_config;  //结构体变量,通过key_config来调用结构体中参数。 
	
	/* 1、初始化IO复用, 复用为GPIO1_IO18 */
	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 低转换率
	 */
    //0x1111 0100 0000
	IOMUXC_SetPinConfig(IOMUXC_UART1_CTS_B_GPIO1_IO18,0xF080);
	
	/* 3、初始化GPIO */
	//GPIO1->GDIR &= ~(1 << 18);	/* GPIO1_IO18设置为输入 */	
	key_config.direction = kGPIO_DigitalInput;
	gpio_init(GPIO1,18, &key_config);
	
}

/*
 * @description	: 获取按键值 
 * @param 		: 无
 * @return 		: 0 没有按键按下,其他值:对应的按键值
 */
int key_getvalue(void)
{
	int ret = 0;  //按键值初始值为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;   //ret = 1
	}
	else if(gpio_pinread(GPIO1, 18) == 1) //没有按下
	{
		ret = 0;
		release = 1; 	/* 标记按键释放 */
	}

	return ret;	
}

 最后通过在main.c函数中的代码来控制:(截取)

while(1)			
	{	
		keyvalue = key_getvalue();  //获取ret知道是否按下
		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;
}

以此按键来控制蜂鸣器的发声。

posted @ 2022-11-06 21:29  祈愿树下  阅读(24)  评论(0编辑  收藏  举报
// 侧边栏目录 // https://blog-static.cnblogs.com/files/douzujun/marvin.nav.my1502.css