求助 精英版按键KEY_UP未识别

2019-08-16 20:09发布

#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 ");
                                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 ");
                                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 ");
                                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条回答
39035605
1楼-- · 2019-08-16 23:24
精英版上WK_UP(PA0) 按下去 是置高(自己找原理图看), 你这里写的   if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) == KEY_ON )//key1 按下    又定义#define KEY_ON 0    是有问题的。  而且初始化的时候要把PA0下拉,不然是有问题的。    你可以 对照着按键例程学习。
Zapateado
2楼-- · 2019-08-17 01:55
39035605 发表于 2017-7-25 18:57
精英版上WK_UP(PA0) 按下去 是置高(自己找原理图看), 你这里写的   if(GPIO_ReadInputDataBit(GPIOA,GPI ...

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

一周热门 更多>