OpenEdv-开源电子网

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

小白 按键扫描程序求大神帮助 key0按下灯一直亮,key_up按下没反应

[复制链接]

1

主题

5

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2020-7-6
在线时间
6 小时
发表于 2020-7-19 19:44:12 | 显示全部楼层 |阅读模式
1金钱
下面是key.c
#include"key.h"
#include"delay.h"
void KEY_Init(void)
{
         GPIO_InitTypeDef   GPIO_InitStruct ;
         RCC_AHB1PeriphClockCmd (RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOE,ENABLE);
         GPIO_InitStruct.GPIO_Pin=GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;
         GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN ;
//         GPIO_InitStruct.GPIO_OType=GPIO_OType_PP ;
         GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_UP ;
//         GPIO_InitStruct.GPIO_Speed=GPIO_Fast_Speed ;
         GPIO_Init (GPIOE,&GPIO_InitStruct);
       
         GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0;
         GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN ;
//         GPIO_InitStruct.GPIO_OType=GPIO_OType_PP ;
         GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_DOWN ;
//         GPIO_InitStruct.GPIO_Speed=GPIO_Fast_Speed ;
         GPIO_Init (GPIOA,&GPIO_InitStruct);       
}


u8 KEY_Scan(void)
{
        static u8 key_up=1;
        if (key_up&&(KEY0==0||KEY1==0||KEY2==0||WK_UP==1))
        {
                delay_ms(10);
                key_up=0;
                if(KEY0==0)
                        {
                                return 1;
                        }
                else if(KEY1==0)
                        {
                                return 2;
                        }
                else if(KEY2==0)
                        {       
                                return 3;
                        }       
                else if(WK_UP==1)
                        {       
                                return 4;
                        }
        }
        else if(KEY0==1&&KEY1==1&&KEY2==1&&WK_UP==0)
       
        {       
                 key_up=1;
                return 0;
        }       
       
//        else
//               
//                return 0;
}


下面是key.h
#ifndef __KEY_H
#define __KEY_H
#include"stm32f4xx.h"




#define KEY0  GPIO_ReadInputDataBit (GPIOE,GPIO_Pin_4)
#define KEY1 GPIO_ReadInputDataBit (GPIOE,GPIO_Pin_3)
#define KEY2  GPIO_ReadInputDataBit (GPIOE,GPIO_Pin_2)
#define WK_UP  GPIO_ReadInputDataBit (GPIOA,GPIO_Pin_0)


#define KEY0_PRES 1
#define KEY1_PRES 2
#define KEY2_PRES 3
#define WK_UP_PRES 4




void KEY_Init(void);
u8 KEY_Scan(void);

#endif
下面是main.c
#include"stm32f4xx.h"
#include"beep.h"
#include"delay.h"
#include"usart.h"
#include"led.h"
#include"key.h"




int main(void)
{
        u8 key;
        delay_init(168);
        LED_Init();
        BEEP_Init();
        KEY_Init();
//    u8 KEY_Scan();
//        GPIO_SetBits(GPIOF,GPIO_Pin_9|GPIO_Pin_10);
        while (1)
        {
                key=KEY_Scan();
                if(key)
                {
                        switch(key)
                        {
                                case KEY0_PRES:
//                                        GPIO_SetBits(GPIOF,GPIO_Pin_9|GPIO_Pin_10);
                                    GPIO_ResetBits(GPIOF,GPIO_Pin_9|GPIO_Pin_10);
                                        break;
                                       
                                case KEY1_PRES:
                                        GPIO_ResetBits(GPIOF,GPIO_Pin_8);
                                        break;
                               
                                case KEY2_PRES:
               
                                        GPIO_SetBits(GPIOF,GPIO_Pin_8);
                               
                                        break;
                               
                                case WK_UP_PRES:
//                                        GPIO_ResetBits(GPIOF,GPIO_Pin_9|GPIO_Pin_10);
                                        GPIO_SetBits(GPIOF,GPIO_Pin_9|GPIO_Pin_10);
//                                delay_ms(500);
                                        break;
                                                       
                                       
                        }
                }
                else delay_ms(10);
        }
       
       
       
}





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

使用道具 举报

6

主题

412

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
2692
金钱
2692
注册时间
2019-8-14
在线时间
413 小时
发表于 2020-7-20 14:48:20 | 显示全部楼层
你是啥板子的 参考原子的按键历程看看呀
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2020-7-6
在线时间
6 小时
 楼主| 发表于 2020-7-20 16:10:51 | 显示全部楼层
EVahl 发表于 2020-7-20 14:48
你是啥板子的 参考原子的按键历程看看呀

f407探索者,查看了,没看出啥区别来
回复

使用道具 举报

0

主题

12

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2021-12-14
在线时间
7 小时
发表于 2021-12-23 10:32:19 | 显示全部楼层
                               case WK_UP_PRES:
//                                        GPIO_ResetBits(GPIOF,GPIO_Pin_9|GPIO_Pin_10);
                                        GPIO_SetBits(GPIOF,GPIO_Pin_9|GPIO_Pin_10);                           这里写错了吧,应该是GPIOA
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-26 09:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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