Files
CH32V208WBU6/DRV/drv_key.c
T

111 lines
2.5 KiB
C
Raw Normal View History

2023-06-20 23:41:10 +08:00
/*
* drv_key.c
*
* Created on: Jun 11, 2023
* Author: gxms0
*/
#include "drv_key.h"
2024-02-29 00:45:47 +08:00
KEY_t key1;
KEY_t key2;
KEY_t key3;
KEY_t key4;
2023-06-20 23:41:10 +08:00
2024-02-29 00:45:47 +08:00
void key_init(void)
2023-06-20 23:41:10 +08:00
{
2024-02-29 00:45:47 +08:00
key_config(&key1, GPIOD, GPIO_Pin_2, 0);
key_config(&key2, GPIOB, GPIO_Pin_3, 0);
key_config(&key3, GPIOB, GPIO_Pin_4, 0);
key_config(&key4, GPIOB, GPIO_Pin_5, 0);
}
2023-06-20 23:41:10 +08:00
2024-02-29 00:45:47 +08:00
void key_thread(void)
{
key_update(&key1);
key_update(&key2);
key_update(&key3);
key_update(&key4);
}
2023-06-20 23:41:10 +08:00
2024-02-29 00:45:47 +08:00
void key_config(KEY_ptr ptr, GPIO_TypeDef *GPIO, uint32_t Pin, uint8_t type)
{
ptr->GPIO = GPIO;
ptr->Pin = Pin;
2023-06-20 23:41:10 +08:00
2024-02-29 00:45:47 +08:00
ptr->type = type;
2023-06-20 23:41:10 +08:00
2024-02-29 00:45:47 +08:00
ptr->delay = 20;//20ms
2023-06-20 23:41:10 +08:00
2024-02-29 00:45:47 +08:00
ptr->state = release;//定义按下是的电平,如果按下时高电平,赋值0x01,如果按下时,电平信号为低电平,那么赋值为0x00;
ptr->last = release;
ptr->current = release;
2023-06-20 23:41:10 +08:00
2024-02-29 00:45:47 +08:00
//初始化IO口
GPIO_InitTypeDef GPIO_InitStructure = {0};
uint32_t RCC_Periph;
2023-06-20 23:41:10 +08:00
2024-02-29 00:45:47 +08:00
if(ptr->GPIO == GPIOA)RCC_Periph = RCC_APB2Periph_GPIOA;
else if(ptr->GPIO == GPIOB)RCC_Periph = RCC_APB2Periph_GPIOB;
else if(ptr->GPIO == GPIOC)RCC_Periph = RCC_APB2Periph_GPIOC;
else if(ptr->GPIO == GPIOD)RCC_Periph = RCC_APB2Periph_GPIOD;
else if(ptr->GPIO == GPIOE)RCC_Periph = RCC_APB2Periph_GPIOE;
2023-06-20 23:41:10 +08:00
2024-02-29 00:45:47 +08:00
RCC_APB2PeriphClockCmd(RCC_Periph, ENABLE);
GPIO_InitStructure.GPIO_Pin = ptr->Pin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(ptr->GPIO, &GPIO_InitStructure);
2023-06-20 23:41:10 +08:00
}
2024-02-29 00:45:47 +08:00
void key_update(KEY_ptr ptr)
2023-06-20 23:41:10 +08:00
{
2024-02-29 00:45:47 +08:00
uint8_t gpio_bit = (GPIO_ReadInputDataBit(ptr->GPIO,ptr->Pin))?(0x01):(0x00);
switch(ptr->type)
{
case 0x00:{
ptr->current = (gpio_bit)?(release):(pressed);//如果是0,认为是按下
}break;
case 0x01:{
ptr->current = (gpio_bit)?(pressed):(release);//如果是1,认为是按下
}break;
}
if((get_ticks_usec() - ptr->tick ) >= (ptr->delay * 1000))
{
ptr->tick = get_ticks_usec();
if(ptr->state == release)//state::release
{
if(ptr->current != ptr->state)
{
if(ptr->last == ptr->state)
{
ptr->state = pressed;
}
}
}
else//state::press
{
if(ptr->current != ptr->state)
{
if(ptr->last == ptr->state)
{
ptr->state = release;
}
}
}
ptr->last = ptr->current;
}
2023-06-20 23:41:10 +08:00
}