349 lines
7.2 KiB
C
Raw Permalink Normal View History

//<2F><><EFBFBD><EFBFBD> FIFO <20><>
2021-08-04 10:46:24 +08:00
#include "adc.h"
2021-08-04 10:46:24 +08:00
#include "key.h"
#define DIGITAL_KEY_NUM 3 //<2F><><EFBFBD><EFBFBD><EFBFBD>źŰ<C5BA><C5B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define ADC_KEY_NUM 4 //ģ<><C4A3><EFBFBD>źŰ<C5BA><C5B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define KEY_COUNT (DIGITAL_KEY_NUM + ADC_KEY_NUM)
//ʹ<><CAB9> GPIO ʱ<><CAB1>
#define ALL_KEY_GPIO_CLK_ENABLE() \
{ \
__HAL_RCC_GPIOE_CLK_ENABLE(); \
__HAL_RCC_GPIOC_CLK_ENABLE(); \
__HAL_RCC_GPIOD_CLK_ENABLE(); \
};
typedef struct
{
GPIO_TypeDef *gpio;
uint16_t pin;
} X_GPIO_T;
static const X_GPIO_T s_gpio_list[DIGITAL_KEY_NUM] = {
{GPIOE, GPIO_PIN_3}, //KEY1
{GPIOC, GPIO_PIN_5}, //KEY2
{GPIOD, GPIO_PIN_10} //JOY_OK
};
static volatile KEY_T s_tBtn[KEY_COUNT] = {0};
static volatile KEY_FIFO_T s_tKey; //<2F><><EFBFBD><EFBFBD> FIFO <20><><EFBFBD><EFBFBD>
static volatile is_key_clear = 1;
static void InitKeyVar(void);
static void InitKeyDigital(void);
static void DetectKey(uint8_t i);
static uint8_t KeyPinActive(uint8_t _id)
{
if (_id < DIGITAL_KEY_NUM)
{
uint8_t level;
if ((s_gpio_list[_id].gpio->IDR & s_gpio_list[_id].pin) == 0)
return 1;
else
return 0;
}
else if (_id < DIGITAL_KEY_NUM + ADC_KEY_NUM)
{
switch (_id)
{
case JOY_U:
{
if (ADC_Get_PC0() < 0.01)
return 1;
else
return 0;
}
break;
case JOY_D:
{
if (ADC_Get_PC0() > 3.20)
return 1;
else
return 0;
}
break;
case JOY_L:
{
if (ADC_Get_PC1() < 0.01)
return 1;
else
return 0;
}
break;
case JOY_R:
{
if (ADC_Get_PC1() > 3.20)
return 1;
else
return 0;
}
}
}
}
static uint8_t IsKeyDownFunc(uint8_t _id)
{
uint8_t count = 0;
uint8_t save = UINT8_MAX;
//<2F>ж<EFBFBD><D0B6>м<EFBFBD><D0BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (uint8_t i = 0; i < KEY_COUNT; i++)
{
if (KeyPinActive(i))
{
count++;
save = i;
}
}
if (count == 1 && save == _id)
return 1; //ֻ<>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ч
return 0;
}
2021-08-04 10:46:24 +08:00
/**
* @brief <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2021-08-04 10:46:24 +08:00
*/
void KEY_Init(void)
{
InitKeyVar(); //<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
InitKeyDigital(); //<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>ְ<EFBFBD><D6B0><EFBFBD>
}
static void InitKeyDigital(void)
{
GPIO_InitTypeDef gpio_init;
ALL_KEY_GPIO_CLK_ENABLE();
gpio_init.Mode = GPIO_MODE_INPUT;
gpio_init.Pull = GPIO_PULLUP;
gpio_init.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
for (uint8_t i = 0; i < DIGITAL_KEY_NUM; i++)
{
gpio_init.Pin = s_gpio_list[i].pin;
HAL_GPIO_Init(s_gpio_list[i].gpio, &gpio_init);
}
}
static void InitKeyVar(void)
{
s_tKey.Read = 0;
s_tKey.Write = 0;
//ȱʡֵ
for (uint8_t i = 0; i < KEY_COUNT; i++)
{
s_tBtn[i].LongTime = KEY_LONG_TIME; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ 0 <20><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E2B3A4><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
s_tBtn[i].Count = KEY_FILTER_TIME / 2; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>˲<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
s_tBtn[i].State = 0; //<2F><><EFBFBD><EFBFBD>ȱʡ״̬<D7B4><CCAC>0 Ϊδ<CEAA><CEB4><EFBFBD><EFBFBD>
s_tBtn[i].RepeatSpeed = 0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٶȣ<D9B6>0 <20><>ʾ<EFBFBD><CABE>֧<EFBFBD><D6A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
s_tBtn[i].RepeatCount = 0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
//ҡ<><D2A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ң<EFBFBD>֧<EFBFBD>ֳ<EFBFBD><D6B3><EFBFBD> 1 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>
2021-10-06 00:43:45 +08:00
KEY_SetKeyParam(JOY_U, 50, 6);
KEY_SetKeyParam(JOY_D, 50, 6);
KEY_SetKeyParam(JOY_L, 50, 6);
KEY_SetKeyParam(JOY_R, 50, 6);
2021-08-04 10:46:24 +08:00
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵѹ<EFBFBD><EFBFBD><EFBFBD> FIFO<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
* @param _KeyCode: <EFBFBD><EFBFBD>ֵ
*/
void KEY_PutKey(uint8_t _KeyCode)
{
s_tKey.Buf[s_tKey.Write] = _KeyCode;
if (++s_tKey.Write >= KEY_FIFO_SIZE)
{
s_tKey.Write = 0;
}
}
/**
* @brief <EFBFBD>Ӱ<EFBFBD><EFBFBD><EFBFBD> FIFO <EFBFBD><EFBFBD>ȡһ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
* @retval <EFBFBD><EFBFBD>ֵ
2021-08-04 10:46:24 +08:00
*/
uint8_t KEY_GetKey(void)
{
if (s_tKey.Read == s_tKey.Write)
2021-08-04 10:46:24 +08:00
{
return KEY_NONE;
}
else
{
uint8_t ret = s_tKey.Buf[s_tKey.Read];
2021-08-04 10:46:24 +08:00
if (++s_tKey.Read >= KEY_FIFO_SIZE)
s_tKey.Read = 0;
2021-08-04 10:46:24 +08:00
if (
ret == KEY1_UP ||
ret == KEY2_UP ||
ret == JOY_OK_UP ||
ret == JOY_U_UP ||
ret == JOY_D_UP ||
ret == JOY_L_UP ||
ret == JOY_R_UP)
{
if (is_key_clear)
{
is_key_clear = 0;
return KEY_NONE;
}
2021-08-04 10:46:24 +08:00
}
is_key_clear = 0;
return ret;
2021-08-04 10:46:24 +08:00
}
}
/**
* @brief <EFBFBD>Ӱ<EFBFBD><EFBFBD><EFBFBD> FIFO <EFBFBD><EFBFBD>ȡһ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD>ֵ
*/
uint8_t KEY_GetKeyWait(void)
{
uint8_t key = KEY_NONE;
2021-08-04 10:46:24 +08:00
while (key == KEY_NONE)
key = KEY_GetKey();
return key;
}
/**
* @brief <EFBFBD><EFBFBD>ȡij<EFBFBD><EFBFBD>״̬
* @param _ucKeyID: <EFBFBD><EFBFBD><EFBFBD><EFBFBD> ID
* @retval 1 <EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD>£<EFBFBD>0 <EFBFBD><EFBFBD>ʾδ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
uint8_t KEY_GetKeyState(KEY_ID_E _ucKeyID)
{
return s_tBtn[_ucKeyID].State;
}
/**
* @brief <EFBFBD>ȴ<EFBFBD><EFBFBD>ض<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param _ucKeyID: <EFBFBD><EFBFBD><EFBFBD><EFBFBD> ID
*/
void KEY_WaitKey(KEY_ID_E _ucKeyID)
{
while (KEY_GetKeyState(_ucKeyID) != 1)
;
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD>ð<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param _ucKeyID: <EFBFBD><EFBFBD><EFBFBD><EFBFBD> ID
* @param _LongTime: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>ʱ<EFBFBD><EFBFBD>
* @param _RepeatSpeed: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٶ<EFBFBD>
*/
void KEY_SetKeyParam(uint8_t _ucKeyID, uint16_t _LongTime, uint8_t _RepeatSpeed)
{
s_tBtn[_ucKeyID].LongTime = _LongTime; //<2F><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1> 0 <20><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E2B3A4><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
s_tBtn[_ucKeyID].RepeatSpeed = _RepeatSpeed; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٶȣ<D9B6>0 <20><>ʾ<EFBFBD><CABE>֧<EFBFBD><D6A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
s_tBtn[_ucKeyID].RepeatCount = 0;
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD>հ<EFBFBD><EFBFBD><EFBFBD> FIFO
*/
void KEY_ClearKey(void)
{
s_tKey.Read = s_tKey.Write;
is_key_clear = 1;
}
static void DetectKey(uint8_t i)
{
KEY_T *pBtn;
pBtn = &s_tBtn[i];
if (IsKeyDownFunc(i))
{
if (pBtn->Count < KEY_FILTER_TIME)
{
pBtn->Count = KEY_FILTER_TIME;
}
else if (pBtn->Count < 2 * KEY_FILTER_TIME)
2021-08-04 10:46:24 +08:00
{
pBtn->Count++;
}
else
{
if (pBtn->State == 0)
{
pBtn->State = 1;
KEY_PutKey((uint8_t)(3 * i + 1));
}
2021-08-04 10:46:24 +08:00
if (pBtn->LongTime > 0)
{
if (pBtn->LongCount < pBtn->LongTime)
{
if (++pBtn->LongCount == pBtn->LongTime)
{
KEY_PutKey((uint8_t)(3 * i + 3));
}
}
else
{
if (pBtn->RepeatSpeed > 0)
{
if (++pBtn->RepeatCount >= pBtn->RepeatSpeed)
{
pBtn->RepeatCount = 0;
KEY_PutKey((uint8_t)(3 * i + 1));
}
}
}
}
2021-08-04 10:46:24 +08:00
}
}
else
{
if (pBtn->Count > KEY_FILTER_TIME)
{
pBtn->Count = KEY_FILTER_TIME;
}
else if (pBtn->Count != 0)
{
pBtn->Count--;
}
else
{
if (pBtn->State == 1)
{
pBtn->State = 0;
KEY_PutKey((uint8_t)(3 * i + 2));
}
}
2021-08-10 15:02:33 +08:00
pBtn->LongCount = 0;
pBtn->RepeatCount = 0;
}
2021-08-04 10:46:24 +08:00
}
/**
* @brief ɨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>а<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD> SysTick <EFBFBD>ж<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Եĵ<EFBFBD><EFBFBD>ã<EFBFBD>10ms һ<EFBFBD><EFBFBD>
2021-08-04 10:46:24 +08:00
*/
void KEY_Scan10ms(void)
2021-08-04 10:46:24 +08:00
{
for (uint8_t i = 0; i < KEY_COUNT; i++)
DetectKey(i);
2021-08-04 10:46:24 +08:00
}