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