新手上路
- 积分
- 31
- 金钱
- 31
- 注册时间
- 2020-11-9
- 在线时间
- 5 小时
|
发表于 2025-4-8 10:43:51
|
显示全部楼层
我用STM32G030F6P6两个IO,实现4个按钮功能都很好实现,楼主这个更简单了一些,
uint8_t OUT1_Flag = 0, OUT2_Flag = 0, OUT3_Flag = 0, OUT4_Flag = 0;
uint8_t K1_Down_Flag = 0, K2_Down_Flag = 0, K3_Down_Flag = 0, K4_Down_Flag = 0; //KEY1,2,3,4按下标志
void KEY_IO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0}; //定义一个设置GPIO的变量
__HAL_RCC_GPIOB_CLK_ENABLE(); //使能时钟
__HAL_RCC_GPIOC_CLK_ENABLE(); //使能时钟
GPIO_InitStruct.Pin = K1_2_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT; //输入模式
GPIO_InitStruct.Pull = GPIO_NOPULL; //弱下拉
HAL_GPIO_Init(K1_2_GROUP, &GPIO_InitStruct);
GPIO_InitStruct.Pin = K3_4_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT; //输入模式
GPIO_InitStruct.Pull = GPIO_NOPULL; //弱下拉
HAL_GPIO_Init(K3_4_GROUP, &GPIO_InitStruct);
}
void K1_IO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = K1_2_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT; //输入模式
GPIO_InitStruct.Pull = GPIO_PULLDOWN; //弱下拉开
HAL_GPIO_Init(K1_2_GROUP, &GPIO_InitStruct);
}
void K2_IO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = K1_2_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT; //输入模式
GPIO_InitStruct.Pull = GPIO_PULLUP; //弱上拉开
HAL_GPIO_Init(K1_2_GROUP, &GPIO_InitStruct);
}
void K3_IO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = K3_4_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT; //输入模式
GPIO_InitStruct.Pull = GPIO_PULLDOWN; //弱下拉开
HAL_GPIO_Init(K3_4_GROUP, &GPIO_InitStruct);
}
void K4_IO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = K3_4_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT; //输入模式
GPIO_InitStruct.Pull = GPIO_PULLUP; //弱上拉开
HAL_GPIO_Init(K3_4_GROUP, &GPIO_InitStruct);
}
//按键输出
void KEY_TO_OUT(void)
{
K1_TO_OUT1();
K2_TO_OUT2();
K3_TO_OUT3();
K4_TO_OUT4();
}
void K1_TO_OUT1(void)
{
K1_IO_Init(); //下拉
if(K1_2_IN_STA == 1) //K1按下
{
Delay_Ms(5);
if(K1_2_IN_STA == 1) //K1按下
{
if(OUT1_Flag == 0)
{
OUT1_Flag = 1;
if(OUT1_IN_STA == 0)
{
OUT1_ON;
u1_printf("OUT1_ON ");
OUT1_State(); //发送当前开关状态
}
else
{
OUT1_OFF;
OUT1_State(); //发送当前开关状态
u1_printf("OUT1_OFF ");
}
}
}
}
else
{
OUT1_Flag = 0;
}
}
void K2_TO_OUT2(void)
{
K2_IO_Init();//上拉
if(K1_2_IN_STA == 0) //K2按下
{
Delay_Ms(5);
if(K1_2_IN_STA == 0) //K2按下
{
if(OUT2_Flag == 0)
{
OUT2_Flag = 1;
if(OUT2_IN_STA == 0)
{
OUT2_ON;
OUT2_State(); //发送当前开关状态
u1_printf("OUT2_ON ");
}
else
{
OUT2_OFF;
OUT2_State(); //发送当前开关状态
u1_printf("OUT2_OFF ");
}
}
}
}
else
{
OUT2_Flag = 0;
}
}
void K3_TO_OUT3(void)
{
K3_IO_Init();//下拉
if(K3_4_IN_STA == 1) //K2按下
{
Delay_Ms(5);
if(K3_4_IN_STA == 1) //K2按下
{
if(OUT3_Flag == 0)
{
OUT3_Flag = 1;
if(OUT3_IN_STA == 0)
{
OUT3_ON;
OUT3_State(); //发送当前开关状态
u1_printf("OUT3_ON ");
}
else
{
OUT3_OFF;
OUT3_State(); //发送当前开关状态
u1_printf("OUT3_OFF ");
}
}
}
}
else
{
OUT3_Flag = 0;
}
}
void K4_TO_OUT4(void)
{
K4_IO_Init();//上拉
if(K3_4_IN_STA == 0) //K2按下
{
Delay_Ms(5);
if(K3_4_IN_STA == 0) //K2按下
{
if(OUT4_Flag == 0)
{
OUT4_Flag = 1;
if(OUT4_IN_STA == 0)
{
OUT4_ON;
OUT4_State(); //发送当前开关状态
u1_printf("OUT4_ON ");
}
else
{
OUT4_OFF;
OUT4_State(); //发送当前开关状态
u1_printf("OUT4_OFF ");
}
}
}
}
else
{
OUT4_Flag = 0;
}
}
|
|