OpenEdv-开源电子网

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

按键问题,循环外按键正常反应,循环内按键无反应

[复制链接]

1

主题

11

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2020-4-8
在线时间
7 小时
发表于 2020-4-22 16:36:59 | 显示全部楼层 |阅读模式
1金钱
主函数:

#include "delay.h"
//#include "sys.h"
#include "usart.h"
#include "timer.h"
#include "wave.h"
#include "Init.h"
//#include "xfsuart.h"
#include "key.h"
#include "wave_yuyin.h"
#include "led.h"
#include "BEEP.h"


int main(void)
{               
        vu8 key=0;                                       
        delay_init();                      
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        uart_init(115200);       
        LED_Init();                                 
        Timer_SRD_Init(5000,7199);
        Wave_SRD_Init();
       
        delay_init();                           
        LED_Init();                                         
        BEEP_Init();                
        KEY_Init();         
        LED0=0;                                                               
         
  while(1)
  {                       
                        delay_ms(200);
                        key=KEY_Scan(0);       
                       
                   if(key == 3)                               
                        {       
                                key = 0;
                                delay_ms(200);
                                LED0=1;
                                while(1)
                                {
                                                wave_yuyin();               
                                                delay_ms(20);
                                                key=KEY_Scan(0);       
                                       
                                        switch(key)                       
                        {                                 
                                case 3:       
                                        BEEP=!BEEP;
                                case 2:
                                        break;
                                case 1:
                                        break;
                               
                        }
                       
                                                if(key == 2)
                                                {
                                                                key = 0;
                                                                LED1=1;
                                                                LED0=0;
                                                          break;
                                                }

                                               
                                                if(key == 2)
                                                {
                                                        delay_ms(20);
                                                        if(key == 0)
                                                        {
                                                                key = 0;
                                                                break;       
                                                        }
                                                }
                                }
                        }               
  }
}



按键程序:

#include "stm32f10x.h"
#include "key.h"
#include "sys.h"
#include "delay.h"

                                                                    

void KEY_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);

        GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_4|GPIO_Pin_3;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
        GPIO_Init(GPIOE, &GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

}

u8 KEY_Scan(u8 mode)
{
        static u8 key_up=1;
        if(mode)key_up=1;  
        if(key_up&&(KEY0==0||KEY1==0||WK_UP==1))
        {
                delay_ms(10);
                key_up=0;
                if(KEY0==0)return KEY0_PRES;
                else if(KEY1==0)return KEY1_PRES;
                else if(WK_UP==1)return WKUP_PRES;
        }else if(KEY0==1&&KEY1==1&&WK_UP==0)key_up=1;
        return 0;
}

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

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2020-4-8
在线时间
7 小时
 楼主| 发表于 2020-4-22 16:38:14 | 显示全部楼层
如程序,按键key_up是进入循环,绿灯亮,程序运行。 按键key_1是退出循环,红灯亮。   但是问题是能进去,出不来
回复

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2020-4-8
在线时间
7 小时
 楼主| 发表于 2020-4-22 16:39:00 | 显示全部楼层
试过把break换成goto,但还是没反应
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2020-4-23 01:16:07 | 显示全部楼层
仿真找问题
回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2020-4-23 09:11:42 | 显示全部楼层
这个按钮教程哪里来的呀.又在误人子弟了.像你这样子写程序,那普通的101键盘怎么搞?还是换一个方法吧.
利用定时器产生一个时期.周期调用一个程序.利用静态变量记录下按钮的状态,及时间.产生按钮按下或者松开的事件.
回复

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2020-4-8
在线时间
7 小时
 楼主| 发表于 2020-4-29 11:37:11 | 显示全部楼层
操作系统 发表于 2020-4-23 09:11
这个按钮教程哪里来的呀.又在误人子弟了.像你这样子写程序,那普通的101键盘怎么搞?还是换一个方法吧.
利用 ...

这个是正点的例程呀,我发现这个KEY_Scan(0)只能使用一次,之后就用不了了,我用KEY1直接判断不用延迟什么的就没问题,然后退出循环后再想进去也进不去,只能用一次的函数,原因现在还是没找到
回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2020-4-30 10:03:02 | 显示全部楼层
学校里教的都是 容易理解但并不实用的方法 .
回复

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2020-4-8
在线时间
7 小时
 楼主| 发表于 2020-4-30 16:39:01 | 显示全部楼层
操作系统 发表于 2020-4-30 10:03
学校里教的都是 容易理解但并不实用的方法 .

可是我学的stm32跟学校教的有啥关系
回复

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2020-4-8
在线时间
7 小时
 楼主| 发表于 2020-4-30 18:07:25 | 显示全部楼层
我目前把按键延迟的去掉了,直接读取KEY1和WK_UP的状态,可以正常使用,因为我内部有delay,且不会出现长按就多次进入之类的情况,但是我还是不懂为什么不能用这个例程的key函数读取,问题在于KEY_Scan(0)的扫描在使用了一次之后,结果一直都是0
回复

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2020-4-8
在线时间
7 小时
 楼主| 发表于 2020-4-30 18:09:26 | 显示全部楼层
我预计可能的原因是key_up在第二次使用扫描函数时,不会再次被赋值为1(static u8 key_up=1 这句话失效),导致按键无效
回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2020-5-6 16:48:06 | 显示全部楼层
尽量不使用DELAY  这种死循环延时函数..这个方法不科学.
回复

使用道具 举报

17

主题

175

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1016
金钱
1016
注册时间
2014-4-7
在线时间
99 小时
发表于 2020-5-8 10:54:56 | 显示全部楼层
建议楼主使用 定时器中断里扫描按键状态,识别出按下和弹起(甚至可以区分长按、短按、双击以及按住后连续触发的状态),将状态入队,程序中读取队列状态即可。

在你没有做出成绩之前,这个世界不会在乎你的自尊。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-28 03:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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