写一个stm32f103c8t6标准库的五个按键的扫描函数,要求:当按键按下之后再弹起来才算一次
时间: 2023-06-03 20:03:58 浏览: 146
五向按键_keil_key_ThisIsIt_五向按键接口_stm32f4_
5星 · 资源好评率100%
好的,我可以提供一个简单的五键扫描函数的代码示例,如下:
```c
#include "stm32f10x.h"
#define KEY_UP GPIO_Pin_0
#define KEY_DOWN GPIO_Pin_1
#define KEY_LEFT GPIO_Pin_2
#define KEY_RIGHT GPIO_Pin_3
#define KEY_OK GPIO_Pin_4
void init_key_gpio(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = KEY_UP | KEY_DOWN | KEY_LEFT | KEY_RIGHT | KEY_OK;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
uint8_t key_scan(void)
{
static uint8_t key_up_last = 1;
static uint8_t key_down_last = 1;
static uint8_t key_left_last = 1;
static uint8_t key_right_last = 1;
static uint8_t key_ok_last = 1;
uint8_t key_code = 0;
if (GPIO_ReadInputDataBit(GPIOA, KEY_UP) == 0 && key_up_last == 1)
{
key_up_last = 0;
key_code = 1;
}
else if (GPIO_ReadInputDataBit(GPIOA, KEY_UP) == 1)
{
key_up_last = 1;
}
if (GPIO_ReadInputDataBit(GPIOA, KEY_DOWN) == 0 && key_down_last == 1)
{
key_down_last = 0;
key_code = 2;
}
else if (GPIO_ReadInputDataBit(GPIOA, KEY_DOWN) == 1)
{
key_down_last = 1;
}
if (GPIO_ReadInputDataBit(GPIOA, KEY_LEFT) == 0 && key_left_last == 1)
{
key_left_last = 0;
key_code = 3;
}
else if (GPIO_ReadInputDataBit(GPIOA, KEY_LEFT) == 1)
{
key_left_last = 1;
}
if (GPIO_ReadInputDataBit(GPIOA, KEY_RIGHT) == 0 && key_right_last == 1)
{
key_right_last = 0;
key_code = 4;
}
else if (GPIO_ReadInputDataBit(GPIOA, KEY_RIGHT) == 1)
{
key_right_last = 1;
}
if (GPIO_ReadInputDataBit(GPIOA, KEY_OK) == 0 && key_ok_last == 1)
{
key_ok_last = 0;
key_code = 5;
}
else if (GPIO_ReadInputDataBit(GPIOA, KEY_OK) == 1)
{
key_ok_last = 1;
}
return key_code;
}
```
这个函数实现了对五个按键(KEY_UP、KEY_DOWN、KEY_LEFT、KEY_RIGHT、KEY_OK)的扫描,并通过返回一个键码来表明哪一个按键被按下,其中键码的值表示如下:
- 1:KEY_UP
- 2:KEY_DOWN
- 3:KEY_LEFT
- 4:KEY_RIGHT
- 5:KEY_OK
需要说明的是,这个函数适用于单次按下扫描,即同一个按键需要再次弹起后才能再次触发。如果需要实现连续触发,则需要更改代码。此外,使用这个函数前需要先调用 `init_key_gpio()` 函数来初始化按键的 GPIO 引脚。
阅读全文