【STM32F4探索者】按键输入实验按键不能正常识别问题

2019-07-20 05:40发布

1.首先上代码
/*****************************main.c*****************************/
int main(void)
{
        delay_init(168);
        led_init();
        beep_init();
        key_init();
               
        while(1)       
        {
                unsigned char key;
                key = key_scan(1);                        //不能连续按键
               

                switch(key)
                {
                        case 1:
                        {
                                LED_blue_on;          //DS1
                                LED_white_off;        //DS0
                                BEEP_OFF;
                        }break;
                        case 2:
                        {
                                static unsigned char key_cnt;
                                key_cnt++;
                                if(key_cnt%2 == 0)
                                {
                                        LED_blue_on;
                                        LED_white_on;
                                        BEEP_OFF;
                                }
                                else
                                {
                                        LED_blue_off;
                                        LED_white_off;
                                        BEEP_OFF;
                                }
                        }break;
                        case 3:
                        {
                                LED_white_on;
                                LED_blue_off;
                                BEEP_OFF;
                        }break;
                        case 4:
                        {
                                LED_blue_off;
                                LED_white_off;
                                BEEP_ON;
                        }break;
                        default:break;
                }
        }
}
/*****************************key.c*****************************/
void key_init(void)
{
        //使能外设时钟
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);

        //初始化按键WAKE_UP
        GPIO_InitTypeDef* KEY_wake_up;
        KEY_wake_up->GPIO_Mode = GPIO_Mode_IN;
        KEY_wake_up->GPIO_Pin = GPIO_Pin_0;
        KEY_wake_up->GPIO_PuPd = GPIO_PuPd_DOWN;
        KEY_wake_up->GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, KEY_wake_up);

        //初始化按键0,按键1和按键2
        GPIO_InitTypeDef* KEY_0_1_2;
        KEY_0_1_2->GPIO_Mode = GPIO_Mode_IN;
        KEY_0_1_2->GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;
        KEY_0_1_2->GPIO_PuPd = GPIO_PuPd_UP;
        KEY_0_1_2->GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOE, KEY_0_1_2);
}

unsigned char key_scan(unsigned char mode)
{
        static unsigned char key_value;
        static unsigned char KEY_set = 1;
        if(mode == 0)                                //不能连续按键
        {
                KEY_set = 1;
        }
        if(KEY_set&&((KEY_0_read==0)||(KEY_1_read==0)||(KEY_2_read==0)||(KEY_wakeup_read==1)))
        {
                delay_ms(10);                //按键消抖
                KEY_set = 0;
                if(KEY_0_read==0)
                {
                        key_value = key_0_set;                //按键0按下
                        return key_value;
                }
                else if(KEY_1_read==0)
                {
                        key_value = key_1_set;                //按键1按下
                        return key_value;
                }
                else if(KEY_2_read==0)
                {
                        key_value = key_2_set;                //按键2按下
                        return key_value;
                }
                else if(KEY_wakeup_read==1)
                {
                        key_value = key_wakeup_set;                //按键WAKE_UP按下
                        return key_value;
                }
        }
        else
        {
                KEY_set = 1;
                key_value = 0;
        }
        return key_value;
}

/*****************************key.h*****************************/
#ifndef _KEY_H
#define _KEY_H

#define KEY_0_read        GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)
#define KEY_1_read        GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)
#define KEY_2_read        GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)
#define KEY_wakeup_read        GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)

#define key_0_set 1
#define key_1_set 2
#define key_2_set 3
#define key_wakeup_set 4

extern void key_init(void);                                        //按键初始化函数
extern unsigned char key_scan(unsigned char mode);         //按键值获取函数

#endif

硬件连接如图:
01.png
问题描述:程序编译下载后,DS1常量,按键没有反应。
调试结果:如图
02.png
按理说:端口输出化完成以后,GPIOA.0为0,GPIOE.2,.3,.4为1,
但是结果是GPIOA.0为0,GPIOE.2,.3,.4只有GPIOE.2为1,其他为0。为什么?

我在调试过程中在key.c端口初始化完毕后,读端口电平,添加了一个Value变量,神奇的是,程序竟然能够正常运转了,我并没有调用Value这个变量,
添加变量后代码如下:
/*****************************key.c*****************************/
void key_init(void)
{
        volatile unsigned char Value;
        //使能外设时钟
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);

        //初始化按键WAKE_UP
        GPIO_InitTypeDef* KEY_wake_up;
        KEY_wake_up->GPIO_Mode = GPIO_Mode_IN;
        KEY_wake_up->GPIO_Pin = GPIO_Pin_0;
        KEY_wake_up->GPIO_PuPd = GPIO_PuPd_DOWN;
        KEY_wake_up->GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, KEY_wake_up);
       
        Value = KEY_wakeup_read;

        //初始化按键0,按键1和按键2
        GPIO_InitTypeDef* KEY_0_1_2;
        KEY_0_1_2->GPIO_Mode = GPIO_Mode_IN;
        KEY_0_1_2->GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;
        KEY_0_1_2->GPIO_PuPd = GPIO_PuPd_UP;
        KEY_0_1_2->GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOE, KEY_0_1_2);
       
        Value = KEY_0_read;
}


调试结果如下:
03.png
初始化竟然正常了,这是为何?
请各位大神指教,不胜感激。
最后我的KEIL中仿真时,Peripherals选项卡下没有general purpose I/O窗口,这个应如何设置?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
babett
1楼-- · 2019-07-20 10:35
 精彩回答 2  元偷偷看……
1208
2楼-- · 2019-07-20 13:59
帮顶
正点原子
3楼-- · 2019-07-20 17:25
仿真找问题
babett
4楼-- · 2019-07-20 22:50
 精彩回答 2  元偷偷看……

一周热门 更多>