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


版权声明:本文为tiange1996原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。