GD32F405RGT6独立按键检测--状态机(库函数)

GD32F405RGT6独立按键检测–状态机(库函数)

我李某人话不多说,直接上代码,哈哈哈
1.key.h文件

#ifndef _KEY_H_
#define _KEY_H_

#include "gd32f4xx.h"

#define KEY1			GPIO_PIN_1

#define KEY2			GPIO_PIN_13


/*******************************************
		
*******************************************/
#define KEYDOWN			1
#define KEYUP			0

#define KEY1DOWN		3
#define KEY1UP			4
#define KEY1DOUBLE		5
#define KEY1DOWNLONG	101

#define KEY2DOWN		6
#define KEY2UP			7
#define KEY2DOUBLE		8
#define KEY2DOWNLONG	102

#define KEYNONE			255

/*******************************************
		
*******************************************/
#define KEYDOWN_LONG_TIME		20 

extern void Key_Init(void);

_Bool KeyScan(uint32_t gpio_periph, unsigned int NUM);

extern unsigned char Keyboard(void);

#endif

2.key.c文件

#include "gd32f4xx.h"
#include "systick.h"
#include "key.h"


#include <stdarg.h>
#include <string.h>
#include <stdio.h>

void Key_Init(void)
{
    rcu_periph_clock_enable(RCU_GPIOC);//
	 rcu_periph_clock_enable(RCU_GPIOA);//
	
    gpio_mode_set(GPIOC, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, GPIO_PIN_13);
    gpio_output_options_set(GPIOC, GPIO_PUPD_NONE, GPIO_OSPEED_50MHZ, GPIO_PIN_13);//
	
    gpio_mode_set(GPIOC, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, GPIO_PIN_1);
    gpio_output_options_set(GPIOC, GPIO_PUPD_NONE, GPIO_OSPEED_50MHZ, GPIO_PIN_1);//
}
_Bool KeyScan(uint32_t gpio_periph, unsigned int NUM)
{
	if(gpio_periph == GPIOC)
	{
		if(!gpio_input_bit_get(GPIOC, NUM))	
		{
			return KEYDOWN;
		}
		else									
		{
			return KEYUP;
		}
	}
	else if(gpio_periph == GPIOA)
	{
		if(!gpio_input_bit_get(GPIOA, NUM))
		{
			return KEYDOWN;
		}
		else									
		{
			return KEYUP;
		}
	}
	
	return KEYUP;								
}


unsigned char Keyboard(void)
{
	static unsigned int keyBusyFlag = 0;									
	static unsigned char keyCount = 0;									
	unsigned char timeOut = 15;												
	
	if(KeyScan(GPIOC, KEY1) == KEYDOWN && !(keyBusyFlag & (~(1 << 1))))		
	{
		keyBusyFlag |= 1 << 1;											
		if(++keyCount >= KEYDOWN_LONG_TIME)
			keyCount = KEYDOWN_LONG_TIME;
		
		return KEYNONE;
	}
	else if(KeyScan(GPIOC, KEY1) == KEYUP && keyBusyFlag & (1 << 1))		
	{
		keyBusyFlag &= ~(1 << 1);												
		if(keyCount == KEYDOWN_LONG_TIME)
		{
			keyCount = 0;
			return KEY1DOWNLONG;
		}
		else
		{
			keyCount = 0;
			while(--timeOut)
			{
				delay_1ms(10);
				
				if(KeyScan(GPIOC, KEY1) == KEYDOWN)
				{
					while(KeyScan(GPIOC, KEY1) == KEYDOWN)
						delay_1ms(5);
					
					return KEY1DOUBLE;
				}
				
			}
			return KEY1DOWN;
		}
	}
	
	if(KeyScan(GPIOC, KEY2) == KEYDOWN && !(keyBusyFlag & (~(1 << 2))))		
	{
		keyBusyFlag |= 1 << 2;											
		
		if(++keyCount >= KEYDOWN_LONG_TIME)
			keyCount = KEYDOWN_LONG_TIME;
		
		return KEYNONE;
	}
	else if(KeyScan(GPIOC, KEY2) == KEYUP && keyBusyFlag & (1 << 2))		
	{
		keyBusyFlag &= ~(1 << 2);											
		
		if(keyCount == KEYDOWN_LONG_TIME)
		{
			keyCount = 0;
			return KEY2DOWNLONG;
		}
		else
		{
			keyCount = 0;
			while(--timeOut)
			{
				delay_1ms(10);
				
				if(KeyScan(GPIOC, KEY2) == KEYDOWN)
				{
					while(KeyScan(GPIOC, KEY2) == KEYDOWN)
						delay_1ms(5);
					
					return KEY2DOUBLE;
				}
				
			}
			return KEY2DOWN;
		}
	}
	
	keyBusyFlag = 0;
	keyCount = 0;
	return KEYNONE;
}



3.mian.c文件

在这里插入图片描述

附上完整工程链接(免费)独立按键状态机https://download.csdn.net/download/tiange1996/84405438

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

修才生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值