打印

按键返回值带入不了main函数中

[复制链接]
772|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
bestdesign11|  楼主 | 2021-1-25 11:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我在key.h中定义如下函数,
#define KEY0     GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3)
其中GPIO_ReadInputDataBit有返回值,但是程序执行的时候不能给KEY0赋值.大家帮忙看看为什么? 能看到按键按下的时候bitstatus被赋值为:Bit_RESET,但是不能赋值到KEY0.
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
  uint8_t bitstatus = 0x00;

  /* Check the parameters */
  assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
  assert_param(IS_GET_GPIO_PIN(GPIO_Pin));

  if ((GPIOx->IDR & GPIO_Pin) != (uint32_t)Bit_RESET)
  {
    bitstatus = (uint8_t)Bit_SET;
  }
  else
  {
    bitstatus = (uint8_t)Bit_RESET;
  }
  return bitstatus;

使用特权

评论回复

相关帖子

沙发
ifxz0123| | 2021-1-25 11:34 | 只看该作者
本帖最后由 ifxz0123 于 2021-1-25 11:40 编辑

你的KEY0是宏定义,KEY0 等价于 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3),这个一个函数调用,你怎么能直接赋值。你个应该定义一个变量,来保存函数的返回值。
例:
uint16_t key_value;
key_value = KEY0;

key_value =GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3);

看到你那个扫描按键的帖子里,STM32F103,M3内核的MCU是有位带操作功能的,M0的MCU好像不带这功能,你是不是把它搞混了

使用特权

评论回复
板凳
bestdesign11|  楼主 | 2021-1-25 11:44 | 只看该作者
好的,明白了,多谢楼上

使用特权

评论回复
地板
海洋无限| | 2021-1-25 12:39 | 只看该作者
bestdesign11 发表于 2021-1-25 11:44
好的,明白了,多谢楼上

使用特权

评论回复
5
bestdesign11|  楼主 | 2021-1-25 14:59 | 只看该作者
ifxz0123 发表于 2021-1-25 11:34
你的KEY0是宏定义,KEY0 等价于 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3),这个一个函数调用,你怎么能直 ...

我看103中的位带操作不是这样的,提到了_HAL操作.请问HAL库操作不是函数调用吗?可以在宏定义里赋值?
//下面的方式是通过直接操作HAL库函数方式读取IO
#define KEY0        HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_5)  //KEY0按键PC5

使用特权

评论回复
6
xyz549040622| | 2021-1-25 23:43 | 只看该作者
即使宏定义了,你这个只能放到等号右边,给另一个变量赋值,不能直接观察他,他本质上就是一个返回值

使用特权

评论回复
7
bestdesign11|  楼主 | 2021-1-26 09:12 | 只看该作者
如下是例程的具体内容,看看这样是否对?就是KEY0,KEY1等的用法
#include "key.h"
#include "delay.h"
//////////////////////////////////////////////////////////////////////////////////         
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//All rights reserved                                                                          
//////////////////////////////////////////////////////////////////////////////////

//按键初始化函数
void KEY_Init(void)
{
    GPIO_InitTypeDef GPIO_Initure;
   
    __HAL_RCC_GPIOA_CLK_ENABLE();           //开启GPIOA时钟
    __HAL_RCC_GPIOC_CLK_ENABLE();           //开启GPIOC时钟

   
    GPIO_Initure.Pin=GPIO_PIN_0;            //PA0
    GPIO_Initure.Mode=GPIO_MODE_INPUT;      //输入
    GPIO_Initure.Pull=GPIO_PULLDOWN;        //下拉
    GPIO_Initure.Speed=GPIO_SPEED_HIGH;     //高速
    HAL_GPIO_Init(GPIOA,&GPIO_Initure);
   
        GPIO_Initure.Pin=GPIO_PIN_15;                         //PA15
    GPIO_Initure.Pull=GPIO_PULLUP;          //上拉
    HAL_GPIO_Init(GPIOA,&GPIO_Initure);
   
        GPIO_Initure.Pin=GPIO_PIN_5;                         //PC5
    GPIO_Initure.Pull=GPIO_PULLUP;          //上拉
    HAL_GPIO_Init(GPIOC,&GPIO_Initure);
}

//按键处理函数
//返回按键值
//mode:0,不支持连续按;1,支持连续按;
//0,没有任何按键按下
//1,WKUP按下 WK_UP
//注意此函数有响应优先级,KEY0>KEY1>KEY2>WK_UP!!
u8 KEY_Scan(u8 mode)
{
    static u8 key_up=1;     //按键松开标志
    if(mode==1)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;   //无按键按下
}

使用特权

评论回复
8
数据采集存储| | 2021-2-19 18:33 | 只看该作者
看到楼上的代码,熟悉了,了解了。

使用特权

评论回复
9
盾视工作室| | 2023-2-23 18:41 | 只看该作者
uint8_t KEY_Scan(uint8_t mode)//按键按下函数
{         
        static uint8_t key_up=1;//按键按松开标志
        if(mode==1)key_up=1;  //支持连按                  
        if(key_up&&(KEY_PWR==0||KEY_BEEP==0||KEY_IV==0))
        {
                Delay_ms(20);//去抖动
                key_up=0;
                if(KEY_PWR==0)
    return K_PWR;
                else if(KEY_BEEP==0)return K_BEEP;
                else if(KEY_IV==0)return K_IV;
        }else if(KEY_PWR==1&&KEY_BEEP==1&&KEY_IV==1)key_up=1;             
        return 0;// 无按键按下
}
void Key_key(void)
{
                static uint8_t key=0;      
         extern  uint16_t Lmd;//extern是指另处有申明此变量

        key=KEY_Scan(0);        //得到键值
                   if(key)
                {                                                  
                        switch(key)
                        {                                 
                                case K_PWR:        //控电源
                                MTR_off();        //关机                       
                                        break;
                               



我这上面想长按开关机代码要怎么改,求指点下,找了好多参考资料没明白

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

32

主题

262

帖子

1

粉丝