OpenEdv-开源电子网

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

STM32F103RCT6 让按键功能"失效"怎么做?

[复制链接]

21

主题

131

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
425
金钱
425
注册时间
2019-5-12
在线时间
168 小时
发表于 2019-8-11 17:57:20 | 显示全部楼层 |阅读模式
1金钱
在STM32F103RCT6中用状态机的方法加按键,但是在一段函数中不想让按键起到效果,也就是屏蔽掉按键的功能,应该怎么做?求具体的做法


#define  READ_CHILD_KEY_VALUE   (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0))
#define  READ_HOT_KEY_VALUE     (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1))
#define  READ_COLD_KEY_VALUE    (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2))
#define  READ_VDD_VOL_VALUE     (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_1))
#define  READ_LEAK_WATER_VALUE  (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_2))


static char shot=0;// status hot
static char scold= 0;//status cold
static char child = 0;//童锁


/*让按键"失效"*/
        if((READ_HOT_KEY_VALUE == 1) || (READ_COLD_KEY_VALUE == 1) || (READ_CHILD_KEY_VALUE == 1))
        {
                child = shot = scold = 0;
               
        }
       
        /**************/


我在if中的做法似乎不行


最佳答案

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

去掉判断,或者不做处理,即可。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2019-8-11 17:57:21 | 显示全部楼层
去掉判断,或者不做处理,即可。
回复

使用道具 举报

21

主题

131

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
425
金钱
425
注册时间
2019-5-12
在线时间
168 小时
 楼主| 发表于 2019-8-12 07:21:21 | 显示全部楼层
正点原子 发表于 2019-8-11 17:57
去掉判断,或者不做处理,即可。

原子哥,如果不做处理,会默认执行
回复

使用道具 举报

21

主题

131

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
425
金钱
425
注册时间
2019-5-12
在线时间
168 小时
 楼主| 发表于 2019-8-12 10:21:58 | 显示全部楼层
正点原子 发表于 2019-8-11 17:57
去掉判断,或者不做处理,即可。

但是我如果不做判断会默认认为按键有效,请详细解决办法,谢谢
回复

使用道具 举报

8

主题

182

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
421
金钱
421
注册时间
2017-3-8
在线时间
114 小时
发表于 2019-8-12 10:25:30 | 显示全部楼层
程序进到你不想按键生效的函数里面的时候,加一个标志位 flag,让flag=1; 按键判断那里加一个条件,&& flag!=1;
回复

使用道具 举报

8

主题

182

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
421
金钱
421
注册时间
2017-3-8
在线时间
114 小时
发表于 2019-8-12 10:26:18 | 显示全部楼层
从这个函数出去时候记得把flag置0
回复

使用道具 举报

21

主题

131

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
425
金钱
425
注册时间
2019-5-12
在线时间
168 小时
 楼主| 发表于 2019-8-12 13:36:40 | 显示全部楼层
15937417823 发表于 2019-8-12 10:26
从这个函数出去时候记得把flag置0

如果是进入这段函数的时候判断条件里面加了置1,在函数的结尾加置0才对,如果在判断条件里面是"!=1" 那么从一开始就是置0的吧
回复

使用道具 举报

8

主题

182

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
421
金钱
421
注册时间
2017-3-8
在线时间
114 小时
发表于 2019-8-12 13:44:35 | 显示全部楼层
本来就是在你那个不生效的函数里边改flag值
回复

使用道具 举报

21

主题

131

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
425
金钱
425
注册时间
2019-5-12
在线时间
168 小时
 楼主| 发表于 2019-8-12 14:00:36 | 显示全部楼层
本帖最后由 hejun96 于 2019-8-12 14:03 编辑
15937417823 发表于 2019-8-12 13:44
本来就是在你那个不生效的函数里边改flag值
这样吗?标志位加在判断条件和末尾处?
if((scold==1 && child==1) && Child_Key_On_Flag != 1 )   //按下冷水键和童锁键10s处于排气过程      (问题点???)
{
                /*
                if(child == 1)//为避免长按童锁键和冷水键(排气)进入到长按童锁键(自排水)的状态中,加一个判断的条件,
                {
                        child = 0;//
                        
                        
                        
                        System_Sta.s.Drain_Self_Cmd = FLAG_OFF;//自排水使能清空
                        System_Sta.s.Drain_Self_Flag = FLAG_OFF;//自排水标志位清空
                        
                        
                }
                */
               
               
                System_Sta.s.Vent_Cmd = FLAG_ON;
                System_Sta.s.Vent_Flag = FLAG_ON;
               
                //Save_Data.s.Self_Drain_Flag = 0;//
                //System_Data.Cold_Water_G_Tick = 0;//
                //System_Sta.s.Cold_Water_G_Flag = FLAG_OFF;
               
               
                //System_Data.Normal_Water_H_Tick = 0;               
                //System_Sta.s.Normal_Water_H_Flag = FLAG_OFF;
               
                i2cWriteBuffer1(AT24C02_ADDR,AT24C02_REG,sizeof(SAVE_DATA_UNION),(u8*)&Save_Data);/*写入数据*/
               
                /*
                for (int i = 0; i < sizeof(STA_UNION); i++)
                {
                        System_Sta.sta = 0;
                }
                */               
                //memset((void *)(&System_Data),0,sizeof(DATA_STRUCT));
                //开启蜂鸣器
                if(TIMER_RESET==System_Sta.s.beep_timer_flag)
                {
                        System_Sta.s.beep_timer_flag = TIMER_RUN;
                }
               
                Child_Key_On_Flag = 0;//标志位清0
                while(1);
}
回复

使用道具 举报

8

主题

182

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
421
金钱
421
注册时间
2017-3-8
在线时间
114 小时
发表于 2019-8-12 14:08:09 | 显示全部楼层
这样说吧:a函数是你的按键判断,在a里边判断键值时加上 && flag!=1;b函数是你不需要按键生效的函数,在b函数开头对flag置1,在b函数末尾对flag置0,防止在b函数外部影响按键判断。
回复

使用道具 举报

8

主题

182

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
421
金钱
421
注册时间
2017-3-8
在线时间
114 小时
发表于 2019-8-12 14:09:00 | 显示全部楼层
很简单的操作基本的逻辑,你改完之后自己试一下看效果验证一下。
回复

使用道具 举报

21

主题

131

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
425
金钱
425
注册时间
2019-5-12
在线时间
168 小时
 楼主| 发表于 2019-8-12 17:16:48 | 显示全部楼层
本帖最后由 hejun96 于 2019-8-12 17:24 编辑
15937417823 发表于 2019-8-12 14:09
很简单的操作基本的逻辑,你改完之后自己试一下看效果验证一下。
static unsigned char Child_Press_Flag = 0;
在a函数里面是按键判断,比如说
void Key_Select(void)
{
    if(child == 1 && Child_Press_Flag != 1)    {
         //不清楚的是:这个循环体里面判断的是什么???
    }
}
回复

使用道具 举报

8

主题

182

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
421
金钱
421
注册时间
2017-3-8
在线时间
114 小时
发表于 2019-8-12 17:46:58 | 显示全部楼层
讲道理,没太看懂你表达的什么意思
回复

使用道具 举报

21

主题

131

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
425
金钱
425
注册时间
2019-5-12
在线时间
168 小时
 楼主| 发表于 2019-8-12 19:03:56 | 显示全部楼层
15937417823 发表于 2019-8-12 17:46
讲道理,没太看懂你表达的什么意思

这个判断循环体是我根据您的描述写的,您说的意思应该是定义一个标志位,比方说我定义的是Child_Key_Press_Flag//这个用来判断这个按键有没有被按下

那么我再定义一个函数用来执行这个循环体的表达式void Key_Select(void)
if(child == 1 && Child_Key_Press_Flag != 1)//如果检测到按键按下并且按下的标志位 != 1
则进入按键"失效"???
回复

使用道具 举报

21

主题

131

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
425
金钱
425
注册时间
2019-5-12
在线时间
168 小时
 楼主| 发表于 2019-8-13 11:45:13 | 显示全部楼层
正点原子 发表于 2019-8-11 17:57
去掉判断,或者不做处理,即可。

原子哥,如果去掉判断,会默按键有效,难道是需要用volatile?防止编译器做优化?
回复

使用道具 举报

8

主题

182

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
421
金钱
421
注册时间
2017-3-8
在线时间
114 小时
发表于 2019-8-14 13:50:41 | 显示全部楼层
hejun96 发表于 2019-8-12 19:03
这个判断循环体是我根据您的描述写的,您说的意思应该是定义一个标志位,比方说我定义的是Child_Key_Pres ...

我说让你定义一个标志位,是用着个标志位表示你是否进入了你不需要按键生效的那个函数里边,不是用这个标志位来判断你按键是否按下的。标志位表示进入这个函数了,那么此时不管你的按键是什么状态,都不用往下执行按键函数了。
回复

使用道具 举报

21

主题

131

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
425
金钱
425
注册时间
2019-5-12
在线时间
168 小时
 楼主| 发表于 2019-8-14 20:16:45 | 显示全部楼层
15937417823 发表于 2019-8-14 13:50
我说让你定义一个标志位,是用着个标志位表示你是否进入了你不需要按键生效的那个函数里边,不是用这个标 ...

谢谢,暂时解决了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-28 02:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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