OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 161|回复: 8

图中的4个按键,只有3个IO,如何实现按键检测

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2024-5-27
在线时间
2 小时
发表于 2025-4-8 10:43:50 | 显示全部楼层 |阅读模式
2金钱
    在学习51单片机,从别人的产品上弄的按键电路,这4个按键怎么扫描检测?怎么按下亮下熄灭,求大神附上代码谢谢。使用豆包这个AI也解决不了
3853AAD458D49EA1346E36FE8830A633.png

最佳答案

查看完整内容[请看2#楼]

我用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(); ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
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;
        }
}


回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165463
金钱
165463
注册时间
2010-12-1
在线时间
2114 小时
发表于 2025-4-12 21:25:38 | 显示全部楼层
自己想想,不难
回复

使用道具 举报

12

主题

3380

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8607
金钱
8607
注册时间
2020-5-11
在线时间
4035 小时
发表于 2025-4-13 08:53:16 | 显示全部楼层
先了解一下“键盘扫描”
专治疑难杂症
回复

使用道具 举报

12

主题

3380

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8607
金钱
8607
注册时间
2020-5-11
在线时间
4035 小时
发表于 2025-4-13 10:03:20 | 显示全部楼层
傲游截图20250413100257.jpg
专治疑难杂症
回复

使用道具 举报

0

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
484
金钱
484
注册时间
2020-5-26
在线时间
120 小时
发表于 2025-4-13 12:17:04 | 显示全部楼层
感觉直接ADC检测按键更方便些
回复

使用道具 举报

0

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2019-11-9
在线时间
13 小时
发表于 2025-4-15 10:09:32 | 显示全部楼层
这个不难呢,想想P2.4和P2.5接电源和接地时会分别有几种逻辑关系产生?
回复

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2020-11-9
在线时间
5 小时
发表于 2025-4-16 14:48:54 | 显示全部楼层

按钮硬件原理图,结合程序参考

本帖最后由 yfpc2006 于 2025-4-16 14:49 编辑

D:\ 1744785794589.jpg
回复

使用道具 举报

13

主题

176

帖子

0

精华

高级会员

Rank: 4

积分
821
金钱
821
注册时间
2018-12-19
在线时间
168 小时
发表于 2025-4-17 22:53:28 | 显示全部楼层

去许愿池许愿还要扔个硬币吧
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-4-25 03:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表