OpenEdv-开源电子网

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

模仿网上程序写了一个按键程序,但返回值一直是0跟1。

[复制链接]

1

主题

3

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2022-4-4
在线时间
3 小时
发表于 2022-5-8 16:57:13 | 显示全部楼层 |阅读模式
1金钱
程序如下:

u16 key_mode(u8 m)//m是模式选择,n是按键选择
{
        static         unsigned char key_state = 0;         // 按键状态变量
        static         unsigned int  key_time = 0;           // 按键计时变量
        unsigned char key1_press,key2_press;
          
        key1_press = KEY1_INPUT;   
       
        //m=0时,按键模式为短按
        if(m==0)
        {        switch(key_state)
                {        case KEY_STATE_0: if(key1_press == KEY_ON)//有按键按下
                                                        {
                                                                key_time=0;
                                                                key_state = KEY_STATE_1;
                                                        }
                                                        ;
                                                        break;
                        case KEY_STATE_1: if(key1_press == KEY_ON)
                                                        {       
                                                                delay_ms(10);
                                                                key_time++;               
                                                                if(key_time        >=SINGLE_KEY_TIME)//软件消抖30ms
                                                                {
                                                                        key_state = KEY_STATE_2;
                                                                }
                                                                else key_state = KEY_STATE_0;//小于30ms判定为误触
                                                                         return 0;
                                                        } ;
                                                        break;
                        case KEY_STATE_2: if(key1_press == KEY_OFF)//按键松开 返回按键值:S_KEY
                                                        {       
                                                                return 5;
                                                                key_state =KEY_STATE_0;
                                                        };       
                                                        break;
                                                }
        }
/********m=1时,按键模式为长按,****/
        if(m==1)
        {        switch(key_state)
                {        case KEY_STATE_0: if(key1_press == KEY_ON)//有按键按下
                                                                {
                                                                        key_time=0;
                                                                        key_state = KEY_STATE_1;
                                                                }
                                                                ;
                                                        break;
                        case KEY_STATE_1: if(key1_press == KEY_ON)
                                                                {       
                                                                        delay_ms(10);
                                                                        key_time++;               
                                                                        if(key_time        >=SINGLE_KEY_TIME)//软件消抖30ms
                                                                {
                                                                        key_state = KEY_STATE_2;
                                                                }
                                                                        else key_state = KEY_STATE_0;//小于30ms判定为误触
                                                                                 return 0;
                                                                } ;
                                                        break;
                        case KEY_STATE_2: if(key1_press == KEY_ON)
                                                                {        delay_ms(10);
                                                                        key_time++;
                                                                        if(key_time >= LONG_KEY_TIME )
                                                                        {
                                                                                key_state = KEY_STATE_3;
                                                                        }else  
                                                                                key_state = KEY_STATE_0;
                                                                };
                                                        break;
                        case KEY_STATE_3:if(key1_press == KEY_OFF)//返回按键值:S_KEY
                                                                {       
                                                                        return 10;
                                                                        key_state =KEY_STATE_0;
                                                                };       
                                                        break;
                                                }
        }

}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2022-5-9 23:58:25 | 显示全部楼层
回复

使用道具 举报

16

主题

426

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2765
金钱
2765
注册时间
2018-11-8
在线时间
438 小时
发表于 2022-5-10 08:05:15 | 显示全部楼层
return 1在哪里没找到
而且你这写的不忍直视 return执行完函数直接跳出去了 不仅放到case里 还写在某些赋值的前面 结果肯定不对啊
回复

使用道具 举报

0

主题

129

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1804
金钱
1804
注册时间
2016-10-23
在线时间
256 小时
发表于 2022-5-10 10:30:37 | 显示全部楼层
仔细走下这里逻辑,KEY_STATE_0  按键后你清了key_time;  之后后会走到这个KEY_STATE_1  下,消抖后 一个key_time++; 然后判断时间,这个时候  key_time是多少,是1,然后 key_state=KEY_STATE_0  ,你看下return 0 是在 判断 key_time 分支 之外,只要key1==KEY_ON,就是说按下就会返回0。
6年嵌入式老玩家 深圳
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-27 07:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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