OpenEdv-开源电子网

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

求助 精英版按键KEY_UP未识别

[复制链接]

8

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
116
金钱
116
注册时间
2017-7-3
在线时间
30 小时
发表于 2017-7-25 18:57:15 | 显示全部楼层 |阅读模式
8金钱
#include "stm32f10x.h"
#include "stm32_eval.h"
#include "led.h"
#include "key.h"
#include "usart.h"
#include <stdio.h>

#ifdef __GNUC__
  /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
     set to 'Yes') calls __io_putchar() */
  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
       
int main(void)
{
        unsigned char key;
        Myusart_Init();
        LED_Init();
        KEY_Init();
       
        while (1)
        {               
                key = Key_Scan();
                switch(key)
                {
                        case '1': GPIO_ResetBits(GPIOB, GPIO_Pin_5);//Led1亮起 led0熄灭
                                                                GPIO_SetBits(GPIOE, GPIO_Pin_5);
                                                                break;
                       
                        case '2':
                                                                break;
                       
                        case '3': GPIO_ResetBits(GPIOE, GPIO_Pin_5);//反之
                                                                GPIO_SetBits(GPIOB, GPIO_Pin_5);
                                                                break;
                       
                        case '0':
                                                                break;
                }
                       
        }
       
}





PUTCHAR_PROTOTYPE
{
  /* Place your implementation of fputc here */
  /* e.g. write a character to the USART */
  USART_SendData(EVAL_COM1, (uint8_t) ch);

  /* Loop until the end of transmission */
  while (USART_GetFlagStatus(EVAL_COM1, USART_FLAG_TC) == RESET)
  {}

  return ch;
}





#include "key.h"
#include "led.h"
#include "usart.h"
#include <stdio.h>

void KEY_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;


        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOA,ENABLE);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
        GPIO_Init(GPIOE, &GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
}
//PA0 = key1; PE3 = key2; PE4 = key3;

void delay_ms(u16 time)//12MHz晶振延时函数
{   

   u16 i=0;  
   while(time--)
   {
                 i=12000;
                while(i--) ;   
         }
}

unsigned char Key_Scan(void)
{       
        //判断按键按了哪个
        if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) == KEY_ON )//key1 按下
        {
                delay_ms(10);
                if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) == KEY_ON )
                {
                                printf("done\r\n");
                                while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) == KEY_ON);       
                                return  key1;
                }
        }
        else if (GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3) == KEY_ON )//key2 按下
        {
                delay_ms(10);
                if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3) == KEY_ON )
                {
                                printf("done\r\n");
                                while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3) == KEY_ON);
                                return  key2;
                }
        }
        else if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4) == KEY_ON )//key3 按下
        {
                delay_ms(10);
                if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4) == KEY_ON )
                {
                        printf("done\r\n");
                                while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4) == KEY_ON);
                                GPIO_ResetBits(GPIOE, GPIO_Pin_5);//led0亮起
                                return key3;
                }
        }
       
        return 0;
}




#ifndef __KEY_H
#define __KEY_H
#include "stm32f10x.h"

#define key1  1
#define key2  2
#define key3  3
#define KEY_ON 0
#define KEY_OFF 1

void KEY_Init(void);
unsigned char Key_Scan(void);
void delay_ms(u16 time);

#endif

如题。。。另外两个按键按下去都能识别 不知道为什么WK_UP(PA0)无法识别 求解答我哪里出错了


最佳答案

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

精英版上WK_UP(PA0) 按下去 是置高(自己找原理图看), 你这里写的 if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) == KEY_ON )//key1 按下 又定义#define KEY_ON 0 是有问题的。 而且初始化的时候要把PA0下拉,不然是有问题的。 你可以 对照着按键例程学习。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

163

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2762
金钱
2762
注册时间
2017-5-17
在线时间
430 小时
发表于 2017-7-25 18:57:16 | 显示全部楼层
精英版上WK_UP(PA0) 按下去 是置高(自己找原理图看), 你这里写的   if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) == KEY_ON )//key1 按下    又定义#define KEY_ON 0    是有问题的。  而且初始化的时候要把PA0下拉,不然是有问题的。    你可以 对照着按键例程学习。
回复

使用道具 举报

8

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
116
金钱
116
注册时间
2017-7-3
在线时间
30 小时
 楼主| 发表于 2017-7-25 23:07:40 | 显示全部楼层
39035605 发表于 2017-7-25 18:57
精英版上WK_UP(PA0) 按下去 是置高(自己找原理图看), 你这里写的   if(GPIO_ReadInputDataBit(GPIOA,GPI ...

3Q 照你说的调成下拉输入 if条件调成KEY_OFF就好了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-12-23 12:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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